Yarn 和 NPM的一些對比細節

原文出處: Tim Severien   譯文出處:衆成翻譯   html

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

  • 安裝的時候沒法保證速度/一致性
  • 安全問題,由於 npm 安裝時容許運行代碼

但請不要驚慌!它並無試圖徹底取代 npm。Yarn 一樣是一個從 npm 註冊源獲取模塊的新的 CLI 客戶端。註冊的方式不會有任何變化 —— 你一樣能夠正常獲取與發佈包。git

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

t019bf89f24721ca461

Yarn vs npm: 功能差別

乍一看 Yarn 與 npm 很相似,但經過引擎的對比就能察覺 Yarn 的不一樣。express

yarn.lock 文件

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

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

爲了不包版本的錯誤匹配,一個肯定的安裝版本被固定在一個鎖文件中。每次模塊被添加時,Yarn 就會建立(或更新)yarn.lock 文件,這樣你就能夠保證其它機子也安裝相同版本的包,同時包含了 package.json 中定義的一系列容許的版本。gulp

在 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 除外)。

t01af765b75ea3b010d

Yarn vs npm: CLI 的差別

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

yarn global

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

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

  1. yarn global 文檔

yarn install

npm install 命令會根據 package.json 安裝依賴以及容許你添加新的模塊;yarn install 僅會按 yarn.lock 或 package.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 來實現相同目的,能夠這樣執行:

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

  1. yarn upgrade 文檔

yarn generate-lock-entry

yarn generate-lock-entry 會基於 package.json 設置的依賴生成 yarn.lock 文件,該命令與 npm shrinkwrap 相似,但應該當心使用,由於經過 yarn add 和 yarn 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 完成包的安裝,也許這是閱讀遷移指南的最佳時刻 ;)

相關文章
相關標籤/搜索