首頁 >web前端 >js教程 >紗線與NPM:您需要知道的一切

紗線與NPM:您需要知道的一切

Jennifer Aniston
Jennifer Aniston原創
2025-02-09 09:28:13397瀏覽

Yarn vs npm: Everything You Need to Know

本文將深入探討 Yarn 和 npm 這兩大流行的 JavaScript 包管理器,並對它們各自的優缺點進行比較,助您為項目選擇合適的工具。

核心要點

  • Yarn 和 npm 都是流行的包管理器,各有優劣。由 Facebook 開發的 Yarn 速度更快、安全性更高,依賴管理更可靠。 npm 作為 Node.js 的默認包管理器,擁有更大的用戶群體,其更簡單的語法也更易於初學者上手。
  • Yarn 並行安裝包,通常比 npm(順序安裝包)更快。但是,最新版本的這兩個包管理器的速度相當。
  • 在安全性方面,Yarn 使用校驗和在執行包代碼之前驗證每個已安裝包的完整性。 npm 在最近的版本中也對其安全功能進行了重大改進,包括在安裝過程中進行包審計。
  • Yarn 提供獨特的特性,如 Plug’n’Play、零安裝和內置許可證檢查器。但是,與 npm 相比,它需要更多的磁盤空間。 Yarn 和 npm 之間的選擇應基於個人的需求和工作流程偏好。

基礎知識

在過去,簡單的文本編輯器足以讓開發者創建和管理大部分項目。但如今,網絡發生了翻天覆地的變化。現在,即使是一個相當簡單的項目,也可能包含數百甚至數千個腳本,以及復雜的嵌套依賴關係,如果沒有某種自動化工具,這些依賴關係根本無法管理。這就是包管理器發揮作用的地方。

包管理器是一種工具,它可以以多種方式自動處理項目的依賴關係。例如,借助包管理器,我們可以安裝、卸載、更新和升級包,配置項目設置,運行腳本等等。所有繁瑣的工作都由包管理器完成,我們只需要專注於編碼本身。

npm 代表 Node 包管理器 (Node Package Manager)。它於 2010 年發布,開啟了 Web 開發的新時代。在此之前,項目依賴項是手動下載和管理的。 npm 正是推動 Web 發展到更高水平的魔杖。

npm 實際上包含三部分:

  • 一個網站,用於管理 npm 體驗的各個方面;
  • 一個註冊表,用於訪問龐大的公共 JavaScript 包數據庫;
  • 一個命令行界面 (CLI),用於通過終端與 npm 交互。

但是,當大多數人談論 npm 時,他們通常指的是最後一種——CLI 工具。它作為默認的包管理器與每個新的 Node 安裝一起提供。這意味著您可以立即開始使用它。

如果您想深入了解 npm 的使用方法,請參閱我們的 Node 包管理器指南。

Yarn 代表 Yet Another Resource Negotiator(另一種資源協商器)。 Yarn 包管理器是 npm 的替代方案,由 Facebook 於 2016 年 10 月發布。 Yarn 的最初目標是解決 npm 的缺點,例如性能和安全問題。 Yarn 迅速成為安全、快速和可靠的 JavaScript 依賴項管理工具。

但 npm 團隊吸取了教訓,並通過實現缺失的功能迅速彌補了 npm 的不足。

讓我們快速回顧一下歷史,以了解全局情況:

  • 2010 年:npm 發布,支持 Node。
  • 2016 年:Yarn 發布。它顯示出比 npm 更高的性能。它還會生成一個 yarn.lock 文件,使共享和精確複製存儲庫更容易且更可預測。
  • 2017 年:npm 5 發布。它提供了 package-lock.json 文件的自動生成功能,以回應 yarn.lock。
  • 2018 年:npm 6 發布,安全性得到改進。現在 npm 會在安裝依賴項之前檢查安全漏洞。
  • 2020 年:Yarn 2 和 npm 7 發布。這兩個包都具有強大的新功能,我們將在本教程的後面部分看到。
  • 2021 年:Yarn 3 發布,並進行了各種改進。

如今,這兩個包管理器在包管理競賽中不相上下,提供類似的功能。但仍然存在一些差異,有助於我們確定使用哪個。

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

Yarn 與 npm:安裝比較

我們將從 npm 和 Yarn 的安裝過程開始比較。

安裝包管理器本身

如上所述,npm 預裝在 Node 中,因此無需手動安裝 npm。

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

<code class="language-bash">npm install -g yarn</code>

然後,我們可以通過在項目根目錄中運行 yarn set version 命令,在每個項目的基礎上使用它:

<code class="language-bash">yarn set version berry</code>

在這種情況下,berry 是我們想要設置的版本。

如果我們想更新到最新版本,我們運行以下命令:

<code class="language-bash">yarn set version latest</code>

使用 Yarn,我們可以為每個項目使用不同的版本。

要使用 npm 執行相同的操作,您需要安裝 nvm(Node 版本管理器)。以下是如何使用 nvm 安裝多個 Node 版本的方法。

