Turborepo logo

管理依賴項

  • 外部依賴項來自 npm 註冊表,讓您能從生態系統中運用有價值的程式碼,以更快速地建置應用程式和函式庫。
  • 內部依賴項讓您在儲存庫內部分享功能,大幅改善共用程式碼的可探索性和可用性。我們將在下一個指南中討論如何建置內部套件。
./apps/web/package.json
{
  "dependencies": {
    "next": "latest", // External dependency
    "@repo/ui": "*" // Internal dependency
  }
}

依賴項安裝的最佳實務

在依賴項使用的地方安裝它們

當您在儲存庫中安裝依賴項時,您應該將其直接安裝在使用它的套件中。套件的 package.json 將會包含套件所需的所有依賴項。這適用於外部和內部依賴項。

小知識: 

請注意,您的套件管理器可能會選擇使用與套件不同的 node_modules 位置

若要快速在多個套件中安裝依賴項,您可以使用您的套件管理器

終端機
npm install jest --workspace=web --workspace=@repo/ui --save-dev
npm 文件

這種做法有幾個好處

  • 提升清晰度:當套件的依賴項列在其 package.json 中時,更容易理解套件依賴於什麼。在儲存庫中工作的開發人員可以一目瞭然地看到套件內使用了哪些依賴項。
  • 增強彈性:在大型 monorepo 中,期望每個套件都使用相同版本的外部依賴項可能是不切實際的。當許多團隊在同一個程式碼庫中工作時,由於大規模運作的現實情況,將會出現不同的優先順序、時間表和需求。透過在使用它們的套件中安裝依賴項,您可以讓您的 ui 團隊升級到最新版本的 TypeScript,而您的 web 團隊可以優先處理新功能的發布,稍後再升級 TypeScript。此外,如果您仍然希望保持依賴項版本同步,您也可以這麼做
  • 更佳的快取能力:如果您在儲存庫的根目錄中安裝過多的依賴項,那麼每當您新增、更新或刪除依賴項時,您都會變更工作區根目錄,導致不必要的快取遺失。
  • 修剪未使用的依賴項:對於 Docker 使用者,Turborepo 的修剪功能可以從 Docker 映像檔中移除未使用的依賴項,以建立更輕量的映像檔。當依賴項安裝在它們預期的套件中時,Turborepo 可以讀取您的 lockfile 並移除您需要的套件中未使用的依賴項。

根目錄中少量的依賴項

遵循上述第一個原則在依賴項使用的地方安裝它們,您會發現您自然而然地在工作區的根目錄中只留下少量的依賴項。

唯一屬於工作區根目錄的依賴項是用於管理儲存庫的工具,而用於建置應用程式和函式庫的依賴項則安裝在其各自的套件中。一些適合安裝在根目錄中的依賴項範例包括 turbohuskylint-staged

管理依賴項

Turborepo 不管理依賴項

請注意,Turborepo 不在管理您的依賴項方面扮演任何角色,這項工作留給您選擇的套件管理器。

套件管理器負責處理諸如下載正確的外部依賴項版本、符號連結和解析模組等事項。本頁上的建議是工作區中管理依賴項的最佳實務,並非由 Turborepo 強制執行。

模組解析在套件管理器之間有所不同

套件管理器具有不同的模組解析演算法,這導致行為上的差異,這些差異可能難以預測。

在 Turborepo 文件中,我們根據套件管理器的預期行為提出了許多建議。我們關於如何處理依賴項的涵蓋範圍是盡力而為,您可能需要根據您的套件管理器或儲存庫的需求調整文件中說明的行為。

但是,如果您發現文件中的問題對於所有套件管理器或特定套件管理器而言似乎普遍不正確,請透過 GitHub Issue 告知我們,以便我們改進。

node_modules 位置

根據您選擇的套件管理器、版本、設定以及依賴項在工作區中的安裝位置,您可能會在工作區內的各種位置看到 node_modules 及其中的依賴項。依賴項可能位於根目錄 node_modules、套件的 node_modules 或兩者中。

只要您的腳本和任務能夠找到它們需要的依賴項,您的套件管理器就會正常運作。

在您的程式碼中參考 `node_modules`

工作區內 node_modules 的特定位置不是套件管理器的公開 API 的一部分。這表示直接參考 node_modules(例如 node ./node_modules/a-package/dist/index.js)可能是脆弱的,因為磁碟上依賴項的位置可能會隨著工作區周圍的其他依賴項變更而變更。

相反地,請盡可能依賴 Node.js 生態系統的慣例來存取依賴項模組。

保持依賴項在相同版本上

一些 monorepo 維護者傾向於根據規則將所有套件的依賴項保持在相同版本上。有幾種方法可以實現這一點

使用專門打造的工具

諸如 syncpackmanypkgsherif 等工具可用於此特定目的。

使用您的套件管理器

您可以使用您的套件管理器在一個命令中更新依賴項版本。

終端機
npm install typescript@latest --workspaces

使用 IDE

您的 IDE 的重構工具可以在您的儲存庫中的所有 package.json 檔案中一次性尋找並取代依賴項的版本。嘗試在 package.json 檔案上使用類似 "next": ".*" 的正規表示式,以尋找 next 套件的所有實例,並將它們取代為您想要的版本。完成後,請務必執行套件管理器的安裝命令以更新您的 lockfile。

後續步驟

現在您已經知道如何在工作區中有效地管理依賴項,讓我們建立一個內部套件,以便在您的 monorepo 中用作依賴項。