- 原文地址:Yarn vs npm: Everything You Need to Know
- 原文做者:Tim Severien
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:EmilyQiRabbit
- 校對者:jerryOnlyZRJ,TUARAN
Yarn 是一個由 Facebook,Google,Exponent 和 Tilde 構建的新的 JavaScript 包管理器。正如官方公告所寫,它的目標就是解決這些團隊使用 npm 的時候所遇到的幾個問題,即:前端
可是,沒必要慌張!它並非想要徹底替代 npm。Yarn 僅僅是一個可以從 npm 倉庫獲取到模塊的新的 CLI 客戶端。android
如今每一個人都應該跳上 Yarn 這輛快車嗎?可能你在使用 npm 的時候你從沒遇到過這些問題。在這篇文章中,咱們將會比對 npm 和 Yarn,因此你就可以決定哪一個對你來講是最好的。ios
初看 Yarn 和 npm,它們很類似。但正如咱們深刻了解所知,Yarn 和 npm 是有所區別的。git
package.json
文件中有 npm 和 Yarn 追蹤項目依賴的信息,版本號並不老是確切的。可是,你能夠定義版本的範圍。這樣你能夠選擇包的最高和最低版本,可是容許 npm 安裝最新的補丁,來修復一些 bug。github
在 語義版本控制 的理想世界裏,發佈的補丁不該該包括任何實質性的修改。可是很不幸,這並不老是事實。npm 的策略可能會致使兩臺設備使用一樣的 package.json
文件,但安裝了不一樣版本的包,這可能致使故障。express
爲了不包版本的錯誤匹配,在鎖定文件中須要固定安裝的確切版本。每次添加模塊,Yarn 會建立(或更新)一個 yarn.lock
文件。這樣你就能保證在 package.json
文件中定義一個可選版本範圍的同時,其餘設備都安裝同樣的包。npm
在 npm 命令中,npm shrinkwrap
一樣能夠生成一個鎖定文件,而且 npm install
在讀取 package.json
以前會先讀這個鎖文件,和 Yarn 會首先讀取 yarn.lock
的方式相似。最關鍵的區別是,Yarn 必定會建立並更新 yarn.lock
,可是 npm 默認不會建立,而且只會當文件 npm-shrinkwrap.json
存在時更新它。json
不管什麼時候 npm 或者 Yarn 須要安裝包,都會產出一系列的任務。使用 npm 時,這些任務按包順序執行,也就是隻有當一個包所有安裝完成後,纔會安裝下一個。Yarn 則是並行執行任務,提升了性能。gulp
對比來講,我同時使用 npm 和 Yarn 安裝了包 express,它們都沒有 shrinkwrap 或者 lock 文件也沒有緩存。此次安裝一共包括 42 個包。後端
propertag.cmd.push(function() { proper_display('sitepoint_content_1'); });
我簡直不敢相信個人眼睛。重複這個步驟的結果是類似的。而後我安裝了包 gulp,共下載 195 個依賴包。
看起來,下載時間的差別很大程度取決於安裝的軟件包的數量。可是不管那種,Yarn 都更快。
npm 的輸出默認就很詳細。例如,當運行 npm install <package>
的時候,它將會遞歸的列出全部安裝了的包。而另外一方面,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 <package>
相似,yarn add <package>
讓你能添加並安裝依賴。正如命令名的字面義,它能添加依賴,同時意味着它將自動的把包的引用添加到 package.json
文件中,和 npm 的 --save
標誌同樣。Yarn 的 --dev
標誌會把包做爲開發模式的依賴,和 npm 的 --save-dev
標誌同樣。
在寫本篇文章的時候,yarn 上還有一些 npm 上沒有的等價可用的命令。yarn licenses ls
可以列出全部安裝包的許可協議。yarn licenses generate-disclaimer
能生成包括全部包的全部許可協議的免責聲明。一些許可協議聲明瞭你必須在你的項目中包含該項目協議,此時該命令就是一個頗有用的工具了。
這個命令可以分析依賴圖而後找出爲何指定的包會被安裝到你的項目中。也許是你明確指定安裝它的,或許它是你安裝的包的依賴之一。yarn why
將幫助你查明緣由。
這個命令將更新包到符合 package.json
設定規則的最新的版本,並從新建立 yarn.lock
文件。它和 npm update
相似。
有趣的是,當指定包的時候,它將會將這個包更新到最新版並更新 package.json
中定義的標籤。這意味着這個命令可能將包更新到一個新的 major 發佈。
yarn generate-lock-entry
命令將生成一個 yarn.lock
文件,它是基於 package.json
中的依賴設定的。這和 npm shrinkwrap
很相似。使用這個命令要謹慎,由於它將生成鎖定文件,而且當你經過 yarn add
和 yarn upgrade
更新依賴的時候,它會自動更新。
Yarn 的快車可能脫軌嗎?在發佈的第一天,它確實收到了不少問題反饋,可是解決問題的效率一樣驚人。這都意味着社區在努力尋找並解決問題。看看這些問題的數量和種類後咱們知道,Yarn 對於大多數用戶都是更加穩定的,可是對於一些邊緣狀況,可能就不太適合了。
注意,儘管可能包管理對於你的項目很是重要,它也僅僅是一個包管理器。若是真的有什麼問題出現了,重裝包並不難,切回使用 npm 也不難。
也許你知道 Node.js 和 io.js 的歷史。歸納的說,io.js 是 Node.js 的一個分叉,因爲 Node.js 項目的管理出現了分歧,一些核心貢獻者就建立了 io.js。可是,io.js 選擇了開源。不到一年的時間,兩個團隊又達成了一致,因而 io.js 又合併回了 Node.js,io.js 的研發也就再也不進行了。不管這樣的選擇如今來看是對是錯,這件事的結果是爲 Node.js 引入了不少很棒的功能。
我如今在 npm 和 Yarn 上看到了相似的模式。儘管 Yarn 不是一個分叉,可是它改進了數個 npm 的漏洞。若是 npm 從中學習,並要求 Facebook,Google 以及其餘 Yarn 貢獻者轉而幫助 npm 優化,這不是很好的事情嗎?儘管如今這樣說有些早了,可是我但願如此。
無論怎樣,Yarn 的將來都是光明的。這個新的包管理器的出現讓社區裏的人都感到很興奮,而且人們也漸漸接受了它。不幸的是,它沒有任何規劃說明,因此我也不知道 Yarn 會給咱們準備什麼驚喜。
和 npm 相比,Yarn 的評分更高。咱們能夠自由的獲取鎖定文件,安裝包的速度也驚人的快,並且它們會被自動的保存到 package.json
。安裝並使用 Yarn 的缺點也不多。你能夠先在一個項目中試用它,看看是否適合於你。這樣,Yarn 就成爲了 npm 一個替代品。
propertag.cmd.push(function() { proper_display('sitepoint_content_2'); });
我強烈推薦你在一個項目中試試看 Yarn。若是你對於安裝和使用新的軟件很謹慎,也請給它幾個月的時間。畢竟,npm 是通過實戰檢驗的,這在軟件開發的世界中,絕對值得。
若是你正巧在等着 npm 安裝包,也許正好能夠讀一讀遷移到 Yarn 的指南 ;)
看完文章後你以爲怎樣?你已經在使用 Yarn 了嗎?你願意嘗試嗎?或者你認爲這僅會致使一個已經很分散的生態圈的進一步分裂?請在評論區寫下你的見解。
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。