之前有同僚說 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 7。npm install --global
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 。