安裝項目依賴項

現在,讓我們看看如何安裝項目依賴項。

當我們運行 npm install 時,依賴項會依次安裝。終端中的輸出日誌信息豐富,但有點難以閱讀。

要使用 Yarn 安裝包,我們運行 yarn 命令。 Yarn 並行安裝包,這是它比 npm 更快的原因之一。如果您使用的是 Yarn 1,您會看到 yarn 輸出日誌簡潔明了,視覺上易於區分。它們也以樹狀形式排序,便於理解。但在版本 2 和 3 中,日誌並不那麼直觀易懂。

到目前為止,我們已經看到 npm 和 Yarn 有不同的安裝包命令。在下一節中,我們將探討更多命令。

比較 npm 和 Yarn 命令

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

  • npm init | yarn init:創建一個新包
  • npm run | yarn run:運行 package.json 中定義的腳本
  • npm test | yarn test:測試包
  • npm publish | yarn publish:發布包
  • npm cache clean | yarn cache clean:刪除緩存文件夾中的所有數據

這些命令使在兩個管理器之間切換變得容易,但有一些不相同的命令可能會造成混淆。讓我們在下一個列表中看看它們是什麼:

  • npm install | yarn:安裝依賴項
  • npm install [package] | yarn add [package]:安裝包
  • npm install --save-dev [package] | yarn add --dev [package]:安裝包作為開發依賴項
  • npm uninstall [package] | yarn remove [package]:卸載包
  • npm uninstall --save-dev [package] | yarn remove [package]:卸載開發依賴項包
  • npm update | yarn upgrade:更新依賴項
  • npm update [package] | yarn upgrade [package]:更新包

Yarn 還有一些 npm 沒有的獨特命令。例如,why 命令顯示需要包的原因:它可能是依賴項、本地模塊或項目依賴項。

Yarn 與 npm:速度和性能

每當 Yarn 或 npm 需要安裝包時,它們都會執行一系列任務。在 npm 中,這些任務是按包依次執行的,這意味著它會在一個包完全安裝後才會繼續下一個包。相反,Yarn 並行執行這些任務,從而提高了性能。

雖然這兩個管理器都提供緩存機制,但 Yarn 似乎做得更好一些。通過實現零安裝範例(我們將在功能比較部分看到),它能夠幾乎立即安裝包。它緩存每個包並將其保存在磁盤上,因此下次安裝此包時,您甚至不需要互聯網連接,因為包是從磁盤離線安裝的。

儘管 Yarn 有一些優勢,但在其最新版本中,Yarn 和 npm 的速度相當。因此,我們在這裡無法定義一個明確的贏家。

Yarn 與 npm:安全比較

對 npm 的主要批評之一是關於安全性的。之前的 npm 版本有一些嚴重的安全性漏洞。

從版本 6 開始,npm 在安裝過程中會審計包,並告知您是否發現任何漏洞。我們可以通過對已安裝的包運行 npm audit 來手動執行此檢查。如果發現任何漏洞,npm 將向我們提供安全建議。

Yarn vs npm: Everything You Need to Know

如上圖所示,我們可以運行 npm audit fix 來修復包漏洞,如果可以修復,則依賴項樹也將被修復。

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

Yarn 與 npm:功能比較

與命令一樣,npm 和 Yarn 也共享一些功能,但也有一些區別。讓我們首先探討這兩個包管理器共享的共同功能。

生成鎖定文件

在 package.json(npm 和 Yarn 用於跟踪項目依賴項的文件)中,版本號並不總是精確的。相反,您可以定義一個版本範圍。這樣,您可以選擇包的特定主要版本和次要版本,但允許 npm 安裝可能修復某些錯誤的最新補丁。

在語義版本控制的理想世界中,補丁版本不會包含任何重大更改。但不幸的是,情況並非總是如此。 npm 使用的策略可能會導致兩台機器最終擁有相同的 package.json 文件,但安裝了不同版本的包——這可能會引入錯誤。

為了避免包版本不匹配,已安裝的精確版本會固定在包鎖定文件中。每次添加模塊時,npm 和 Yarn 分別創建(或更新)package-lock.json 和 yarn.lock 文件。這樣,您可以保證另一台機器安裝完全相同的包,同時仍然在 package.json 中定義了一系列允許的版本。

使用工作區

工作區允許您擁有一個 monorepo 來管理多個項目中的依賴項。這意味著您有一個單一的頂級根包,它有多個稱為工作區的子包。

遠程運行腳本

npx 命令用於從 ./node_modules/.bin 運行腳本。它還允許您從 npm 註冊表執行包,而無需將它們安裝到您的項目依賴項中。例如,您可以通過運行以下命令來創建一個新的 React 應用程序:

<code class="language-bash">npm install -g yarn</code>

在 Yarn 中,您可以使用等效的 dlx 命令來實現相同的結果:

<code class="language-bash">yarn set version berry</code>

