天天看點

npm與yarn怎麼選

之前有同僚說 npm 速度太慢了,項目部署也偶爾會發生依賴無法下載下傳導緻建構失敗的問題,是以再次查閱學習了下包管理器的選型問題。

是什麼

先分别說說兩個包管理器吧

npm

npm 是 Node.js 的包管理工具,用來安裝各種 Node.js 的擴充,能解決 NodeJS 代碼部署上的很多問題。

yarn

yarn 是由 Facebook、Google、Exponent 和 Tilde 聯合推出了一個新的 JS 包管理工具,yarn 是為了彌補 npm 的一些缺陷而出現的。

npm 不受歡迎?

提到 npm vs yarn 網上可以搜尋到很多結果都是偏向于 yarn,很多部落格文章都在 diss npm 的種種不是:

  • 依賴安裝慢
  • 安裝時無法保持一緻性
  • 安裝時報錯資訊易被警告資訊淹沒而被忽略
  • 不同項目重複安裝同一依賴占用磁盤空間

同時在标榜 yarn 這個工具是多麼的好:

速度快

  • 并行安裝:yarn 并行執行所有任務,提高了性能,不像 npm 是隊列執行。
  • 離線模式:已經安裝過的軟體包,yarn 再次安裝時會從緩存擷取,不像 npm 那樣再次從網絡下載下傳。

版本統一

yarn 通過鎖定檔案(lock file)記錄被确切安裝上的子產品版本号。新增子產品後,Yarn 就會建立(或更新)yarn.lock 這個檔案保證每次拉取同一個項目依賴時,使用的都是一樣的子產品版本。

輸出簡潔

預設情況結合了 emoji 直覺且直接地列印出必要的資訊,提供了一些指令供開發者查詢額外的安裝資訊。npm 是列印所有的安裝依賴。

多注冊來源處理

依賴包不管它被不同的庫間接關聯引用多少次,安裝這個包時,隻會從一個注冊來源去裝防止出現混亂不一緻。

語義化

指令的名稱更加語義了,例如:

yarn add/remove

總之,能搜到的很多資訊裡面,大多對于 npm 這個評價都是不如 yarn 的,給大家造成了 yarn 比較香的第一印象,yarn 出現就是為了解決 npm 的缺陷 😂。

真是如此嗎

仔細去看的話,其實會發現有很多資訊都是過時的,就是在當時那個環境下是對的,但是 被 diss 久了,肯定要有所作為的,npm 也是在不斷進步的。

下面就說說 npm7 吧。

  • npm 7 已釋出到 npm 倉庫的最新版本。
  • 執行

    npm install --global

    時将預設安裝 npm 7。

Workspaces

npm CLI 的一組功能,可支援從單個頂級軟體包中管理多個軟體包

npm7 在性能上做了不少優化:

  • 依賴包數量上減少了 54%(npm 7 67 個,npm 6 123 個)
  • 代碼測試覆寫率增加了 54%(npm 7 94% vs npm 6 77%)

可以參考下

benchmarks

中顯示的性能提升

npm7 會修改 lockfile

新的 lockfile 格式,該格式會向後相容 npm 6 使用者,舊版本中,yarn.lock 檔案被忽略,npm CLI 現在可以使用 yarn.lock 作為 package 中繼資料和依賴的來源。如果存在 yarn.lock,則 npm 還将使它與 package 的内容保持最新。

使用 npm 7 并且在有 v1 的 lockfile 的項目中執行 npm install,則會把 lock file 檔案的内容取代成 v2 的格式。

  • 避免方式:執行

    npm install --no-save peer dependencies

自動安裝 peer dependencies

npm 7 之前版本(4-6)中,開發人員需要自己管理和安裝 peerDependencies,peer dependencies 沖突會有版本不相容的警告,但仍會安裝依賴并不會抛出錯誤。

npm 7 中,如果存在無法自動解決的依賴沖突,将會阻止安裝。

新的 peer dependencies 可確定在 node_modules 樹中 peerDependencies 的位置處或之上找到有效比對的 peerDependencies。

可以通過使--force 選項重新安裝來繞過沖突,或者選擇--legacy-peer-deps 選項 peer dependencies 的依賴關系(類似于 npm 版本 4-6)。

許多包都依賴寬松的 peer dependencies 解析,npm 7 将列印警告并解決包依賴樹中存在的大多數同級沖突,是以這些沖突不能手動處理。要在所有層級強制執行嚴格正确的 peer dependencies 依賴關系,需要使用 --strict-peer-deps 選項。

npm 的内部結構已得到重大重構。速度其實也與 yarn 不相上下了,是以選擇哪一個都可以。

如果你已經在個人項目上使用 yarn,并且沒有遇到更多問題,目前完全可以繼續使用。但如果有相容 npm 的場景,或者項目在使用 npm,cnpm 的團隊,以及還沒有切到 yarn 的情況,那就可以去試一試 npm7 。

參考資料

繼續閱讀