[譯] 關(guān)于 Yarn 和 npm 你所需要知道的一切

[譯] 關(guān)于 Yarn 和 npm 你所需要知道的一切

原文地址:Yarn vs npm: Everything You Need to Know

原文作者:Tim Severien

譯文出自:掘金翻譯計(jì)劃

本文永久鏈接:https://github.com/xitu/gold-miner/blob/master/TODO1/yarn-vs-npm-everything-you-need-to-know.md

譯者:EmilyQiRabbit

校對(duì)者:jerryOnlyZRJ,TUARAN

Yarn 是一個(gè)由 Facebook上沐,Google筒愚,Exponent 和 Tilde 構(gòu)建的新的 JavaScript 包管理器浅萧。正如官方公告所寫(xiě)懦傍,它的目標(biāo)就是解決這些團(tuán)隊(duì)使用 npm 的時(shí)候所遇到的幾個(gè)問(wèn)題阎姥,即:

安裝包不夠快速和穩(wěn)定

存在安全隱患闭专,因?yàn)?npm 允許包在安裝的時(shí)候運(yùn)行代碼

但是,不必慌張逗余!它并不是想要完全替代 npm特咆。Yarn 僅僅是一個(gè)能夠從 npm 倉(cāng)庫(kù)獲取到模塊的新的 CLI 客戶端。

現(xiàn)在每個(gè)人都應(yīng)該跳上 Yarn 這輛快車嗎录粱?可能你在使用 npm 的時(shí)候你從沒(méi)遇到過(guò)這些問(wèn)題腻格。在這篇文章中,我們將會(huì)比對(duì) npm 和 Yarn啥繁,所以你就能夠決定哪個(gè)對(duì)你來(lái)說(shuō)是最好的荒叶。

Yarn 標(biāo)志

Yarn 和 npm:功能差異

初看 Yarn 和 npm,它們很相似输虱。但正如我們深入了解所知,Yarn 和 npm 是有所區(qū)別的脂凶。

yarn.lock 文件

package.json 文件中有 npm 和 Yarn 追蹤項(xiàng)目依賴的信息宪睹,版本號(hào)并不總是確切的愁茁。但是,你可以定義版本的范圍亭病。這樣你可以選擇包的最高和最低版本鹅很,但是允許 npm 安裝最新的補(bǔ)丁,來(lái)修復(fù)一些 bug罪帖。

在 語(yǔ)義版本控制 的理想世界里促煮,發(fā)布的補(bǔ)丁不應(yīng)該包括任何實(shí)質(zhì)性的修改。但是很不幸整袁,這并不總是事實(shí)菠齿。npm 的策略可能會(huì)導(dǎo)致兩臺(tái)設(shè)備使用同樣的 package.json 文件,但安裝了不同版本的包坐昙,這可能導(dǎo)致故障绳匀。

為了避免包版本的錯(cuò)誤匹配,在鎖定文件中需要固定安裝的確切版本炸客。每次添加模塊疾棵,Yarn 會(huì)創(chuàng)建(或更新)一個(gè) yarn.lock 文件。這樣你就能保證在 package.json 文件中定義一個(gè)可選版本范圍的同時(shí)痹仙,其他設(shè)備都安裝一樣的包是尔。

在 npm 命令中,npm shrinkwrap 同樣可以生成一個(gè)鎖定文件开仰,并且 npm install 在讀取 package.json 之前會(huì)先讀這個(gè)鎖文件拟枚,和 Yarn 會(huì)首先讀取 yarn.lock 的方式類似。最關(guān)鍵的區(qū)別是抖所,Yarn 一定會(huì)創(chuàng)建并更新 yarn.lock梨州,但是 npm 默認(rèn)不會(huì)創(chuàng)建,并且只會(huì)當(dāng)文件 npm-shrinkwrap.json 存在時(shí)更新它田轧。

yarn.lock 文檔

npm shrinkwrap 文檔

并行安裝

