Files
claude-code/docs/performance-reporter.md
claude-code-best dab04af7c9 perf: Vite 构建启用 code splitting,Bun RSS 从 966MB 降至 35MB
Bun/JSC 全量解析单文件大 JS 的 bytecode 和 JIT,17MB 产物导致
RSS 暴涨至 ~1GB(Node/V8 懒解析仅需 ~220MB)。启用代码分割后
Bun 按需加载 chunk,--version RSS 35MB,完整加载 ~500MB。

改动:
- vite.config.ts: 移除 codeSplitting:false,添加 chunkFileNames
- post-build.ts: 遍历 dist/ + dist/chunks/ 所有文件做 Bun patch
- 新建 distRoot.ts 共享工具函数,统一路径定位逻辑
- ripgrep.ts/computerUse/setup.ts/claudeInChrome/setup.ts/updateCCB.ts:
  用 distRoot 替换内联 import.meta.url 路径推算
2026-05-21 16:36:27 +08:00

3.0 KiB
Raw Blame History

内存占用 1G 调研报告

诊断 session a3593062 RSS 达 1.09 GB定位 Bun 运行时内存膨胀根因

数据收集

  • 诊断数据: RSS 1,118 MBV8 heap 84 MB原生内存缺口 1,034 MB92%
  • 构建方式: bun run build:vite → Vite/Rollup 单文件构建,产物 17MB dist/cli.js
  • Vite 配置: codeSplitting: falsevite.config.ts:97),所有代码内联为单文件
  • Node.js 对比: 相同 17MB 产物Node.js RSS 仅 223 MB--version/ 340 MB完整加载

探索与验证

已确认

问题 位置 说明
根因: Vite 单文件构建 + Bun 解析大文件内存效率低 vite.config.ts:97 codeSplitting: false 产出 17MB 单文件Bun/JSC 解析时 RSS 暴涨至 966MB
Node.js 对同等 17MB 文件仅需 223MB 实测 V8 对大文件解析的内存效率远优于 JSC
Bun.build 代码分割可解决问题 实测 bun run build(代码分割 → 627 chunkBun RSS 仅 30MB--version/ 318MB完整加载

已否认

  • 不是 feature flags 数量问题 — 全部 35 features 开启时,代码分割构建内存正常
  • 不是内存泄漏 — detachedContexts: 0activeHandles: 0
  • 不是原生 addon 问题 — vendor 文件仅 2.7MB
  • 不是 TypeScript 源码体量问题 — bun run dev(直接加载 TS完整路径仅 345MB

结论

根因是 Vite 构建配置 codeSplitting: false,产出 17MB 单文件Bun/JSC 解析单文件大 JS 时内存效率极差966MB vs Node 的 223MB

实测对比矩阵:

构建方式 产物结构 Bun RSS Node RSS Bun/Node
build:vite 17MB 单文件 966 MB 223 MB 4.3x
build:vite pipe mode 同上 1,088 MB 340 MB 3.2x
build (Bun) 627 chunk 30 MB 42 MB 0.7x
build (Bun) pipe mode 同上 318 MB 253 MB 1.3x
bun run dev TS 源码 动态加载 42 MB
bun run dev pipe mode 动态加载 345 MB

核心差异:

  • Node/V8 解析 17MB 文件只需 223MB — V8 的懒解析lazy parsing只编译入口需要的部分
  • Bun/JSC 解析 17MB 文件需要 966MB — JSC 对单文件做全量编译bytecode + JIT 占用大量原生内存
  • 代码分割后627 个小 chunkBun 按需加载,内存回到正常水平

建议

  1. 开启 Vite 代码分割 — 在 vite.config.ts 中启用 codeSplitting: true 或使用 Rollup 的 manualChunks 配置。这是最直接的修复
  2. 或切换到 Bun.buildbun run build 已默认启用代码分割(splitting: trueBun RSS 仅 30-318MB
  3. 如果必须单文件 — 考虑用 Node.js 运行 Vite 产物(node dist/cli-node.js),代价是失去 Bun 特有 API
  4. 验证 codeSplitting: false 的存在理由 — 注释说"all dynamic imports inlined",可能是为了简化部署。评估是否真的需要单文件