1. 程式人生 > >Yarn vs npm: 你需要知道的一切

Yarn vs npm: 你需要知道的一切

ali 發布 什麽 size pla module bcb 復制 缺陷

Yarn 是 Facebook, Google, Exponent 和 Tilde 開發的一款新的 JavaScript 包管理工具。就像我們可以從官方文檔了解那樣,它的目的是解決這些團隊使用 npm 面臨的少數問題,即:

  • 安裝的時候無法保證速度/一致性
  • 安全問題,因為 npm 安裝時允許運行代碼

但請不要驚慌!它並沒有試圖完全取代 npm。Yarn 同樣是一個從 npm 註冊源獲取模塊的新的 CLI 客戶端。註冊的方式不會有任何變化 —— 你同樣可以正常獲取與發布包。

是否每個人現在都要跳上 Yarn 這輛被大肆宣傳的列車?又或者你根本沒機會碰到 npm 的這些問題。本篇文章將會比較 npm 與 Yarn,最終你可以決定哪款更適合你。

技術分享圖片

Yarn vs npm: 功能差異

乍一看 Yarn 與 npm 很類似,但通過引擎的對比就能察覺 Yarn 的不同。

yarn.lock 文件

npm 和 Yarn 都使用 package.json 來跟蹤項目的依賴,版本號並非一直準確,因為你可以定義版本號範圍,這樣你可以選擇一個主版本和次要版本的包,但讓 npm 安裝最新的補丁也許可以修改一些 bug。

理想狀態下使用語義化版本發布補丁不會包含大的變化,但不幸的是這必非真理。npm 的這種策略可能導致兩臺擁有相同 package.json 文件的機子安裝了不同版本的包,這可能導致一些錯誤。

為了避免包版本的錯誤匹配,一個確定的安裝版本被固定在一個鎖文件中。每次模塊被添加時,Yarn 就會創建(或更新)yarn.lock

文件,這樣你就可以保證其它機子也安裝相同版本的包,同時包含了 package.json 中定義的一系列允許的版本。

在 npm 中同樣可以使用 npm shrinkwrap 命令來生成一個鎖文件,這樣在使用 npm install 時會在讀取 package.json 前先讀取這個文件,就像 Yarn 會先讀取yarn.lock 一樣。這裏的區別是 Yarn 總會自動更新 yarn.lock,而 npm 需要你重新操作。

  1. yarn.lock 文檔
  2. npm shrinkwrap 文檔

並行安裝

每當 npm 或 Yarn 需要安裝一個包時,它會進行一系列的任務。在 npm 中這些任務是按包的順序一個個執行,這意味著必須等待上一個包被完整安裝才會進入下一個;Yarn 則並行的執行這些任務,提高了性能。

為了比較,我在沒有使用 shrinkwrap/yarn.lock 的方式以及清理了緩存下使用 npm 與 Yarn 安裝 express,總共安裝了 42 個依賴。

  • npm: 9 s
  • Yarn: 1.37 s

我無法相信自己的眼睛,所以重復以上步驟,但得到相同結果。接著我安裝 gulp 進行測試,總共安裝了 195 個依賴。

  • npm: 11 s
  • Yarn: 7.81 s

似乎根據所需要安裝的包的數量而有所不同,但 Yarn 依舊比較快。

清晰的輸出

npm 默認情況下非常冗余,例如使用 npm install 時它會遞歸列出所有安裝的信息;而 Yarn 則一點也不冗余,當可以使用其它命令時,它適當的使用 emojis 表情來減少信息(Windows 除外)。

技術分享圖片

Yarn vs npm: CLI 的差異

除了一些功能差異,Yarn 命令也存在一些區別。例如移除或修改了一些 npm 命令以及添加了幾個有趣的命令。

yarn global

不像 npm 添加 -g--global 可以進行全局安裝,Yarn 使用的是 global 前綴。不過與 npm 類似,項目依賴不推薦全局安裝。

global 前綴只能用於 yarn add, yarn bin, yarn lsyarn remove,除yarn add外,這些命令都和 npm 等效。

  1. yarn global 文檔

yarn install

npm install 命令會根據 package.json 安裝依賴以及允許你添加新的模塊;yarn install 僅會按 yarn.lockpackage.json 裏面的依賴順序來安裝模塊。

  1. yarn install 文檔
  2. npm install 文檔

