Turborepo

建立內部程式碼包

內部程式碼包是您工作區的建構區塊,為您提供一個強大的方式,在您的程式碼庫中共享程式碼和功能。Turborepo 會自動理解內部程式碼包之間的關係,使用 package.json 中的依賴項,在底層建立一個程式碼包圖來優化您儲存庫的工作流程。

Visual representation of a Package Graph in a Turborepo.

讓我們使用程式碼包的結構章節和編譯的程式碼包模式中的指南,建立您的第一個內部程式碼包,以在您的程式碼庫中共享數學工具。在以下步驟中,我們假設您已使用 create-turbo 建立了一個新的儲存庫,或是使用結構相似的儲存庫。

建立一個空目錄

您需要一個目錄來放置程式碼包。我們在 ./packages/math 建立一個。

package.json
turbo.json

新增 package.json

接下來,為程式碼包建立 package.json。透過新增此檔案,您將滿足內部程式碼包的兩個要求,使其可被 Turborepo 和您工作區的其他部分發現。

./packages/math/package.json
{
  "name": "@repo/math",
  "type": "module",
  "scripts": {
    "dev": "tsc --watch",
    "build": "tsc"
  },
  "exports": {
    "./add": {
      "types": "./src/add.ts",
      "default": "./dist/add.js"
    },
    "./subtract": {
      "types": "./src/subtract.ts",
      "default": "./dist/subtract.js"
    }
  },
  "devDependencies": {
    "@repo/typescript-config": "*",
    "typescript": "latest"
  }
}

讓我們逐項分析這個 package.json

  • scriptsdevbuild 指令碼使用 TypeScript 編譯器編譯程式碼包。dev 指令碼將監視原始程式碼的變更,並自動重新編譯程式碼包。
  • devDependenciestypescript@repo/typescript-configdevDependencies,因此您可以在 @repo/math 程式碼包中使用這些程式碼包。在實際的程式碼包中,您可能會擁有更多 devDependenciesdependencies - 但現在我們可以保持簡單。
  • exports:為程式碼包定義多個進入點,以便在其他程式碼包中使用(import { add } from '@repo/math')。

值得注意的是,此 package.json 將內部程式碼包 @repo/typescript-config 宣告為依賴項。Turborepo 會將 @repo/math 識別為 @repo/typescript-config 的依賴項,以便排序您的任務。

新增 tsconfig.json

透過將 tsconfig.json 檔案新增到程式碼包的根目錄,來指定此程式碼包的 TypeScript 設定。TypeScript 具有extends,允許您在整個儲存庫中使用基本設定,並在需要時使用不同的選項覆寫。

./packages/math/tsconfig.json
{
  "extends": "@repo/typescript-config/base.json",
  "compilerOptions": {
    "outDir": "dist",
    "rootDir": "src"
  },
  "include": ["src"],
  "exclude": ["node_modules", "dist"]
}

您在這裡完成了四件重要的事情

  • 位於 ./packages/typescript-config 中的 @repo/typescript-config/base.json 設定具有您需要的所有設定,因此您會從它擴充。
  • compilerOptions 中的 outDir告訴 TypeScript 將編譯的輸出放置在哪裡。它符合 package.jsonexports 中指定的目錄。
  • compilerOptions 中的 rootDir確保 outDir 中的輸出使用與 src 目錄相同的結構。
  • 根據 TypeScript 規格includeexclude 鍵不會從基本設定繼承,因此您在此處包含它們。

還有更多關於 TypeScript 設定的知識需要學習,但這是一個好的開始。如果您想了解更多資訊,請造訪 官方 TypeScript 文件我們的 TypeScript 指南

新增包含原始程式碼的 src 目錄

您現在可以為您的程式碼包編寫一些程式碼。在 src 目錄中建立兩個檔案

./packages/math/src/add.ts
export const add = (a: number, b: number) => a + b;

這些檔案會對應到當您稍後執行 turbo build 時,tsc 將建立的輸出。

將程式碼包新增到應用程式

您已準備好在應用程式中使用新的程式碼包。讓我們將它新增到 web 應用程式。

apps/web/package.json
  "dependencies": {
+   "@repo/math": "*",
    "next": "latest",
    "react": "latest",
    "react-dom": "latest"
  },

您剛剛變更了儲存庫中的依賴項。請務必執行您的程式碼包管理員的安裝指令,以更新您的鎖定檔。

@repo/math 現在可以在 web 應用程式中使用,您可以在您的程式碼中使用它

apps/web/src/app/page.tsx
import { add } from '@repo/math/add';
 
function Page() {
  return <div>{add(1, 2)}</div>;
}
 
export default Page;

編輯 turbo.json

將新的 @repo/math 函式庫的成品新增到 turbo.jsonbuild 任務的 outputs。這可確保其建置輸出將由 Turborepo 快取,因此當您開始執行建置時,可以立即還原它們。

./turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**", "dist/**"]
    }
  }
}

執行 turbo build

如果您已全域安裝 turbo,請在您的工作區根目錄的終端機中執行 turbo build。您也可以使用您的程式碼包管理員從 package.json 執行 build 指令碼,這將使用 turbo run build

@repo/math 程式碼包在 web 應用程式建置之前建置,以便 ./packages/math/dist 中的執行階段程式碼在 web 應用程式捆綁時可用。

您可以再次執行 turbo build,以查看您的 web 應用程式在毫秒內重建。我們將在快取指南中詳細討論這一點。

內部程式碼包的最佳實務

每個程式碼包一個「用途」

當您建立內部程式碼包時,建議建立具有單一「用途」的程式碼包。這不是嚴格的科學或規則,而是一種最佳實務,取決於您的儲存庫、您的規模、您的組織、您的團隊的需求等等。此策略有幾個優點

  • 更容易理解:隨著儲存庫的規模擴大,在儲存庫中工作的開發人員將更容易找到他們需要的程式碼。
  • 減少每個程式碼包的依賴項:每個程式碼包使用較少的依賴項,使 Turborepo 可以更有效地修剪您的程式碼包圖的依賴項

一些範例包括

  • @repo/ui:一個包含所有共用 UI 元件的程式碼包
  • @repo/tool-specific-config:一個用於管理特定工具設定的程式碼包
  • @repo/graphs:一個用於建立和操作圖形資料的特定網域函式庫

應用程式程式碼包不包含共用程式碼

當您建立應用程式程式碼包時,最好避免將共用程式碼放入這些程式碼包中。相反地,您應該為共用程式碼建立一個單獨的程式碼包,並讓應用程式程式碼包依賴該程式碼包。

此外,應用程式程式碼包不應安裝到其他程式碼包中。相反地,它們應該被視為您程式碼包圖的進入點。

要知道

此規則有極少數例外情況

後續步驟

建立新的內部程式碼包後,您可以開始設定任務

小時

總計節省的運算量
開始使用
遠程快取 →

本頁內容