App下載

Yarn vs npm:你需要知道的一切

鋼琴上的芭蕾 2021-09-23 14:50:32 瀏覽數(shù) (8809)
反饋

在本教程中,我們將比較 Yarn 與 npm — 兩個(gè)最流行的包管理器。我們會(huì)將它們并排放置并探索它們各自的優(yōu)缺點(diǎn),以幫助您選擇要用于您的項(xiàng)目的哪一個(gè)。

布置基礎(chǔ)知識(shí)

以前,一個(gè)簡(jiǎn)單的文本編輯器足以讓開發(fā)人員創(chuàng)建和管理他們的大部分項(xiàng)目。但隨著技術(shù)的發(fā)展,Web 也發(fā)生了巨大的變化。如今,即使是一個(gè)相當(dāng)簡(jiǎn)單的項(xiàng)目有成百上千個(gè)腳本也是很常見的,而且還具有復(fù)雜的嵌套依賴項(xiàng)。如果沒有某種自動(dòng)化工具,這些腳本根本無(wú)法管理。這就是包管理器發(fā)揮作用的地方。

一個(gè)包管理器是一種工具,以各種不同的方式自動(dòng)處理項(xiàng)目的依賴。例如,在包管理器的幫助下,我們可以安裝、卸載、更新和升級(jí)包,配置項(xiàng)目設(shè)置,運(yùn)行腳本等。所有艱苦而乏味的工作都由包管理器完成,只剩下有趣的部分——編碼本身。

npm代表節(jié)點(diǎn)包管理器。它于 2010 年發(fā)布,開啟了 Web 開發(fā)的新時(shí)代。在此之前,項(xiàng)目依賴項(xiàng)是手動(dòng)下載和管理的。npm 是將 Web 推向新高度的魔杖。

npm 實(shí)際上涉及三件事:

  • 一個(gè)用于管理 npm 體驗(yàn)各個(gè)方面的網(wǎng)站
  • 一個(gè)注冊(cè)表訪問的JavaScript包的廣泛公共數(shù)據(jù)庫(kù)
  • 用于通過(guò)終端與 npm 交互的命令行界面(CLI)

然而,當(dāng)大多數(shù)人談?wù)?npm 時(shí),他們通常指的是最后一個(gè)——CLI 工具。它作為默認(rèn)包管理器隨每個(gè)新的 Node 安裝一起提供。這意味著您可以立即開始使用它。

如果您想深入了解如何使用 npm,請(qǐng)參閱我們的NPM 教程。

?Yarn?代表另一個(gè)資源管理器。Yarn 包管理器是 npm 的替代品,由 Facebook 于 2016 年 10 月發(fā)布。 Yarn 的最初目標(biāo)是處理 npm 的缺點(diǎn),例如性能和安全問題。Yarn 很快被定位為安全、快速、可靠的 JavaScript 依賴管理工具。

但是 npm 團(tuán)隊(duì)吸取了教訓(xùn),并通過(guò)實(shí)現(xiàn)缺失的功能迅速填補(bǔ)了 npm 的空白。

讓我們快速穿越時(shí)空,看看大圖:

  • 2010 年:npm 發(fā)布,支持 Node.js。
  • 2016 年:發(fā)布紗線。它顯示出比 npm 更高的性能。它還生成一個(gè)yarn.lock文件,使 repos 的共享和精確復(fù)制變得更加容易和可預(yù)測(cè)。
  • 2017 年:npm 5 發(fā)布。它提供自動(dòng)生成package-lock.json文件以響應(yīng)yarn.lock.
  • 2018 年:npm 6 發(fā)布,提高了安全性?,F(xiàn)在 npm 在安裝依賴項(xiàng)之前檢查安全漏洞。
  • 2020 年:Yarn 2 和 npm 7 發(fā)布。這兩個(gè)軟件包都帶有很棒的新功能,我們將在本教程后面看到。
  • 2021 年:Yarn 3 發(fā)布并進(jìn)行了各種改進(jìn)。

如今,這兩個(gè)包管理器在包管理競(jìng)賽中并駕齊驅(qū),提供相似的特性和功能。但是仍有一些差異有助于確定我們選擇使用哪個(gè)。

在本教程的其余部分,我們將探討 npm 和 Yarn 之間的主要異同。

Yarn 與 npm:安裝比較

我們將從 npm 和 Yarn 的安裝過(guò)程開始我們的比較探索。

安裝包管理器本身

正如我上面提到的,npm 預(yù)裝了 Node,所以不需要手動(dòng)安裝 npm。

相比之下,Yarn 需要顯式安裝。首先,我們需要全局安裝 Yarn:

npm install -g yarn

然后,我們可以通過(guò)在我們的項(xiàng)目中設(shè)置所需的版本,在每個(gè)項(xiàng)目的基礎(chǔ)上使用它。我們通過(guò)yarn set version在項(xiàng)目的根目錄中運(yùn)行命令來(lái)做到這一點(diǎn):

yarn set version berry

在這種情況下,berry是我們要設(shè)置的版本。

如果我們想更新到最新版本,我們運(yùn)行:

yarn set version latest

