[譯]yarn vs npm: 你需要知道的一切

這篇文章已經(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 存在的時候更新它谓谦。

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

平行安裝

無論什么時候 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 上)铆帽。

1476651912yarn-install-output.png

Yarn vs npm: CLI 的區(qū)別

除了一些功能差異, Yarn 也有不同的命令。有些 npm 已經(jīng)刪除的命令德谅,還有修改和添加了一些有趣的命令爹橱。

yarn global

不像 npm , 全局操作在使用 -g 或者 --global 標志的命令的時候執(zhí)行,Yarn 命令需要帶有 global 前綴窄做。跟 npm 一樣愧驱,特定項目的依賴不需要全局安裝。

global 前綴只對 yarn add, yarn bin椭盏,yarn lsyara remove 有效组砚。除了 yarn add,這些命令跟 npm 的是等價的掏颊。

  1. yarn global documentation

yarn install

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 標記添加包作為開發(fā)依賴,就跟 npm 的 --save-dev標記一樣句旱。

  1. yarn add documentation
  2. npm install documentation

yarn licenses [ls|generate-disclaimer]

在撰寫本文的時間為止阳藻,沒有npm等效可用。
yarn licenses ls 列出了所有安裝包的許可證谈撒。
yarn licenses generate-disclaimer 生成一個免責聲明包含所有執(zhí)照的所有包的內(nèi)容腥泥。在你的項目中,你必須包括項目的許可證啃匿,在這些狀態(tài)下蛔外,這是一個相當有用的工具。

  1. yarn licenses documentation

yarn why

這個命令窺探到依賴圖,找出為什么包是安裝在您的項目溯乒。也許你顯式地添加它,也許這是一個依賴的包安裝夹厌。yarn why幫助你弄清楚。

  1. yarn why documentation

yarn upgrade [package]

這個命令會更新包到符合設置在 package.json版本的最新的版本并且重建 yarn.lock裆悄。這類似于 npm update.

有趣的是,當指定一個包,包會更新到最新版本和更新package.json中定義的標簽矛纹。這意味著該命令可能更新包到一個新的主要版本

  1. yarn upgrade documentation

yarn generate-lock-entry

yarn generate-lock-entry命令基于 package.json的依賴生成一個 yarn.lock文件。這類似于 npm shrinkwrap光稼。這個命令應該小心使用或南,當通過 yarn addyarn upgrade添加和更新依賴的時候,lock 文件會自動生成和更新艾君。

  1. yarn generate-lock-entry documentation
  2. npm shrinkwrap documentation

穩(wěn)定性和可靠性

Yarn 宣傳火車會出軌? 在第一天發(fā)布到公眾的時候采够,確實收到了很多的問題,但是解決問題的速度也是驚人的腻贰。同時聲明吁恍,社區(qū)正在努力查找和刪錯 bugs〔パ荩看問題的數(shù)量和類型, Yarn 對于大多數(shù)用戶來說是穩(wěn)定的,但可能不適合邊界情況冀瓦。

注意,盡管包管理器對您的項目可能是至關重要的,它只是一個包管理器。如果出現(xiàn)錯誤写烤,重新安裝包也不困難翼闽,而不是重新回到 npm 的懷抱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲炊,一起剝皮案震驚了整個濱河市感局,隨后出現(xiàn)的幾起案子尼啡,更是在濱河造成了極大的恐慌,老刑警劉巖询微,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崖瞭,死亡現(xiàn)場離奇詭異,居然都是意外死亡撑毛,警方通過查閱死者的電腦和手機书聚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藻雌,“玉大人雌续,你說我怎么就攤上這事】韬迹” “怎么了驯杜?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長做个。 經(jīng)常有香客問我鸽心,道長,這世上最難降的妖魔是什么叁温? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任再悼,我火速辦了婚禮核畴,結(jié)果婚禮上膝但,老公的妹妹穿的比我還像新娘。我一直安慰自己谤草,他們只是感情好跟束,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丑孩,像睡著了一般冀宴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温学,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天略贮,我揣著相機與錄音,去河邊找鬼仗岖。 笑死逃延,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轧拄。 我是一名探鬼主播揽祥,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼檩电!你這毒婦竟也來了拄丰?” 一聲冷哼從身側(cè)響起府树,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎料按,沒想到半個月后奄侠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡载矿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年遭铺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恢准。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡魂挂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馁筐,到底是詐尸還是另有隱情涂召,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布敏沉,位于F島的核電站果正,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盟迟。R本人自食惡果不足惜秋泳,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攒菠。 院中可真熱鬧迫皱,春花似錦、人聲如沸辖众。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凹炸。三九已至戏阅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啤它,已是汗流浹背奕筐。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留变骡,地道東北人离赫。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像锣光,于是被迫代替她去往敵國和親笆怠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容