[譯] 關於 Yarn 和 npm 你所需要知道的一切

Yuqi發表於2019-02-14

Yarn 是一個由 Facebook,Google,Exponent 和 Tilde 構建的新的 JavaScript 包管理器。正如官方公告所寫,它的目標就是解決這些團隊使用 npm 的時候所遇到的幾個問題,即:

  • 安裝包不夠快速和穩定
  • 存在安全隱患,因為 npm 允許包在安裝的時候執行程式碼

但是,不必慌張!它並不是想要完全替代 npm。Yarn 僅僅是一個能夠從 npm 倉庫獲取到模組的新的 CLI 客戶端。

現在每個人都應該跳上 Yarn 這輛快車嗎?可能你在使用 npm 的時候你從沒遇到過這些問題。在這篇文章中,我們將會比對 npm 和 Yarn,所以你就能夠決定哪個對你來說是最好的。

Yarn 標誌

Yarn 和 npm:功能差異

初看 Yarn 和 npm,它們很相似。但正如我們深入瞭解所知,Yarn 和 npm 是有所區別的。

yarn.lock 檔案

package.json 檔案中有 npm 和 Yarn 追蹤專案依賴的資訊,版本號並不總是確切的。但是,你可以定義版本的範圍。這樣你可以選擇包的最高和最低版本,但是允許 npm 安裝最新的補丁,來修復一些 bug。

語義版本控制 的理想世界裡,釋出的補丁不應該包括任何實質性的修改。但是很不幸,這並不總是事實。npm 的策略可能會導致兩臺裝置使用同樣的 package.json 檔案,但安裝了不同版本的包,這可能導致故障。

為了避免包版本的錯誤匹配,在鎖定檔案中需要固定安裝的確切版本。每次新增模組,Yarn 會建立(或更新)一個 yarn.lock 檔案。這樣你就能保證在 package.json 檔案中定義一個可選版本範圍的同時,其他裝置都安裝一樣的包。

在 npm 命令中,npm shrinkwrap 同樣可以生成一個鎖定檔案,並且 npm install 在讀取 package.json 之前會先讀這個鎖檔案,和 Yarn 會首先讀取 yarn.lock 的方式類似。最關鍵的區別是,Yarn 一定會建立並更新 yarn.lock,但是 npm 預設不會建立,並且只會當檔案 npm-shrinkwrap.json 存在時更新它。

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

並行安裝

無論何時 npm 或者 Yarn 需要安裝包,都會產出一系列的任務。使用 npm 時,這些任務按包順序執行,也就是隻有當一個包全部安裝完成後,才會安裝下一個。Yarn 則是並行執行任務,提高了效能。

對比來說,我同時使用 npm 和 Yarn 安裝了包 express,它們都沒有 shrinkwrap 或者 lock 檔案也沒有快取。這次安裝一共包括 42 個包。

propertag.cmd.push(function() { proper_display('sitepoint_content_1'); });

  • npm:9 秒
  • Yarn:1.37 秒

我簡直不敢相信我的眼睛。重複這個步驟的結果是相似的。然後我安裝了包 gulp,共下載 195 個依賴包。

  • npm:11 秒
  • Yarn:7.81 秒

看起來,下載時間的差異很大程度取決於安裝的軟體包的數量。但是無論那種,Yarn 都更快。

更清晰的輸出

npm 的輸出預設就很詳細。例如,當執行 npm install <package> 的時候,它將會遞迴的列出所有安裝了的包。而另一方面,Yarn 就很簡略。它只列出很少的重要資訊並配合適當的 emojis(除非你用的是 Windows 系統),而詳細資訊可以通過其他命令獲取。

“yarn install” 命令的輸出

Yarn 和 npm:CLI 的區別

除了功能上的區別,Yarn 還有一些不同的命令。去掉了一些 npm 的命令,其他的也做了修改,另外還有新增了一些有意思的命令。

全域性 yarn

和 npm 在全域性安裝操作時需要使用 -g 或者 --global 標誌不同,Yarn 命令需要用 global 作為字首。和 npm 一樣,具體專案的依賴性不應該全域性安裝。

global 字首僅適用於 yarn addyarn binyarn lsyarn remove。除了 yarn add,這些命令都和 npm 命令一樣。

  1. yarn global 文件

yarn 安裝

npm install 命令將會依照 package.json 檔案安裝依賴,並且允許你新增新的包。yarn install 僅下載 yarn.lock 列出的依賴,如果沒有該檔案,則下載 package.json 列出的。

  1. yarn install 文件
  2. npm install 文件

yarn add [–dev]

npm install <package> 類似,yarn add <package> 讓你能新增並安裝依賴。正如命令名的字面義,它能新增依賴,同時意味著它將自動的把包的引用新增到 package.json 檔案中,和 npm 的 --save 標誌一樣。Yarn 的 --dev 標誌會把包作為開發模式的依賴,和 npm 的 --save-dev 標誌一樣。

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

yarn licenses [ls|generate-disclaimer]

在寫本篇文章的時候,yarn 上還有一些 npm 上沒有的等價可用的命令。yarn licenses ls 能夠列出所有安裝包的許可協議。yarn licenses generate-disclaimer 能生成包括所有包的所有許可協議的免責宣告。一些許可協議宣告瞭你必須在你的專案中包含該專案協議,此時該命令就是一個很有用的工具了。

  1. yarn licenses 文件

yarn why

這個命令能夠分析依賴圖然後找出為什麼指定的包會被安裝到你的專案中。也許是你明確指定安裝它的,或許它是你安裝的包的依賴之一。yarn why 將幫助你查明原因。

  1. yarn why 文件

yarn upgrade [package]

這個命令將更新包到符合 package.json 設定規則的最新的版本,並重新建立 yarn.lock 檔案。它和 npm update 類似。

有趣的是,當指定包的時候,它將會將這個包更新到最新版並更新 package.json 中定義的標籤。這意味著這個命令可能將包更新到一個新的 major 釋出。

  1. yarn upgrade 文件

yarn generate-lock-entry

yarn generate-lock-entry 命令將生成一個 yarn.lock 檔案,它是基於 package.json 中的依賴設定的。這和 npm shrinkwrap 很類似。使用這個命令要謹慎,因為它將生成鎖定檔案,並且當你通過 yarn addyarn upgrade 更新依賴的時候,它會自動更新。

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

穩定性和可靠性

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 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章