Skip to content

Commit 5d0b550

Browse files
authored
Merge pull request #445 from ATQQ/cursor/analyze-blogpress-build-1bf0
build: blogpress 构建切换到 rolldown-vite(约 -23% 总耗时)
2 parents bac39c4 + 34b7e7b commit 5d0b550

21 files changed

Lines changed: 840 additions & 495 deletions

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# blogpress 构建耗时分析与优化报告
2+
3+
> 目标:分析 `packages/blogpress` 的生产构建(`pnpm build``vitepress build`)耗时分布,定位瓶颈并落地优化。
4+
5+
## 测量环境
6+
7+
|||
8+
|---|---|
9+
| CPU / 内存 | 4 vCPU / 15 GB |
10+
| Node | 22.14 |
11+
| pnpm | 10.33 |
12+
| Markdown 文件数 | 563 |
13+
| VitePress | 2.0.0-alpha.17 |
14+
15+
## 测量方法
16+
17+
除使用 `pnpm build` 取总耗时外,还通过 VitePress 的编程式 `build()` API + 注入一个临时 Vite 计时插件,拿到 **阶段级**(client 打包 / server 打包 / 渲染 / sitemap / RSS / pagefind)的精确耗时。
18+
19+
VitePress build 流程:`bundle()`(先 client 后 server,**串行**)→ `rendering pages`(SSR 渲染所有页)→ `generateSitemap``buildEnd`(主题注入的 RSS + pagefind)。
20+
21+
## 基线(vite 5.4.19 / rollup)
22+
23+
- 首次冷构建(含 pnpm 开销):`real 27.5s`
24+
- 稳定构建:`build complete in 23.3s`
25+
26+
| 阶段 | 耗时 | 占比 |
27+
|---|---|---|
28+
| client 打包 (ssr=false) | 10.9s | 46% |
29+
| server 打包 (ssr=true) | 6.1s | 26% |
30+
| 渲染页面(SSR 563 页) | 3.6s | 15% |
31+
| pagefind 索引 | ~2.0–3.6s | 9–15% |
32+
| RSS(2 个 feed) | ~0.2s | <1% |
33+
| sitemap | ~0.18s | <1% |
34+
35+
**结论:打包(client + server)≈ 17s,占 72%,是绝对瓶颈,且两次打包串行执行。**
36+
37+
## 优化:切换 rolldown-vite
38+
39+
VitePress `2.0.0-alpha.17` 已原生支持 [rolldown-vite](https://vite.dev/guide/rolldown)。落地内容:
40+
41+
1.`package.json` 增加 pnpm override:`"vite": "npm:rolldown-vite@^7.3.1"`
42+
2. 增加 `oxc-minify` 依赖(rolldown 模式下 VitePress 要求)。
43+
3. 修复主题插件兼容性(见下)。
44+
45+
### 必要的兼容性修复
46+
47+
主题 `@sugarat/theme``coverImgTransform` 插件在 `moduleParsed` 钩子中读取 `info.ast`,而该行原本位于 `try`**之外**。rolldown 不支持 `ModuleInfo#ast`,访问该 getter 会直接抛出 `UNSUPPORTED: ModuleInfo#ast` 导致构建失败。
48+
49+
修复方式:将 `const ast = info.ast` 移入 `try` 块(`packages/theme/src/utils/node/vitePlugins.ts`)。该函数本就内置了基于 `info.code` 的正则回退,抛错后会自动走回退,封面相对路径图片功能保持正常。
50+
51+
### 优化后耗时(rolldown-vite 7.3.1 / rolldownVersion 1.0.0-beta.53)
52+
53+
- `build complete in 18.02s``real 18.8s`
54+
55+
| 阶段 | 基线 | rolldown-vite | 变化 |
56+
|---|---|---|---|
57+
| client 打包 | 10.9s | 8.5s | -22% |
58+
| server 打包 | 6.1s | 2.9s | **-52%** |
59+
| 打包合计 | 17.0s | 11.4s | **-33%** |
60+
| 渲染页面 | 3.6s | 3.5s | 持平 |
61+
| **总构建** | **23.3s** | **18.0s** | **约 -23%** |
62+
63+
## 后续可继续优化的方向(本次未实施)
64+
65+
1. **pagefind 索引按需化**~2–3.5s,约 10%):本地/预览构建可跳过中文搜索索引,仅正式发布构建执行。
66+
2. **渲染并发 `buildConcurrency`**:4 核下渲染为 CPU 受限,收益有限。
67+
3. **打包内容瘦身**:client 包是主成本来源(563 页 + 主题全量打包),可评估主题侧 `manualChunks` / `metaChunk` 策略,但侵入性较大、收益不确定,建议放在 rolldown 之后再评估。

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"eslint-plugin-todo-ddl": "^1.1.1",
6060
"javascript-stringify": "^2.1.0",
6161
"lint-staged": "^14.0.1",
62+
"oxc-minify": "^0.134.0",
6263
"prettier": "^3.0.3",
6364
"sass": "^1.97.1",
6465
"simple-git-hooks": "^2.9.0",
@@ -69,6 +70,9 @@
6970
"zx": "^5.3.0"
7071
},
7172
"pnpm": {
73+
"overrides": {
74+
"vite": "npm:rolldown-vite@^7.3.1"
75+
},
7276
"peerDependencyRules": {
7377
"ignoreMissing": [
7478
"@algolia/client-search",

packages/blogpress/.vitepress/blog-theme.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ export const blogTheme = getThemeConfig({
7676
inputPosition: 'top'
7777
},
7878
oml2d: {
79-
mobileDisplay: true,
80-
models: [
79+
model: [
8180
{
8281
path: 'https://oml2d-models.sugarat.top/Senko_Normals/senko.model3.json',
8382
},

packages/blogpress/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# 我的博客内容
22

3+
## 2.0.83
4+
5+
### Patch Changes
6+
7+
- Updated dependencies
8+
- @sugarat/theme@0.5.22
9+
310
## 2.0.82
411

512
### Patch Changes

packages/blogpress/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "blogpress",
33
"type": "module",
4-
"version": "2.0.82",
4+
"version": "2.0.83",
55
"private": true,
66
"license": "MIT",
77
"scripts": {

packages/create-theme/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @sugarat/create-theme
22

3+
## 0.0.101
4+
5+
### Patch Changes
6+
7+
- chore: update template theme version
8+
39
## 0.0.100
410

511
### Patch Changes

packages/create-theme/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sugarat/create-theme",
3-
"version": "0.0.100",
3+
"version": "0.0.101",
44
"description": "简约风的 Vitepress 博客主题,sugarat vitepress blog theme",
55
"author": "粥里有勺糖",
66
"license": "MIT",

packages/create-theme/public/template/docs/sop/component.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,23 +61,22 @@ const blogTheme = getThemeConfig({
6161
```
6262

6363
## oml2d - 看板娘集成
64-
* Type:[oml2dOptions](https://oml2d.hacxy.cn/api/interfaces/Options.html)
64+
* Type:[WidgetOptions](https://github.com/hacxy/l2d-widget)
6565

6666
为网站提供一个 Live2D 看板组件。
6767

6868
:::tip 一点说明
69-
通过内置 [oh-my-live2d](https://oml2d.hacxy.cn) 实现, 可以通过 `oml2d` 选项配置。
69+
通过内置 [l2d-widget](https://github.com/hacxy/l2d-widget) 实现, 可以通过 `oml2d` 选项配置。
7070

71-
通过这个能力可以快速加入并定制属于自己的看板娘, 开启只需要为其传递一个 [配置选项](https://oml2d.hacxy.cn/api/interfaces/Options.html) 即可
71+
通过这个能力可以快速加入并定制属于自己的看板娘, 开启只需要为其传递一个配置选项即可
7272
:::
7373

7474
以下是一个简单的使用示例,当模型加载成功时它将出现在您网站的左下角。
7575

7676
```ts
7777
const blogTheme = getThemeConfig({
7878
oml2d: {
79-
mobileDisplay: true,
80-
models: [
79+
model: [
8180
{
8281
path: 'https://registry.npmmirror.com/oml2d-models/latest/files/models/Senko_Normals/senko.model3.json'
8382
}
@@ -89,7 +88,7 @@ const blogTheme = getThemeConfig({
8988

9089
![](https://loclink-1259720482.cos.ap-beijing.myqcloud.com/image/%E5%BD%95%E5%B1%8F2024-03-11%2023.51.51.gif)
9190

92-
之后您还可以前往[配置选项](https://oml2d.hacxy.cn/options/Options.html)查阅更多自定义内容
91+
之后您还可以前往 [l2d-widget 文档](https://github.com/hacxy/l2d-widget) 查阅更多自定义内容
9392

9493
:::tip 版本说明
9594
由于时间原因,主题内置的版本不一定都是最新的,可以通过 `resolutions` 配置指定要使用的版本。
@@ -98,7 +97,7 @@ const blogTheme = getThemeConfig({
9897
```json
9998
{
10099
"resolutions": {
101-
"oh-my-live2d": "^0.17.0"
100+
"l2d-widget": "^0.1.0"
102101
}
103102
}
104103
```

packages/create-theme/public/template/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"serve": "vitepress serve docs"
1111
},
1212
"dependencies": {
13-
"@sugarat/theme": "^0.5.21"
13+
"@sugarat/theme": "^0.5.22"
1414
},
1515
"directories": {
1616
"doc": "docs"

packages/theme/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @sugarat/theme
22

3+
## 0.5.22
4+
5+
### Patch Changes
6+
7+
- feat: 替换看板娘底层依赖为 l2d-widget,并兼容旧的 `oml2d.models` 配置
8+
39
## 0.5.21
410

511
### Patch Changes

0 commit comments

Comments
 (0)