無(wú)論何時(shí) npm 或者 Yarn 需要安裝包暴匠,都會(huì)產(chǎn)出一系列的任務(wù)。使用 npm 時(shí)傻粘,這些任務(wù)按包順序執(zhí)行每窖,也就是只有當(dāng)一個(gè)包全部安裝完成后,才會(huì)安裝下一個(gè)弦悉。Yarn 則是并行執(zhí)行任務(wù)窒典,提高了性能。

對(duì)比來(lái)說(shuō)稽莉,我同時(shí)使用 npm 和 Yarn 安裝了包 express瀑志,它們都沒(méi)有 shrinkwrap 或者 lock 文件也沒(méi)有緩存。這次安裝一共包括 42 個(gè)包。

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

npm:9 秒

Yarn:1.37 秒

我簡(jiǎn)直不敢相信我的眼睛劈猪。重復(fù)這個(gè)步驟的結(jié)果是相似的昧甘。然后我安裝了包 gulp,共下載 195 個(gè)依賴包战得。

npm:11 秒

Yarn:7.81 秒

看起來(lái)充边,下載時(shí)間的差異很大程度取決于安裝的軟件包的數(shù)量。但是無(wú)論那種常侦,Yarn 都更快浇冰。

更清晰的輸出

npm 的輸出默認(rèn)就很詳細(xì)。例如聋亡,當(dāng)運(yùn)行 npm install <package> 的時(shí)候肘习,它將會(huì)遞歸的列出所有安裝了的包。而另一方面杀捻,Yarn 就很簡(jiǎn)略井厌。它只列出很少的重要信息并配合適當(dāng)?shù)?emojis(除非你用的是 Windows 系統(tǒng)),而詳細(xì)信息可以通過(guò)其他命令獲取致讥。

“yarn install” 命令的輸出

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

除了功能上的區(qū)別仅仆,Yarn 還有一些不同的命令。去掉了一些 npm 的命令垢袱,其他的也做了修改墓拜,另外還有添加了一些有意思的命令。

全局 yarn

和 npm 在全局安裝操作時(shí)需要使用 -g 或者 --global 標(biāo)志不同请契,Yarn 命令需要用 global 作為前綴咳榜。和 npm 一樣,具體項(xiàng)目的依賴性不應(yīng)該全局安裝爽锥。

global 前綴僅適用于 yarn add涌韩,yarn bin,yarn ls 和 yarn remove氯夷。除了 yarn add臣樱,這些命令都和 npm 命令一樣。

yarn global 文檔

yarn 安裝

npm install 命令將會(huì)依照 package.json 文件安裝依賴腮考,并且允許你添加新的包雇毫。yarn install 僅下載 yarn.lock 列出的依賴,如果沒(méi)有該文件踩蔚,則下載 package.json 列出的棚放。

yarn install 文檔

npm install 文檔

yarn add [–dev]

和 npm install <package> 類似,yarn add <package> 讓你能添加并安裝依賴馅闽。正如命令名的字面義飘蚯,它能添加依賴馍迄,同時(shí)意味著它將自動(dòng)的把包的引用添加到 package.json 文件中,和 npm 的 --save 標(biāo)志一樣孝冒。Yarn 的 --dev 標(biāo)志會(huì)把包作為開(kāi)發(fā)模式的依賴柬姚,和 npm 的 --save-dev 標(biāo)志一樣。

yarn add 文檔

npm install 文檔

yarn licenses [ls|generate-disclaimer]

在寫(xiě)本篇文章的時(shí)候庄涡,yarn 上還有一些 npm 上沒(méi)有的等價(jià)可用的命令。yarn licenses ls 能夠列出所有安裝包的許可協(xié)議搬设。yarn licenses generate-disclaimer 能生成包括所有包的所有許可協(xié)議的免責(zé)聲明穴店。一些許可協(xié)議聲明了你必須在你的項(xiàng)目中包含該項(xiàng)目協(xié)議,此時(shí)該命令就是一個(gè)很有用的工具了拿穴。

yarn licenses 文檔

yarn why

