esbuild · SWC · Monorepo · 遠端 Mac · 2026
2026 年遠端 Mac 前端建置避坑:
esbuild 與 SWC 在 Monorepo 中的平行 worker、快取目錄與 Node 堆參數對照表
2026.04.11
前端/建置系統
約 7 分鐘閱讀
適用對象:在 pnpm/npm workspace 或 Turbo/Nx 內同時使用 Vite、Next.js 等會呼叫 esbuild 與 SWC 的團隊。租用的 遠端 Mac 常見痛點是:兩套原生編譯器各自開滿執行緒、快取目錄不一致、Node 端 OOM。以下對照 GOMAXPROCS/worker 數、cacheDir、NODE_OPTIONS 堆上限與增量建置開關,並附遠端 Runner 驗收步驟。內鏈:前端類技術見解列表、官網首頁、購買/租用(免登入);延伸可讀 Rspack × esbuild 快取與 worker 驗收。
01 為何 Monorepo 在遠端 Mac 上容易失控
Apple Silicon 單核很快,但 esbuild(Go) 與 SWC(Rust) 的預設平行度彼此不知道對方存在;再疊上 PostCSS、測試 worker 與型別檢查,CPU 會被「過度訂閱」,磁碟上的快取也容易被清機腳本掃到不同路徑而變冷。先對齊環境變數與快取根目錄,再量測冷/暖建置,否則 PR 上的耗時數字只是雜訊。
- 雙重平行:esbuild 受
GOMAXPROCS影響;SWC 常見以RAYON_NUM_THREADS或框架內建池控管,兩者需與 Turbo--parallel一起加總。 - 快取漂移:只備份
node_modules卻漏掉.turbo、.swc、.next/cache時,Runner 每次都像冷啟。 - 堆記憶體:source map 與 TS 程式仍在 Node;未設
NODE_OPTIONS時,OOM 會偽裝成「SWC 很慢」。
02 對照表:GOMAXPROCS/worker、cacheDir、堆、增量
下表當作 Runner 設定與工單貼上的「草稿欄位」;實際 CLI 名稱請以各框架文件為準。
| 層級 | GOMAXPROCS/worker 數 | cacheDir | NODE_OPTIONS 堆上限 | 增量建置開關 |
|---|---|---|---|---|
| esbuild(Go) | 共用遠端機建議 GOMAXPROCS 取實體核心減 1;與外層任務併發相乘前先在試算表加總。 |
二進位不持久化模組圖;固定外層如 node_modules/.cache/esbuild 或倉庫根 .cache/build,並列入還原快取的 artifact 白名單。 |
esbuild 本體不吃 V8 堆;若外層為 Node 外掛包裝,可設 NODE_OPTIONS=--max-old-space-size=6144 起跳再依 RSS 調整。 |
無單一全域 CLI 開關;增量由 bundler(如 Vite)或 API 模式+上層快取承擔。 |
| SWC(Rust) | 以 RAYON_NUM_THREADS 對齊可用 vCPU 並預留 1 給系統/sshd;Next/Turbopack 另遵守其內建執行緒池上限。 |
保留 .swc、.next/cache 於本機 NVMe;必要時以符號連結掛回工作目錄,避免清機掃到預設暫存外路徑。 |
與 TS 語意檢查或外掛併跑時常設 --max-old-space-size=8192;若 swap 抖動,應先降併發再升堆。 |
依框架啟用磁碟 AST/轉譯快取與 incremental;暖機驗收時勿手動刪快取目錄,以免誤判命中。 |
| Monorepo 編排(Turbo/Nx) | turbo run --parallel 與 GOMAXPROCS、RAYON_NUM_THREADS 對表後再壓上限;總執行緒建議低於邏輯核心數並保留 I/O 餘裕。 |
統一 TURBO_CACHE_DIR 或 NX_CACHE_DIRECTORY 單一路徑;與套件內快取分層但同一掛載點,便於備份與配額監控。 |
在 CI profile 或 ~/.zshrc 單點匯出 NODE_OPTIONS,避免巢狀腳本覆寫造成子程序堆不一致。 |
本地增量命中穩定後再啟遠端快取;命中率須能對照 lockfile 與設定檔雜湊,避免「命中假象」掩蓋壞設定。 |
可寫進工單的預設值(Apple Silicon Runner)
- 大型設計系統可先試 Node 堆 8 GB 上限,再以
sample/RSS 收斂。 - 總 worker 預留 至少 1 核 給桌面同步、防毒與磁碟 flush。
- NVMe 上暖機增量相對冷啟常可省 約三成至六成 牆鐘時間(視圖譜與快取鍵而定)。
03 遠端 Mac 驗收步驟
- 環境一致性:兩個 SSH 工作階段執行
env | sort,確認GOMAXPROCS、RAYON_NUM_THREADS、NODE_OPTIONS與快取根目錄相同後再比較分支。 - 快取證據:暖機建置應看到
cacheDir內檔案更新時間推進,且 Turbo/Nx 日誌出現命中;若永遠冷啟,先查是否每次 job 清空工作目錄。 - 資源競態:邊跑單元測試邊建置仍須落在團隊公布的牆鐘預算內;超出則縮併發或拆 job。
- 磁碟水位:
df -h;快取目錄合計超過可用空間約兩成時應 prune 過期分支或改掛更大碟。 - 交接附註:於發布說明貼上對照表列+冷/暖各一次耗時與 RSS 峰值,方便下一任維運對齊。
若調參後仍長時間排隊或記憶體觸頂,可改租獨享 vCPU 與 NVMe的遠端 Mac,讓快取保持熱狀態並縮短 CI 等待。
04 FAQ
提高 GOMAXPROCS 一定更快嗎?
超過實體核心後多為上下文切換成本;請與 SWC 執行緒與 Turbo 併發一起畫上限。
esbuild 與 SWC 要共用同一個 cacheDir 嗎?
內部格式不同,應分目錄;但放在同一父掛載點(例如 /Volumes/buildcache)便於備份與配額管理。
共用遠端主機上開增量安全嗎?
路徑隔離且快取鍵含 toolchain 版本時可行;升級 Node 或編譯器大版本後應主動失效快取再重跑冷啟基準。