介紹
隨著 JavaScript monorepos 的成長,建置時間螺旋式上升,CI 管線飽和,開發人員生產力下降。由 Vercel 創建的 Turborepo 透過智慧型快取和平行任務執行來解決這些挑戰。與 Lerna 或 Nx 不同,Turborepo 專注於成為任務運行程式而不是建置工具,將編譯委託給 esbuild、webpack 和 tsc 等工具。
核心架構-快取系統
Turborepo 的快取是它的決定性特徵。快取鍵是根據文件內容、環境變數和依賴關係圖計算得出的。快取以 tar.gz 存檔形式存在於 node_modules/.cache/turbo 中,快取命中/未命中生命週期決定任務是執行還是跳過。
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**"],
"inputs": ["src/**/*.ts", "src/**/*.tsx"]
}
}
}
inputs 配置微調哪些檔案會影響快取粒度。 Turborepo 使用內容雜湊與 globalHash 進行根級更改,並使用每任務 hash 進行各個任務。在提交配置變更之前,使用 --dry-run 驗證快取行為。
透過管道配置進行任務編排
turbo.json 管路配置是任務編排的核心。任務依賴、輸出目錄、環境變數和持久性模式都在這裡定義。
{
"pipeline": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"] },
"lint": { "dependsOn": [], "outputs": [] },
"typecheck": { "dependsOn": ["^build"] }
}
}
拓樸排序策略確保包的依賴關係先於包本身構建,而 lint 和 typecheck 等獨立任務並行運行。對於不應該快取的任務使用 cache: false ,例如使用修復模式進行 linting。
遠端快取
遠端快取支援在團隊成員和 CI 代理程式之間共用建置工件。 Vercel 的遠端快取、自架 Turbo Server 和 S3 相容後端都是支援的。
| 特色 | Vercel 遠端快取 | 自架 | NX雲端 |
|---|---|---|---|
| 設定複雜性 | 低 | 中 | 低 |
| 成本 | 免費方案可用 | 基礎設施成本 | 付費等級 |
| 資料控制 | Vercel 管理 | 完全控制 | Nx 管理 |
| 授權 | 團隊代幣 | 客製化 | 整合代幣 |
驗證使用 TURBO_TOKEN 和 TURBO_TEAM 環境變數。基於環境的快取命名空間可防止跨環境緩存污染。
依賴圖優化
Turborepo 從 package.json 依賴項建構一個 DAG 並將其用於任務調度。 --filter 語法範圍運行到特定的套件及其依賴項,而 --graph 可視化依賴關係圖。
turbo run build --filter=@acme/web...
turbo run build --graph --output=graph.html
減少跨包依賴性、一致地使用工作區協定以及對相關包進行分組都有助於加快建置速度。
遷移策略
從 Lerna 遷移涉及將 lerna run 替換為 turbo run、新增 turbo.json 以及保留現有的 npm 腳本。從 Nx,將 Nx 執行器轉換為 turbo.json 中的 shell 指令。從自訂腳本中,識別並行化機會並將 shell 管道轉換為 turbo.json 條目。擁有 50 個或更多包的團隊在遷移後通常會發現 CI 時間減少了百分之六十到百分之八十。
結論
Turborepo 提供快速、正確且對開發人員友善的 monorepo 任務運行。對於使用 npm、pnpm 或 YARN 工作區且希望更快的 CI 而不採用完整建置系統的團隊來說,Turborepo 是一個絕佳的選擇。其開源特性、活躍的社群以及即將推出的基於守護程式的文件監視功能使其成為一項可靠的長期投資。

