原文出處: Tim Severien 譯文出處:衆成翻譯 html
Yarn 是 Facebook, Google, Exponent 和 Tilde 開發的一款新的 JavaScript 包管理工具。就像咱們能夠從官方文檔瞭解那樣,它的目的是解決這些團隊使用 npm 面臨的少數問題,即:node
但請不要驚慌!它並無試圖徹底取代 npm。Yarn 一樣是一個從 npm 註冊源獲取模塊的新的 CLI 客戶端。註冊的方式不會有任何變化 —— 你一樣能夠正常獲取與發佈包。git
是否每一個人如今都要跳上 Yarn 這輛被大肆宣傳的列車?又或者你根本沒機會碰到 npm 的這些問題。本篇文章將會比較 npm 與 Yarn,最終你能夠決定哪款更適合你。github
乍一看 Yarn 與 npm 很相似,但經過引擎的對比就能察覺 Yarn 的不一樣。express
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 須要你從新操做。緩存
每當 npm 或 Yarn 須要安裝一個包時,它會進行一系列的任務。在 npm 中這些任務是按包的順序一個個執行,這意味着必須等待上一個包被完整安裝纔會進入下一個;Yarn 則並行的執行這些任務,提升了性能。安全
爲了比較,我在沒有使用 shrinkwrap/yarn.lock 的方式以及清理了緩存下使用 npm 與 Yarn 安裝 express,總共安裝了 42 個依賴。
我沒法相信本身的眼睛,因此重複以上步驟,但獲得相同結果。接着我安裝 gulp 進行測試,總共安裝了 195 個依賴。
彷佛根據所須要安裝的包的數量而有所不一樣,但 Yarn 依舊比較快。
npm 默認狀況下很是冗餘,例如使用 npm install
時它會遞歸列出全部安裝的信息;而 Yarn 則一點也不冗餘,當可使用其它命令時,它適當的使用 emojis 表情來減小信息(Windows 除外)。
除了一些功能差別,Yarn 命令也存在一些區別。例如移除或修改了一些 npm 命令以及添加了幾個有趣的命令。
不像 npm 添加 -g
或 --global
能夠進行全局安裝,Yarn 使用的是 global
前綴。不過與 npm 相似,項目依賴不推薦全局安裝。
global
前綴只能用於 yarn add
, yarn bin
, yarn ls
和 yarn remove
,除yarn add
外,這些命令都和 npm 等效。
npm install
命令會根據 package.json
安裝依賴以及容許你添加新的模塊;yarn install
僅會按 yarn.lock
或 package.json
裏面的依賴順序來安裝模塊。
與 npm install
相似,yarn add
容許你添加與安裝模塊,就像命令的名稱同樣,添加依賴意味着也會算定將依賴寫入 package.json
,相似 npm 的 --save
參數;Yarn 的 --dev
參數則是添加開發依賴,相似 npm 的 --save-dev
參數。
npm 沒有相似命令來方便編寫本身的包。yarn licenses ls
列出全部已安裝包的許可協議。yarn licenses generate-disclaimer
生成包含已安裝包許可協議的免責聲明。某些協議要求使用者必須在項目中包含該協議,這時候該命令將變得很是好用。
該命令會查找依賴關係並找出爲何會將某些包安裝在你的項目中。也許你明確爲何添加,也許它只是你安裝包中的一個依賴,yarn why
能夠幫你弄找出。
該命令會根據符合 package.json
設定的規則而不是 yarn.lock
定義的確切版原本將包更新到最新版本。若是想用 npm 來實現相同目的,能夠這樣執行:
1
2
|
rm -rf node_modules
npm install
|
不要將該命令與 npm update
混淆,它指的是更新到本身的最新版。
yarn generate-lock-entry
會基於 package.json
設置的依賴生成 yarn.lock
文件,該命令與 npm shrinkwrap
相似,但應該當心使用,由於經過 yarn add
和 yarn upgrade
命令添加或更新依賴時會自動更新生成該鎖文件。
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 完成包的安裝,也許這是閱讀遷移指南的最佳時刻 ;)