2026 年前端避坑對照表:
遠端 Mac 上 Rspack 與 esbuild 大型倉冷啟動、增量快取與 worker 併發驗收
在大型 Monorepo與遠端 Mac Runner上,Rspack 的 filesystem 快取與 esbuild 的極速全量管線常被並列討論,但兩者的冷啟動、增量命中與 worker 併發語意不同;踩坑點在於快取目錄被 clean 掉、設定變更未納入 buildDependencies,以及多工具鏈同機搶滿 CPU/記憶體。本文給可複製的對照表與參數驗收列。延伸:Vite/Webpack 建置快取、Turborepo 遠端快取、Tailwind/PostCSS 記憶體與 worker。
發布前三步驗收(可貼進 PR):
- 第一步:在「清快取冷啟」與「保留
node_modules/.cache/專案快取目錄」兩種條件下各跑一次主建置,耗時與結束代碼寫入 CI 摘要;Rspack 需確認第二次明顯快於第一次。 - 第二步:產物目錄或 bundle 雜湊與上一穩定版可 diff;禁止僅以「建置成功」作為唯一門檻。
- 第三步:最小冒煙(關鍵路由/API)通過後再晉級;必要時與部署前冒煙清單併跑。
① 場景與基準
對照前請先固定四項基準:Node 小版本、lockfile、是否啟用 source map、遠端工作目錄是否在網路卷。遠端 Mac 上網路磁碟會放大快取寫入成本,若「命中快取仍慢」,先量測快取目錄的寫入延遲再調整快取路徑到本機磁碟。建置指令應與 CI 一致,避免本機用 dev、CI 用 production 導致快取鍵無效。
② Rspack vs esbuild 適用邊界
Rspack適合需要webpack 生態插件鏈、長期在 CI 上反覆增量建置的應用專案;透過 cache: { type: 'filesystem' } 可把模組解析與建置結果落到磁碟。esbuild適合函式庫打包、極短迴圈的單次 bundle與工具鏈前置步驟;單次 CLI/API 建置沒有與 Rspack 同級的內建持久化模組快取,持久化應交由 Turborepo/nx 任務層或產物快取。兩者同流水線併用時,務必限制總併發,避免 esbuild 與 Rspack 各自吃滿核心。
③ 冷啟動與增量對比表
| 維度 | Rspack(webpack 相容設定) | esbuild |
|---|---|---|
| 冷啟(無快取) | 首次全量;依專案體積與插件數顯著變長 | 通常仍偏快;瓶頸多在 I/O 與外層管線 |
| 增量/持久化 | cache.type: 'filesystem';依 buildDependencies 失效 |
單次建置預設不寫模組級持久快取;靠上層任務快取 |
| 典型快取目錄 | node_modules/.cache/rspack 或自訂 cache.cacheDirectory |
可快取 node_modules、dist、turbo/nx 產物目錄 |
| 併發語意 | 內建多模組平行;與 loader/plugin 疊加需監控 RSS | Go runtime 多核並行;與 Node 側其他 worker 分開算總帳 |
| 可執行項 | 建議寫法/開關 | 驗收要點 |
|---|---|---|
| 持久化快取(Rspack) | cache: { type: 'filesystem', buildDependencies: { config: [__filename] } } |
改設定檔後首跑可接受變慢;隨後恢復增量 |
| 快取目錄 | cacheDirectory: path.resolve(__dirname, 'node_modules/.cache/rspack') |
目錄體積隨建置增長;納入 CI cache key |
| NODE_OPTIONS | NODE_OPTIONS=--max-old-space-size=8192(大倉可升至 12288) |
建置過程無 JavaScript heap out of memory |
| Node 執行緒池(選用) | UV_THREADPOOL_SIZE=16(僅在重 I/O 且已驗證時) |
不因過大導致上下文切換惡化 |
| 併發預留 | 同機 Rspack + 測試 + CSS:總 worker ≤ CPU−(1~2) | CPU 不長期 100% 抖動、快取命中率穩定 |
| esbuild 外層快取 | Turborepo --remote-cache 或快取 dist/ 任務輸出 |
任務鍵含 lockfile 與輸入檔案集 |
④ 遠端 Mac 磁碟與記憶體閾值
實務上建議把快取與中間產物放在本機 SSD,並監控下列經驗閾值(依團隊基線調整):單一 Rspack 快取目錄長期膨脹超過數 GB且命中率仍低,應檢查是否把易變檔案誤列入 buildDependencies;建置 RSS 峰值接近 --max-old-space-size 的九成時應提高堆積或拆包建置。磁碟剩餘空間若低於約 15~20%,filesystem cache 寫入與 GC 會互相拖累,應排程清理過期快取或改短 TTL 策略。
⑤ 發布前三步驗收 FAQ
問:CI 每次都刪除工作目錄,Rspack 快取還有用嗎?
答:有用,前提是將 cacheDirectory(或整個 node_modules/.cache)納入 actions/cache 或遠端快取後端;否則每次都是冷啟。
問:esbuild 管線要不要也設 NODE_OPTIONS?
答:若 esbuild 外層還有 TypeScript、postcss 等 Node 步驟,仍建議統一設堆積上限;純 esbuild 子行程通常較不吃 Node 堆積,但整條腳本仍以一次 OOM 實測為準。
問:如何向非工程職務報告「這版沒變慢」?
答:在 PR 模板固定貼冷啟秒數、命中秒數、快取目錄大小三欄,比口頭描述可稽核。
若你正在為 2026 年大型倉庫導入 Rspack 或收斂 esbuild 子任務,建議以本文對照表先鎖定快取目錄、filesystem 開關、NODE_OPTIONS 與併發預留,再在遠端 Mac 上跑一輪冷啟/命中對照;穩定的硬體與網路環境比單次調參更能降低排錯成本。歡迎直接前往 購買頁 選擇適合的遠端 Mac 方案,把建置與真機驗證從「偶發慢」變成「可預期、可稽核」。