使用 Yarn,我們可以為每個(gè)項(xiàng)目使用不同的版本。

要對(duì) npm 執(zhí)行相同操作,您需要安裝?nvm?(節(jié)點(diǎn)版本管理器)。以下是如何使用 ?nvm ?安裝多個(gè)版本的 Node。

安裝項(xiàng)目依賴

現(xiàn)在,讓我們看看如何安裝項(xiàng)目依賴項(xiàng)。

當(dāng)我們運(yùn)行時(shí)?npm install?,依賴項(xiàng)會(huì)依次安裝,一個(gè)接一個(gè)。終端中的輸出日志信息豐富,但有點(diǎn)難以閱讀。

要使用 Yarn 安裝軟件包,我們運(yùn)行yarn命令。Yarn 并行安裝包,這是它比 npm 更快的原因之一。如果您使用的是 Yarn 1 版本,您會(huì)看到 Yarn 輸出日志是干凈的、視覺上可區(qū)分的和簡(jiǎn)短的。為了便于理解,它們也以樹的形式排列。但這在版本 2 和 3 中發(fā)生了變化,其中日志不是那么直觀和人類可讀。

到目前為止,我們已經(jīng)看到 npm 和 Yarn 有不同的安裝包命令。在下一節(jié)中,我們將探索更多命令。

比較 npm 和 Yarn 命令

npm 和 Yarn 共享許多命令,但也有許多不同的命令。讓我們首先探索一些相同的命令:

  • ?npm init?| ?yarn init?: 創(chuàng)建一個(gè)新包
  • ?npm run?| ?yarn run?: 運(yùn)行定義在package.json
  • ?npm test?| ?yarn test?: 測(cè)試一個(gè)包
  • ?npm publish?| ?yarn publish?: 發(fā)布包
  • ?npm cache clean?| ?yarn cache clean?:從緩存文件夾中刪除所有數(shù)據(jù)

這些命令使兩個(gè)管理器之間的切換變得容易,但有一些不同的命令可能會(huì)導(dǎo)致混淆。讓我們看看它們?cè)谙乱粋€(gè)列表中是什么:

  • ??npm install?| ?yarn??: 安裝依賴
  • ?npm install [package]?| ?yarn add [package]?: 安裝一個(gè)包
  • ?npm install --save-dev [package]?| ?yarn add - -dev [package]?: 安裝一個(gè)包作為開發(fā)依賴
  • ?npm uninstall [package]?| ?yarn remove [package]?: 卸載一個(gè)包
  • ?npm uninstall --save-dev [package]?| ?yarn remove [package]?: 卸載開發(fā)依賴包
  • ?npm update?| ?yarn upgrade?: 更新依賴
  • ?npm update [package]?| ?yarn upgrade [package]?: 更新一個(gè)包

Yarn 也有一些獨(dú)特的命令,它們沒有 npm 等效項(xiàng)。例如,?why?命令顯示需要包的原因:它可能是依賴項(xiàng)、本機(jī)模塊或項(xiàng)目依賴項(xiàng)。

Yarn 與 npm:速度和性能

每當(dāng) Yarn 或 npm 需要安裝包時(shí),它們都會(huì)執(zhí)行一系列任務(wù)。在 npm 中,這些任務(wù)是按包順序執(zhí)行的,這意味著它會(huì)等待一個(gè)包完全安裝,然后再繼續(xù)下一個(gè)。相比之下,Yarn 并行執(zhí)行這些任務(wù),從而提高了性能。

雖然這兩個(gè)管理器都提供緩存機(jī)制,但 Yarn 似乎做得更好一些。通過(guò)實(shí)現(xiàn)零安裝范例,我們將在功能比較部分看到,它幾乎可以立即安裝軟件包。它緩存每個(gè)包并將其保存在磁盤上,因此在此包的下一次安裝中,您甚至不需要互聯(lián)網(wǎng)連接,因?yàn)樵摪菑拇疟P離線安裝的。

盡管 Yarn 有一些優(yōu)勢(shì),但 Yarn 和 npm 在它們的最新版本中的速度相當(dāng)。所以我們不能在這里定義一個(gè)干凈的贏家。

Yarn 與 npm:安全性比較

對(duì) npm 的主要批評(píng)之一是關(guān)于安全性。以前的 npm 版本有幾個(gè)嚴(yán)重的安全漏洞。

從版本 6 開始,npm 會(huì)在安裝過(guò)程中審核軟件包并告訴您是否發(fā)現(xiàn)了任何漏洞。我們可以通過(guò)npm audit針對(duì)已安裝的軟件包運(yùn)行來(lái)手動(dòng)執(zhí)行此檢查。如果發(fā)現(xiàn)任何漏洞,npm 會(huì)給我們安全建議。

npm 審計(jì)報(bào)告不安全的包

正如你在上面的截圖中看到的,我們可以運(yùn)行?npm audit fix?來(lái)修復(fù)包漏洞,如果可能的話,依賴樹將被修復(fù)。

Yarn 和 npm 都使用加密哈希算法來(lái)確保包的完整性。

Yarn 與 npm:功能比較