這個(gè)命令能夠分析依賴圖然后找出為什么指定的包會(huì)被安裝到你的項(xiàng)目中泣洞。也許是你明確指定安裝它的,或許它是你安裝的包的依賴之一默色。yarn why 將幫助你查明原因球凰。

yarn why 文檔

yarn upgrade [package]

這個(gè)命令將更新包到符合 package.json 設(shè)定規(guī)則的最新的版本,并重新創(chuàng)建 yarn.lock 文件腿宰。它和 npm update 類似呕诉。

有趣的是,當(dāng)指定包的時(shí)候吃度,它將會(huì)將這個(gè)包更新到最新版并更新 package.json 中定義的標(biāo)簽。這意味著這個(gè)命令可能將包更新到一個(gè)新的 major 發(fā)布。

yarn upgrade 文檔

yarn generate-lock-entry

yarn generate-lock-entry 命令將生成一個(gè) yarn.lock 文件槐壳,它是基于 package.json 中的依賴設(shè)定的坤候。這和 npm shrinkwrap 很類似。使用這個(gè)命令要謹(jǐn)慎间护,因?yàn)樗鼘⑸涉i定文件亦渗,并且當(dāng)你通過(guò) yarn add 和 yarn upgrade 更新依賴的時(shí)候,它會(huì)自動(dòng)更新汁尺。

yarn generate-lock-entry 文檔

npm shrinkwrap 文檔

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

Yarn 的快車可能脫軌嗎法精?在發(fā)布的第一天,它確實(shí)收到了很多問(wèn)題反饋均函,但是解決問(wèn)題的效率同樣驚人亿虽。這都意味著社區(qū)在努力尋找并解決問(wèn)題“玻看看這些問(wèn)題的數(shù)量和種類后我們知道洛勉,Yarn 對(duì)于大多數(shù)用戶都是更加穩(wěn)定的,但是對(duì)于一些邊緣情況如迟,可能就不太適合了收毫。

注意攻走,盡管可能包管理對(duì)于你的項(xiàng)目非常重要,它也僅僅是一個(gè)包管理器此再。如果真的有什么問(wèn)題出現(xiàn)了昔搂,重裝包并不難,切回使用 npm 也不難输拇。

展望將來(lái)

也許你知道 Node.js 和 io.js 的歷史摘符。概括的說(shuō),io.js 是 Node.js 的一個(gè)分叉策吠,由于 Node.js 項(xiàng)目的管理出現(xiàn)了分歧逛裤,一些核心貢獻(xiàn)者就創(chuàng)建了 io.js。但是猴抹,io.js 選擇了開(kāi)源带族。不到一年的時(shí)間,兩個(gè)團(tuán)隊(duì)又達(dá)成了一致蟀给,于是 io.js 又合并回了 Node.js蝙砌,io.js 的研發(fā)也就不再進(jìn)行了。無(wú)論這樣的選擇現(xiàn)在來(lái)看是對(duì)是錯(cuò)跋理,這件事的結(jié)果是為 Node.js 引入了很多很棒的功能择克。

我現(xiàn)在在 npm 和 Yarn 上看到了類似的模式。盡管 Yarn 不是一個(gè)分叉薪介,但是它改進(jìn)了數(shù)個(gè) npm 的漏洞祠饺。如果 npm 從中學(xué)習(xí),并要求 Facebook汁政,Google 以及其他 Yarn 貢獻(xiàn)者轉(zhuǎn)而幫助 npm 優(yōu)化道偷,這不是很好的事情嗎?盡管現(xiàn)在這樣說(shuō)有些早了记劈,但是我希望如此勺鸦。

不管怎樣,Yarn 的未來(lái)都是光明的目木。這個(gè)新的包管理器的出現(xiàn)讓社區(qū)里的人都感到很興奮换途,并且人們也漸漸接受了它。不幸的是刽射,它沒(méi)有任何規(guī)劃說(shuō)明军拟,所以我也不知道 Yarn 會(huì)給我們準(zhǔn)備什么驚喜。

總結(jié)

