管理相依性
- 外部相依性來自 npm 註冊表,讓您能利用生態系統中寶貴的程式碼,更快速地建構應用程式和函式庫。
- 內部相依性讓您能在儲存庫內分享功能,大幅改善共享程式碼的可探索性和可用性。我們將在下一個指南中討論如何建構內部套件。
相依性安裝的最佳實務
在使用的位置安裝相依性
當您在儲存庫中安裝相依性時,您應該將其直接安裝在使用該相依性的套件中。套件的 package.json
將包含該套件需要的所有相依性。這對於外部和內部相依性皆適用。
小提示
請注意,您的套件管理器可能會選擇使用與套件不同的 node_modules 位置。
若要在多個套件中快速安裝相依性,您可以使用您的套件管理器
此實務有多項優點
- 改善清晰度:當套件的相依性列在其
package.json
中時,更容易了解套件所依賴的項目。在儲存庫中工作的開發人員可以一目瞭然地看到套件內使用的相依性。 - 提升彈性:在大型的單一儲存庫中,期望每個套件都使用相同版本的外部相依性可能不切實際。當許多團隊在同一個程式碼庫中工作時,由於大規模運作的現實情況,會有不同的優先順序、時間表和需求。透過將相依性安裝在使用它們的套件中,您可以讓您的
ui
團隊升級到最新版本的 TypeScript,而您的web
團隊可以優先發布新功能並稍後再升級 TypeScript。此外,如果您仍然希望讓相依性版本保持同步,您也可以這麼做。 - 更好的快取能力:如果您在儲存庫的根目錄中安裝過多的相依性,每當您新增、更新或刪除相依性時,您都會變更工作區根目錄,導致不必要的快取遺失。
- 修剪未使用的相依性:對於 Docker 使用者,Turborepo 的修剪功能可以從 Docker 映像中移除未使用的相依性,以建立更輕的映像。當相依性安裝在它們預期使用的套件中時,Turborepo 可以讀取您的鎖定檔,並移除您需要的套件中未使用的相依性。
根目錄中少量的相依性
遵循上面的第一個原則,將相依性安裝在它們使用的套件中,您會發現您自然會在工作區的根目錄中保留少量的相依性。
唯一屬於工作區根目錄的相依性是用於管理儲存庫的工具,而用於建構應用程式和函式庫的相依性則安裝在它們各自的套件中。在根目錄中安裝的一些合理相依性範例有 turbo
、husky
或 lint-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 生態系統的慣例來存取相依性模組。
讓相依性保持在相同版本
一些單一儲存庫維護者偏好透過規則讓所有套件的相依性保持在相同版本。有多種方法可以實現此目的
使用專用的工具
可以使用 syncpack
、manypkg
和 sherif
等工具來達成此特定目的。
使用您的套件管理器
您可以使用您的套件管理器,以一個指令更新相依性版本。
使用 IDE
您的 IDE 的重構工具可以一次在您儲存庫中的所有 package.json
檔案中尋找並取代相依性的版本。嘗試在 package.json
檔案上使用類似 "next": ".*"
的 regex,以尋找 next
套件的所有實例,並將它們取代為您想要的版本。完成後,請務必執行套件管理器的安裝指令以更新您的鎖定檔。
後續步驟
現在您已知道如何在工作區中有效地管理相依性,讓我們建立一個內部套件,以在您的單一儲存庫中作為相依性使用。
這對您有幫助嗎?