就像命令一樣,一些特性是 npm 和 Yarn 共享的,但也有一些不同。讓我們首先探討這兩個(gè)包管理器共享的共同功能。

生成鎖定文件

在?package.json? npm 和 Yarn 跟蹤項(xiàng)目依賴項(xiàng)的文件中,版本號(hào)并不總是準(zhǔn)確的。相反,您可以定義一系列版本。這樣,您可以選擇包的特定主要和次要版本,但允許 npm 安裝可能修復(fù)某些錯(cuò)誤的最新補(bǔ)丁。

在語(yǔ)義版本控制的理想世界中,補(bǔ)丁版本不會(huì)包含任何破壞性更改。但不幸的是,情況并非總是如此。npm 采用的策略可能會(huì)導(dǎo)致兩臺(tái)機(jī)器以相同的package.json文件結(jié)束,但安裝了不同版本的軟件包——這可能會(huì)引入錯(cuò)誤。

為避免包版本不匹配,確切安裝的版本被固定在包鎖定文件中。每次添加模塊時(shí),npm 和 Yarn 分別創(chuàng)建(或更新)一個(gè)package-lock.json和yarn.lock文件。這樣,您可以保證另一臺(tái)機(jī)器安裝完全相同的軟件包,同時(shí)仍然具有package.json.

使用工作區(qū)

工作區(qū)允許您擁有一個(gè)?monorepo?來(lái)管理跨多個(gè)項(xiàng)目的依賴項(xiàng)。這意味著您有一個(gè)單一的頂級(jí)根包,其中包含多個(gè)稱為工作區(qū)的子包。

遠(yuǎn)程運(yùn)行腳本

該npx命令用于從?./node_modules/.bin. ?它還允許您從 npm 注冊(cè)表中執(zhí)行包,而無(wú)需將它們安裝在您的項(xiàng)目依賴項(xiàng)中。例如,您可以通過(guò)運(yùn)行以下命令來(lái)創(chuàng)建一個(gè)新的 React 應(yīng)用程序:

npx create-react-app my-app

在 Yarn 中,您可以使用等效?dlx?命令獲得相同的結(jié)果:

yarn dlx create-react-app my-app

我們將要探索的其余功能是 Yarn 獨(dú)有的。

零安裝

零安裝將緩存存儲(chǔ)在您的項(xiàng)目目錄中的一個(gè).yarn文件夾中。當(dāng)您使用?yarn?或?yarn add <package>?等命令時(shí),Yarn 將創(chuàng)建一個(gè)?.pnp.cjs?文件。此文件包含 Node 用于加載項(xiàng)目包的依賴關(guān)系層次結(jié)構(gòu)。因此,您幾乎可以在零時(shí)間訪問它們。

即插即用

?Plug'n'Play? 是另一種安裝策略。?node_modulesYarn ?沒有生成目錄并將解析留給 Node,而是生成一個(gè)?.pnp.cjs?文件,將包映射到它們?cè)诖疟P上的位置和它們的依賴項(xiàng)列表。這個(gè)特性可以帶來(lái)更快的項(xiàng)目啟動(dòng)、更好的優(yōu)化依賴樹、更快的安裝時(shí)間,當(dāng)然也不需要?node_modules?文件夾。

執(zhí)照

Yarn 包含一個(gè)內(nèi)置的許可證檢查器,當(dāng)您開發(fā)應(yīng)用程序時(shí),它可以在不同的場(chǎng)景中使用。

Yarn vs npm:選擇哪個(gè)包管理器

我們已經(jīng)介紹了 npm 和 Yarn 的各種異同,但我們還沒有確定哪個(gè)更好,我們應(yīng)該選擇哪個(gè)。與以往一樣,答案取決于我們的愿望和要求。

作為一般指南,讓我總結(jié)以下建議:

  • 如果您對(duì)當(dāng)前的工作流程感到滿意,不想安裝額外的工具,并且您沒有大量磁盤空間,請(qǐng)選擇 npm。
  • 如果您想要一些很棒的功能,例如 ?Plug'n'Play?,您需要一些 npm 中缺少的功能,并且您有足夠的磁盤空間,請(qǐng)選擇 Yarn。

如果你仍然很難在 npm 和 Yarn 之間做出明確的決定,那么你可以查看?pnpm?,它試圖結(jié)合兩個(gè)包管理器的優(yōu)點(diǎn),是包管理池中的第三大魚。

Yarn 與 npm:結(jié)論

我們已經(jīng)看到包管理器對(duì)于現(xiàn)代 Web 開發(fā)的重要性,并且我們比較了市場(chǎng)上兩個(gè)最受歡迎的競(jìng)爭(zhēng)對(duì)手。它們都有各自的優(yōu)點(diǎn)和缺點(diǎn),為了選擇最適合您的,您需要清楚自己的要求。決定哪個(gè)更適合你的最好方法是嘗試它們,看看哪個(gè)表現(xiàn)更好。

最后,不要想太多。只需選擇一個(gè)并轉(zhuǎn)到有趣的部分:創(chuàng)建出色的應(yīng)用程序!


1 人點(diǎn)贊