和 npm 相比誓禁,Yarn 的評(píng)分更高懈息。我們可以自由的獲取鎖定文件,安裝包的速度也驚人的快摹恰,而且它們會(huì)被自動(dòng)的保存到 package.json辫继。安裝并使用 Yarn 的缺點(diǎn)也很少怒见。你可以先在一個(gè)項(xiàng)目中試用它,看看是否適合于你姑宽。這樣遣耍,Yarn 就成為了 npm 一個(gè)替代品。

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

我強(qiáng)烈推薦你在一個(gè)項(xiàng)目中試試看 Yarn炮车。如果你對(duì)于安裝和使用新的軟件很謹(jǐn)慎舵变,也請(qǐng)給它幾個(gè)月的時(shí)間。畢竟瘦穆,npm 是經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的棋傍,這在軟件開(kāi)發(fā)的世界中,絕對(duì)值得难审。

如果你正巧在等著 npm 安裝包,也許正好可以讀一讀遷移到 Yarn 的指南 ;)

看完文章后你覺(jué)得怎樣亿絮?你已經(jīng)在使用 Yarn 了嗎告喊?你愿意嘗試嗎?或者你認(rèn)為這僅會(huì)導(dǎo)致一個(gè)已經(jīng)很分散的生態(tài)圈的進(jìn)一步分裂派昧?請(qǐng)?jiān)谠u(píng)論區(qū)寫(xiě)下你的看法黔姜。

如果發(fā)現(xiàn)譯文存在錯(cuò)誤或其他需要改進(jìn)的地方,歡迎到 掘金翻譯計(jì)劃 對(duì)譯文進(jìn)行修改并 PR蒂萎,也可獲得相應(yīng)獎(jiǎng)勵(lì)積分秆吵。文章開(kāi)頭的 本文永久鏈接 即為本文在 GitHub 上的 MarkDown 鏈接。

掘金翻譯計(jì)劃 是一個(gè)翻譯優(yōu)質(zhì)互聯(lián)網(wǎng)技術(shù)文章的社區(qū)五慈,文章來(lái)源為 掘金 上的英文分享文章纳寂。內(nèi)容覆蓋 Android、iOS泻拦、前端毙芜、后端、區(qū)塊鏈争拐、產(chǎn)品腋粥、設(shè)計(jì)、人工智能等領(lǐng)域架曹,想要查看更多優(yōu)質(zhì)譯文請(qǐng)持續(xù)關(guān)注 掘金翻譯計(jì)劃隘冲、官方微博、知乎專欄绑雄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末展辞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绳慎,更是在濱河造成了極大的恐慌纵竖,老刑警劉巖漠烧,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異靡砌,居然都是意外死亡已脓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)通殃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)度液,“玉大人,你說(shuō)我怎么就攤上這事画舌《榈#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵曲聂,是天一觀的道長(zhǎng)霹购。 經(jīng)常有香客問(wèn)我,道長(zhǎng)朋腋,這世上最難降的妖魔是什么齐疙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮旭咽,結(jié)果婚禮上贞奋,老公的妹妹穿的比我還像新娘。我一直安慰自己穷绵,他們只是感情好轿塔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仲墨,像睡著了一般勾缭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宗收,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天漫拭,我揣著相機(jī)與錄音,去河邊找鬼混稽。 笑死采驻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匈勋。 我是一名探鬼主播礼旅,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洽洁!你這毒婦竟也來(lái)了痘系?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饿自,失蹤者是張志新(化名)和其女友劉穎汰翠,沒(méi)想到半個(gè)月后龄坪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡复唤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年健田,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛纫。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妓局,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呈宇,到底是詐尸還是另有隱情好爬,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布甥啄,位于F島的核電站存炮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蜈漓。R本人自食惡果不足惜僵蛛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迎变。 院中可真熱鬧,春花似錦飘言、人聲如沸衣形。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谆吴。三九已至,卻和暖如春苛预,著一層夾襖步出監(jiān)牢的瞬間句狼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工热某, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腻菇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓昔馋,卻偏偏與公主長(zhǎng)得像筹吐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秘遏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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