Rush Stack商店部落格活動
跳至主要內容

NPM、PNPM 與 Yarn

在開始安裝 JavaScript 程式庫之前,您需要選擇要使用的套件管理器。(我們的社群喜歡彈性和選擇,因此當然不只有一個!)Rush 支援三種最熱門的套件管理器。依時間順序排列如下:

  • NPM:此工具開創了當今大多數 JavaScript 套件管理器使用的封裝標準和登錄協定。此工具的開發人員也維護 npmjs.com 登錄,這目前是最熱門的發佈開源 JavaScript 程式庫的地方。

  • Yarn:NPM 工具的完整重寫版本,保留相同的安裝模型,但承諾更快的安裝速度、更好的可靠性以及一些很棒的新功能(例如 Yarn 工作區),這些功能有助於大規模開發。

  • PNPM:一種全新的安裝模型,可解決「虛擬依賴」和「NPM 分身」的問題,同時巧妙地利用符號連結,以保持與 NodeJS 模組解析標準 100% 的相容性。

我應該將哪一個與 Rush 搭配使用?

答案取決於您的需求。Rush 開發人員不認可特定的套件管理器,但以下是根據我們管理自己單一儲存庫的經驗提供的一些觀察:

NPM 的考量

  • NPM 是相容性最高的選擇,也是處理「不良」套件時最寬容的選擇。

  • 如果您選擇 NPM,您可能需要使用較舊的版本。已知 NPM 5.x 和 6.x 都有未解決的迴歸問題,會在 Rush 儲存庫中造成麻煩。NPM 4.5.0 是已知運作非常可靠的最新版本,但不幸的是它非常舊。(我們非常感謝社群協助改善這種情況。我們正在使用GitHub Issue #886 來追蹤這項工作。)

    在回報涉及 NPM 套件管理器的 Rush 錯誤之前,請先嘗試降級至 "npmVersion": "4.5.0"。如果這樣做消除了重現,那麼您的問題很可能是 NPM 迴歸問題,並且可能無法在 Rush 程式碼庫中修復。我們仍然接受這些問題,但我們會以不同的方式追蹤它們。

PNPM 的考量

  • PNPM 是唯一可以解決NPM 分身問題的選項。在複雜的單一儲存庫中,分身有時會造成許多麻煩,因此 PNPM 在這方面具有重要優勢。

  • 雖然 PNPM 的符號連結策略正確地遵循了現代 NodeJS 模組解析標準,但許多舊版套件並未遵循此標準,這會造成相容性問題。將現有專案從 Yarn/NPM 遷移到 PNPM 的團隊經常會遇到需要解決方案或修復的「不良套件」。不相容通常反映了這些套件的實際問題:(1)忘記在 package.json 檔案中列出依賴項目,或(2)實作未根據標準處理符號連結的自製模組解析。大多數「不良」套件都有簡單的修復方法,但對於小型團隊來說,這似乎令人望而卻步。(PNPM Discord 聊天室是尋求協助的絕佳資源。)

  • PNPM 比 NPM 或 Yarn 更新且使用率較低,但它是一個可靠的軟體。Microsoft 在 Rush 儲存庫中每天使用 PNPM 處理數百個專案和數百個 PR,我們發現它非常快速且可靠。

  • PNPM 目前是唯一支援 --strict-peer-dependencies 保護的選項(請參閱 rush.json 中的 "strictPeerDependencies")。

Yarn 的考量

  • Rush 對 Yarn 的支援相對較新且未經證實,因此我們很希望聽到有關問題並將其修復。

  • Yarn 的安裝速度比 NPM 快(但比 PNPM 稍慢)。

  • Yarn 的「工作區」未在 Rush 儲存庫中使用,因為它們依賴於無法防止虛擬依賴的安裝模型。但是,Rush 的連結策略大多等同於工作區。

指定您的套件管理器

若要變更您的套件管理器,請編輯 rush.json 檔案並取消註解三個欄位之一(npmVersionpnpmVersionyarnVersion)。

rush.json

/**
* The next field selects which package manager should be installed and determines its version.
* Rush installs its own local copy of the package manager to ensure that your build process
* is fully isolated from whatever tools are present in the local environment.
*
* Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation
* for details about these alternatives.
*/
"pnpmVersion": "2.15.1",

// "npmVersion": "4.5.0",
// "yarnVersion": "1.9.4",

變更設定後,請從 common/config/rush 資料夾中刪除舊的縮排檔和其他套件管理器特定檔案。(否則 Rush 會抱怨不支援的設定檔。)然後執行 rush update --full --purge。就是這樣!