返回部落格

Turborepo 1.6

2022 年 10 月 21 日,星期五
Matt Pocock
姓名
Matt Pocock
X
@mattpocockuk
Greg Soltis
姓名
Greg Soltis
X
@gsoltis
Nathan Hammond
姓名
Nathan Hammond
Tom Knickman
姓名
Tom Knickman
X
@tknickman
Anthony Shew
姓名
Anthony Shew
X
@anthonysheww
Jared Palmer
姓名
Jared Palmer
X
@jaredpalmer
Mehul Kar
姓名
Mehul Kar
X
@mehulkar
Chris Olszewski
姓名
Chris Olszewski

Turborepo 1.6 為 Turborepo 帶來了變革 - 你現在可以在任何專案中使用它。

立即執行 npm install turbo@latest 來更新。

任何程式碼庫都可以使用 Turborepo

Turborepo 有助於加速程式碼庫中的任務。到目前為止,我們專門為單體倉庫(包含多個應用程式和套件的程式碼庫)建構了 Turborepo。

Turborepo 在單體倉庫中非常棒,因為它們有許多任務要處理。每個套件和應用程式都需要建置、檢查程式碼風格和測試。

但我們開始思考:許多不是單體倉庫的程式碼庫會執行大量的任務。大多數 CI/CD 流程會執行許多重複的工作,而這些工作可以從快取中受益。

因此,我們很高興地宣布,任何程式碼庫現在都可以使用 Turborepo

立即嘗試從範例開始,或將 Turborepo 新增到現有專案中

將 Turborepo 新增到你的專案

  1. 安裝 turbo
終端機
npm install turbo --save-dev
  1. 在你的新程式碼庫的根目錄新增一個 turbo.json 檔案
./turbo.json
{
  "pipeline": {
    "build": {
      "outputs": [".next/**", "!.next/cache/**"]
    },
    "lint": {
      "outputs": []
    }
  }
}
  1. 嘗試使用 turbo 執行 buildlint
終端機
turbo build lint

恭喜 - 你剛剛使用 turbo 執行了你的第一個建置。你可以嘗試

我應該在什麼時候使用 Turborepo?

Turborepo 可用於非單體倉庫,這開闢了許多新的使用案例。但它在什麼時候最能發揮作用呢?

當腳本彼此依賴時

你應該使用 turbo 來執行你的 package.json 腳本。如果你的多個腳本都相互依賴,你可以將它們表示為 Turborepo 任務

turbo.json
{
  "pipeline": {
    "build": {
      "outputs": ["dist/**"]
    },
    "lint": {
      // 'build' should be run before 'lint'
      "dependsOn": ["build"]
    },
    "test": {
      // 'build' should be run before 'test'
      "dependsOn": ["build"]
    }
  }
}

然後,你可以執行

終端機
turbo run lint test

因為你已表示 build 應該在 linttest 之前執行,所以當你執行 linttest 時,它會自動為你執行 build

不僅如此,它還會為你找出最佳的排程。前往我們關於最佳化速度的核心概念文件。

當你想要並行執行任務時

假設你正在執行一個Next.js 應用程式,同時也在執行Tailwind CLI。你可能有兩個腳本 - devdev:css

package.json
{
  "scripts": {
    "dev": "next",
    "dev:css": "tailwindcss -i ./src/input.css -o ./dist/output.css --watch"
  }
}

無需在你的 turbo.json 中新增任何內容,你就可以執行

終端機
turbo run dev dev:css

就像 concurrently 之類的工具一樣,Turborepo 會自動並行執行這兩個腳本。

這對於開發模式非常有用,但也可以用於加速 CI 上的任務 - 假設你有許多腳本要執行

終端機
turbo run lint unit:test e2e:test integration:test

Turborepo 會找出並行執行所有任務的最快方法。

現在 npm 也支援修剪

在過去的幾個版本中,我們一直在為不同的工作區管理器新增對turbo prune 的支援。這一直是一個挑戰 - turbo prune 會建立你的單體倉庫的子集,包括修剪你的鎖定檔案中的依賴項。這意味著我們必須分別為每個工作區管理器實作邏輯。

我們很高興地宣布,turbo prune 現在適用於 npm,完成了對所有主要套件管理器的支援。這表示如果你的單體倉庫使用 npmyarnyarn 2+pnpm,你就可以輕鬆部署到 Docker。

查看我們之前關於 turbo prune 的部落格,以了解更多資訊。

快取中的效能改進

在 1.6 之前,Turborepo 的本地快取是系統上檔案的遞迴複製到磁碟上的另一個位置。這很。這意味著對於我們需要快取的每個檔案,我們需要執行六個系統呼叫:在來源檔案上開啟、讀取和關閉;在目標檔案上開啟、寫入和關閉。

在 1.6 中,我們將其縮減了將近一半。現在,在建立快取時,我們建立一個單一的 .tar 檔案(一個開啟),我們以 1MB 的區塊寫入它(批次寫入),然後關閉它(一個關閉)。系統呼叫的減半會在快取返回時發生。

而且我們並沒有止步於此。在過去的一個月中,我們在我們的建置工具鏈中投入了大量資金,以啟用 CGO,這可以解鎖使用以 C 語言編寫的最佳類別程式庫。這使我們能夠採用Zstandardlibzstd 進行壓縮,這為我們帶來了演算法上的 3 倍壓縮效能提升。

經過所有這些變更之後,我們經常看到本地快取建立的效能提升超過 2 倍,而遠端快取建立的效能提升超過 3 倍。你的程式碼庫越大,或者你的裝置速度越慢(說的是你,CI),這種情況就越好。這表示我們能夠準確地為最需要它的人提供效能提升。