這篇文章已經(jīng)被 Adrian Sandu, Marcello La Rocca, Matt Burnett, Nuria Zuazo and Vildan Softic 審稿過了撕氧。
Yarn 是由 Facebo壳嚎,google未荒,Exponent 和 Tilde 制作的一種新的JavaScript 軟件包管理器苔严“莆茫可以在官方公告上看到毁欣,其目的是解決團隊在 npm 面臨的問題躲叼,即
- 安裝包不足夠 快/連續(xù)
- 有安全隱患厉亏,npm 允許安裝包執(zhí)行代碼
但是,別慌! 這并不是說要去完全替代 npm。yarn 是從 npm 注冊表獲取模塊的唯一的一個新的CLI 客戶端周拐。對注冊表本身沒有任何的改變——你依舊可以跟以前一樣獲取和發(fā)布包铡俐。
現(xiàn)在所有人都應該上 Yarn 的宣傳車了嗎?這些都是你用 npm 體驗不到的妥粟。在這篇文章审丘,我們將比較 npm 和 yarn,你可以比較哪個更適合你勾给。
Yarn vs npm: 功能上的差異
乍一看滩报,yarn 和 npm 看起來差不多。當我們看下底層的時候播急,我們可以知道 yarn 不一樣在哪里脓钾。
yarn.lock 文件
packege.json
文件可以讓 npm 和 yarn 跟蹤到項目的依賴,但是其版本號并不總是很準確桩警。相反可训,你可以定義一個版本范圍。這種方式捶枢,你可以選擇包的一個特定的主要和次要的一個版本握截,但允許npm 安裝最新的補丁(可以修正一些錯誤)烂叔。
在一個理想世界的語義版本川蒙,補丁版本不包含任何重大更改。不幸的是长已,這并不總是對的畜眨。npm 采用的策略可能會導致同一package.json文件兩機,具有不同版本的安裝包术瓮,可能引入錯誤康聂。 npm 采用的策略可能會導致同一 package.json
文件兩機,安裝不同版本的安裝包胞四,可能會造成引入錯誤恬汁。
為了避免包版本引入錯誤,一個確切的安裝版本被固定在一個 lock 文件中辜伟。每次加入一個模塊氓侧, yarn 便創(chuàng)建(或更新)一個 yarn.lock 文件。 這種方式可以保證另一臺機器上安裝同樣的包导狡,同時還可以在package.json中定義一系列允許的版本约巷。在 npm 中, npm shrinkwrap
命令也可以生成一個 lock 文件旱捧,然后 npm install
在讀 package.json
前独郎,先從 lock 文件中讀取踩麦,就像 yarn 先讀 yarn.lock
文件先一樣。重要的區(qū)別是 yarn 總是創(chuàng)建和更新 yarn.lock
氓癌,而 npm 不會只創(chuàng)建一個默認的并且僅僅在 npm-shrinkwrap.json 存在的時候更新它谓谦。
平行安裝
無論什么時候 npm 或者 yarn 需要安裝一個包,它會執(zhí)行一系列的任務贪婉。
在 npm反粥,這些任務按順序并且在每個包中都執(zhí)行,意味著它將會在一個包完全安裝的時候才跳到下個包疲迂。
yarn 則并行的執(zhí)行這些任務才顿,提高了性能。
相比之下鬼譬,我在沒有 shrinkwrap/lock 文件和緩存的情況下娜膘, 使用 npm 和 yarn 安裝 express 包逊脯∮胖剩總共安裝了 42 個包。
- npm: 9 秒
- yarn: 1.37 秒
重復相同的步驟還是產(chǎn)生類似的結(jié)果军洼。然后我安裝 gulp , 結(jié)果有 195 個依賴包巩螃。
- npm: 11 秒
- Yarn: 7.81 秒
似乎較小的區(qū)別取決于正在安裝包的數(shù)量。無論哪種方式, yarn 始終更快匕争。
更簡潔的輸出(cleaner output)
默認情況下 npm 的輸出非常詳細避乏。比如,它在執(zhí)行 npm install <package>
的時候甘桑,遞歸地列出所有已安裝的包拍皮。相反 yarn 一點都不詳細。當細節(jié)可以通過其他命令時跑杭,它使用貼切的表情展示出相當少的信息(除非是在 windows 上)铆帽。
Yarn vs npm: CLI 的區(qū)別
除了一些功能差異, Yarn 也有不同的命令。有些 npm 已經(jīng)刪除的命令德谅,還有修改和添加了一些有趣的命令爹橱。
yarn global
不像 npm , 全局操作在使用 -g
或者 --global
標志的命令的時候執(zhí)行,Yarn 命令需要帶有 global
前綴窄做。跟 npm 一樣愧驱,特定項目的依賴不需要全局安裝。
global
前綴只對 yarn add
, yarn bin
椭盏,yarn ls
和 yara remove
有效组砚。除了 yarn add
,這些命令跟 npm 的是等價的掏颊。
yarn install
npm install
命令會從 package.json
文件安裝依賴惫确,并且允許添加新的包。
yarn install
僅僅順序的安裝 yarn.lock
或者 package.json
列出的依賴。
yarn add [–dev]
跟 npm install <package>
一樣,yarn add <package>
允許你添加或者安裝一個依賴改化。
正如命令名稱所暗示的一樣掩蛤,它添加了一個依賴,意味著它會自動保存一個包的引用到 package.json
中陈肛,就跟 npm 的 --save
標志做的一樣揍鸟。
Yarn 的 --dev
標記添加包作為開發(fā)依賴,就跟 npm 的 --save-dev
標記一樣句旱。
- yarn add documentation
- npm install documentation
yarn licenses [ls|generate-disclaimer]
在撰寫本文的時間為止阳藻,沒有npm等效可用。
yarn licenses ls
列出了所有安裝包的許可證谈撒。
yarn licenses generate-disclaimer
生成一個免責聲明包含所有執(zhí)照的所有包的內(nèi)容腥泥。在你的項目中,你必須包括項目的許可證啃匿,在這些狀態(tài)下蛔外,這是一個相當有用的工具。
- yarn licenses documentation
yarn why
這個命令窺探到依賴圖,找出為什么包是安裝在您的項目溯乒。也許你顯式地添加它,也許這是一個依賴的包安裝夹厌。yarn why
幫助你弄清楚。
- yarn why documentation
yarn upgrade [package]
這個命令會更新包到符合設置在 package.json
版本的最新的版本并且重建 yarn.lock
裆悄。這類似于 npm update
.
有趣的是,當指定一個包,包會更新到最新版本和更新package.json中定義的標簽矛纹。這意味著該命令可能更新包到一個新的主要版本
- yarn upgrade documentation
yarn generate-lock-entry
yarn generate-lock-entry
命令基于 package.json
的依賴生成一個 yarn.lock
文件。這類似于 npm shrinkwrap
光稼。這個命令應該小心使用或南,當通過 yarn add
和 yarn upgrade
添加和更新依賴的時候,lock 文件會自動生成和更新艾君。
- yarn generate-lock-entry documentation
- npm shrinkwrap documentation
穩(wěn)定性和可靠性
Yarn 宣傳火車會出軌? 在第一天發(fā)布到公眾的時候采够,確實收到了很多的問題,但是解決問題的速度也是驚人的腻贰。同時聲明吁恍,社區(qū)正在努力查找和刪錯 bugs〔パ荩看問題的數(shù)量和類型, Yarn 對于大多數(shù)用戶來說是穩(wěn)定的,但可能不適合邊界情況冀瓦。
注意,盡管包管理器對您的項目可能是至關重要的,它只是一個包管理器。如果出現(xiàn)錯誤写烤,重新安裝包也不困難翼闽,而不是重新回到 npm 的懷抱。