我們將探討的其餘功能是 Yarn 獨有的。

零安裝

零安裝將緩存存儲在您的項目目錄中,位於 .yarn 文件夾中。當您使用 yarn 或 yarn add 等命令時,Yarn 將創建一個 .pnp.cjs 文件。此文件包含 Node 用於加載項目包的依賴項層次結構。因此,您可以幾乎立即訪問它們。

Plug’n’Play

Plug’n’Play 是一種替代安裝策略。 Yarn 不會生成 node_modules 目錄並將解析留給 Node,而是生成單個 .pnp.cjs 文件,該文件將包映射到磁盤上的位置及其依賴項列表。此功能可以加快項目啟動速度,優化依賴項樹,加快安裝速度,當然還可以消除對 node_modules 文件夾的需求。

許可證

Yarn 內置了一個許可證檢查器,這在開發應用程序的不同場景中非常有用。

Yarn 與 npm:選擇哪個包管理器

我們已經介紹了 npm 和 Yarn 的各種異同,但我們還沒有確定哪個更好,以及我們應該選擇哪個。一如既往,答案取決於我們的願望和需求。

作為一般指南,我總結如下建議:

  • 如果您對當前的工作流程感到滿意,不想安裝其他工具,並且磁盤空間不足,請選擇 npm。
  • 如果您想要一些強大的功能,例如 Plug’n’Play,需要 npm 中缺少的一些功能,並且有足夠的磁盤空間,請選擇 Yarn。

如果您仍然難以在 npm 和 Yarn 之間做出明確的決定,那麼您可以檢查 pnpm,它試圖結合這兩個包管理器的優點,並且是包管理池中的第三大巨頭。

Yarn 與 npm:結論

我們已經了解了包管理器對於現代 Web 開發的重要性,並且我們比較了市場上最流行的兩個競爭對手。它們都有各自的優點和缺點,為了選擇最適合您的,您需要清楚地了解您的需求。決定哪個更適合您的最佳方法是嘗試兩者,看看哪個性能更好。

最後,不要過度思考。只需選擇一個,然後轉到有趣的部分:創建很棒的應用程序!

關於 Yarn 與 npm 的常見問題解答

Yarn 和 npm 的主要區別是什麼?

Yarn 和 npm 都是 JavaScript 的包管理器,但它們有一些關鍵區別。 Yarn 由 Facebook 開發,旨在解決 npm 的一些缺點。它提供了更高的速度、更好的安全性以及更可靠的依賴項管理。另一方面,npm 是 Node.js 的默認包管理器,擁有更大的用戶群。由於其更簡單的語法,它也更容易被初學者使用。

Yarn 比 npm 快嗎?

是的,Yarn 通常比 npm 快。這是因為 Yarn 並行安裝包,這大大加快了安裝過程。另一方面,npm 順序安裝包,這可能會比較慢。

Yarn 的安全性與 npm 的安全性相比如何?

Yarn 有一個名為校驗和的功能,它在執行已安裝包的代碼之前驗證其完整性。這增加了一層 npm 不具備的額外安全層。但是,npm 在最近的版本中對其安全功能進行了重大改進。

我可以在同一個項目中同時使用 Yarn 和 npm 嗎?

雖然從技術上講可以在同一個項目中同時使用 Yarn 和 npm,但不建議這樣做。這是因為 Yarn 和 npm 以不同的方式處理依賴項,這可能會導致項目中的不一致和錯誤。

Yarn 與 npm 相比如何處理依賴項?

Yarn 使用鎖定文件來鎖定項目依賴項的版本。這確保了在所有機器上,每次安裝都會產生 node_modules 中完全相同的文件夾結構。 npm 也使用鎖定文件,但它不如 Yarn 的嚴格。

Yarn 比 npm 更可靠嗎?

由於其嚴格的鎖定文件和校驗和功能,Yarn 通常被認為比 npm 更可靠。但是,npm 在最近的版本中在可靠性方面取得了重大改進。

Yarn 的社區支持與 npm 的社區支持相比如何?

由於存在時間較長,npm 擁有更大的社區和更多可用的包。但是,Yarn 越來越受歡迎,並且擁有不斷壯大的社區。

從 npm 切換到 Yarn 的一些挑戰是什麼?

從 npm 切換到 Yarn 的一些挑戰包括學習新的語法、遷移現有項目以及適應 Yarn 嚴格的依賴項管理。

Yarn 的語法與 npm 的語法相比如何?

Yarn 的語法與 npm 的語法略有不同。例如,要使用 Yarn 安裝包,可以使用命令“yarn add”,而使用 npm,則可以使用“npm install”。

對於初學者來說,Yarn 還是 npm 更好?

由於其更簡單的語法和更大的社區,npm 通常被認為更容易被初學者使用。但是,Yarn 提供了更高級的功能,並且對於更有經驗的開發人員來說是一個不錯的選擇。

以上是紗線與NPM:您需要知道的一切的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn