這篇文章已經被 Adrian Sandu, Marcello La Rocca, Matt Burnett, Nuria Zuazo and Vildan Softic 審稿過了。
Yarn 是由 Facebo,google,Exponent 和 Tilde 制作的一種新的JavaScript 軟件包管理器。可以在官方公告上看到,其目的是解決團隊在 npm 面臨的問題,即
- 安裝包不足夠 快/連續
- 有安全隱患,npm 允許安裝包執行代碼
但是,別慌! 這并不是說要去完全替代 npm。yarn 是從 npm 注冊表獲取模塊的唯一的一個新的CLI 客戶端。對注冊表本身沒有任何的改變——你依舊可以跟以前一樣獲取和發布包。
現在所有人都應該上 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 便創建(或更新)一個 yarn.lock 文件。 這種方式可以保證另一臺機器上安裝同樣的包,同時還可以在package.json中定義一系列允許的版本。在 npm 中, npm shrinkwrap
命令也可以生成一個 lock 文件,然后 npm install
在讀 package.json
前,先從 lock 文件中讀取,就像 yarn 先讀 yarn.lock
文件先一樣。重要的區別是 yarn 總是創建和更新 yarn.lock
,而 npm 不會只創建一個默認的并且僅僅在 npm-shrinkwrap.json 存在的時候更新它。
平行安裝
無論什么時候 npm 或者 yarn 需要安裝一個包,它會執行一系列的任務。
在 npm,這些任務按順序并且在每個包中都執行,意味著它將會在一個包完全安裝的時候才跳到下個包。
yarn 則并行的執行這些任務,提高了性能。
相比之下,我在沒有 shrinkwrap/lock 文件和緩存的情況下, 使用 npm 和 yarn 安裝 express 包。總共安裝了 42 個包。
- npm: 9 秒
- yarn: 1.37 秒
重復相同的步驟還是產生類似的結果。然后我安裝 gulp , 結果有 195 個依賴包。
- npm: 11 秒
- Yarn: 7.81 秒
似乎較小的區別取決于正在安裝包的數量。無論哪種方式, yarn 始終更快。
更簡潔的輸出(cleaner output)
默認情況下 npm 的輸出非常詳細。比如,它在執行 npm install <package>
的時候,遞歸地列出所有已安裝的包。相反 yarn 一點都不詳細。當細節可以通過其他命令時,它使用貼切的表情展示出相當少的信息(除非是在 windows 上)。
Yarn vs npm: CLI 的區別
除了一些功能差異, Yarn 也有不同的命令。有些 npm 已經刪除的命令,還有修改和添加了一些有趣的命令。
yarn global
不像 npm , 全局操作在使用 -g
或者 --global
標志的命令的時候執行,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
標記添加包作為開發依賴,就跟 npm 的 --save-dev
標記一樣。
- yarn add documentation
- npm install documentation
yarn licenses [ls|generate-disclaimer]
在撰寫本文的時間為止,沒有npm等效可用。
yarn licenses ls
列出了所有安裝包的許可證。
yarn licenses generate-disclaimer
生成一個免責聲明包含所有執照的所有包的內容。在你的項目中,你必須包括項目的許可證,在這些狀態下,這是一個相當有用的工具。
- 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
穩定性和可靠性
Yarn 宣傳火車會出軌? 在第一天發布到公眾的時候,確實收到了很多的問題,但是解決問題的速度也是驚人的。同時聲明,社區正在努力查找和刪錯 bugs。看問題的數量和類型, Yarn 對于大多數用戶來說是穩定的,但可能不適合邊界情況。
注意,盡管包管理器對您的項目可能是至關重要的,它只是一個包管理器。如果出現錯誤,重新安裝包也不困難,而不是重新回到 npm 的懷抱。