[譯] 關(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ì)劃隘冲、官方微博、知乎專欄绑雄。