yarn add [–dev]

npm install 類似,yarn add 允許你添加與安裝模塊,就像命令的名稱一樣,添加依賴意味著也會算定將依賴寫入 package.json,類似 npm 的 --save 參數;Yarn 的 --dev參數則是添加開發依賴,類似 npm 的 --save-dev 參數。

  1. yarn add 文檔
  2. npm install 文檔

yarn licenses [ls|generate-disclaimer]

npm 沒有類似命令來方便編寫自己的包。yarn licenses ls 列出所有已安裝包的許可協議。yarn licenses generate-disclaimer 生成包含已安裝包許可協議的免責聲明。某些協議要求使用者必須在項目中包含該協議,這時候該命令將變得非常好用。

  1. yarn licenses 文檔

yarn why

該命令會查找依賴關系並找出為什麽會將某些包安裝在你的項目中。也許你明確為什麽添加,也許它只是你安裝包中的一個依賴,yarn why 可以幫你弄找出。

  1. yarn why 文檔

yarn upgrade

該命令會根據符合 package.json 設定的規則而不是 yarn.lock 定義的確切版本來將包更新到最新版本。如果想用 npm 來實現相同目的,可以這樣執行:

Shell
1 2 rm -rf node_modules npm install

不要將該命令與 npm update 混淆,它指的是更新到自己的最新版。

  1. yarn upgrade 文檔

yarn generate-lock-entry

yarn generate-lock-entry 會基於 package.json 設置的依賴生成 yarn.lock 文件,該命令與 npm shrinkwrap 類似,但應該小心使用,因為通過 yarn addyarn upgrade 命令添加或更新依賴時會自動更新生成該鎖文件。

  1. yarn generate-lock-entry 文檔
  2. npm shrinkwrap 文檔

穩定性與可靠性

Yarn 被炒得這麽火熱會不會有問題?它正式發布當天就收到很多問題反饋,但官方處理問題的速度極快。這些表明社區正努力開發並修復bug。查看問題反饋的數量和類型可以發現 Yarn 在大多數用戶的機子上表現的很穩定,但可能個別機子會有問題。

請註意雖然一個包管理器可能對你的項目非常重要,但它僅僅只是個工具,如果出了狀況,恢復包不會困難,也並非要回歸 npm。

未來

也許你了解 Node.js 與 io.js 之間的歷史。簡單來說:io.js 是 Node.js 一些核心開發者因為項目管理上的分歧而獨立出來創建的分支。不同的是,io.js 選擇了開放式管理,在不到一年的時間時,兩支團隊達成協議,io.js 被合並回 Node.js,無論對錯,它為 Node.js 帶來了相當多不錯的功能。

我看到 npm 與 Yarn 和它們有著類似的模式,不過 Yarn 不是分支,它解決了 npm 的一些缺陷。如果 npm 從中學到東西並邀請 Facebook,Google 或其它 Yarn 的貢獻者們來一起提升 npm 不是很酷嗎?雖然言之過早,但我期待它會發生。

無論哪種結果,Yarn 前途一片光明。社區得到別人對新工具的贊揚後似乎很興奮,不幸的是,社區並沒有提供路線圖,所以我不確定 Yarn 是否為我們準備了其它驚喜。

結論

相比 npm 的默認配置,Yarn 獲得不少贊同。我們可以方便生成鎖文件,安裝包時非常迅速並且他們會自動添加進 package.json,同時安裝與使用 Yarn 的影響也很小,你可以直接在一個項目上嘗試看它是否可以工作,這使得 Yarn 可以完美替代 npm。

我絕對推薦在一個項目中盡早使用 Yarn,如果你對安裝和使用新軟件持謹慎態度,可以等待幾個月。畢竟 npm 久經考驗,它在軟件開發領域也有存在的價值。

使用你正確等待 npm 完成包的安裝,也許這是閱讀遷移指南的最佳時刻 ;)

你怎麽想呢?你是否已經在使用 Yarn?你是否將要嘗試?或者這只是一個已經支離破碎的生態系統的進一步破碎?請在下面評論區留下你的觀點。

Yarn vs npm: 你需要知道的一切