歡迎關注前端早茶,與廣東靚仔攜手共同進階
前端早茶專注前端,一起結伴同行,緊跟業界發展步伐~
前言
在過去,一個簡單的文本編輯器就足以讓開發人員創建和管理大部分項目。但從那以后,WEB發生了翻天覆地的變化,如今,即使是一個相當簡單的項目,通常也會有成百上千個帶有復雜嵌套依賴關系的腳本,如果沒有自動化工具,這些腳本根本無法有序的管理,這時就需要包管理器。
包管理器是一種以各種方式自動處理項目依賴關系的工具。例如,在包管理器的幫助下,可以安裝、卸載、更新和升級包,配置項目設置、運行腳本等等。所有復雜和乏味的工作都由包管理器完成,讓開發人員專注於編碼。
npm 是Node的包管理器,它於2010年發布,開啟了web開發的新時代。在此之前,項目依賴庫都是手動下載和管理的,npm 是把WEB開發推向了一個更高的階段。
npm 主要做三件事:
- 一個用於管理 npm 體驗各個方面的網站
- 用於訪問廣泛的 JavaScript 包公共數據庫的注冊表
- 用於通過終端與 npm 交互的命令行界面(CLI)
然而,大多數人談論 npm 時,通常指的是最后一個 CLI 工具。它作為默認包管理器與每個新的 Node版本一起發布。
yarn 代表另一個資源談判者。yarn 包管理器是 npm 的一個替代方案,由Facebook於2016年10月發布。yarn最初的目標是處理npm的缺點,比如性能和安全問題。yarn很快被定位為一個安全、快速、可靠的JavaScript依賴管理工具。
但是 npm 團隊吸取了教訓,並通過實現缺失的功能迅速填補了 npm 的空白。
下面來看一個時間線:
- 2010年:發布了支持Node的npm。
- 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 的安裝過程開始來進行比較。
安裝包管理器
正如上面提到的,npm 是預先安裝在 Node 中的,所以一般不需要手動安裝 npm。
相反,yarn 需要顯式安裝,首先,需要全局安裝 yarn:
npm install -g yarn
然后,可以通過在項目中設置所需的版本,在每個項目的基礎上使用它。通過在項目的根目錄中運行 yarn set version 命令來設置所需要的版本:
yarn set version berry
berry 就是要設置的版本號。如果想更新到最新版本,運行:
yarn set version latest
使用 yarn,可以為每個項目使用不同的版本。而對 npm 要實現同樣的需求,則需要安裝 nvm(Node版本管理器)。
安裝項目依賴
現在,就來看看如何安裝項目依賴項。 當運行 npm install 時,依賴項會依次安裝,終端中會輸出詳細的安裝日志,不過閱讀性不好。
使用 yarn 安裝包,運行 yarn 命令。yarn 是並行安裝包的,這也是它比 npm 快的原因之一。如果正在使用 yarn 1,將看到 yarn 輸出的安裝日志比較簡潔,閱讀性也比較好。為了方便閱讀,它們以樹狀排列。但是這在版本2和版本3中有所改變,其中的日志不是那么直觀和可讀。
到目前為止,已經看到 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 需要安裝包時,它們都會執行一系列任務。在 npm 中,這些任務是按包順序逐個執行安裝的,這意味着它會等待一個包完全安裝,然后再繼續下一個。相比之下,yarn 是並行執行這些任務,在性能上有顯著的提高。
雖然這兩種管理器都提供緩存機制,但yarn似乎做得更好一些。通過實現零安裝模式,它幾乎能夠在短時間內安裝包。它緩存每個包並將其保存在磁盤上,所以在下一次安裝這個包時,甚至不需要有互聯網連接,因為包是從磁盤離線安裝的。
盡管yarn有一些優勢,但 yarn 和 npm 在它們的最新版本中的速度相當,所以現在算不分伯仲。
安全性比較
對 npm 的主要批評之一是在安全性方面,以前的 npm 版本有幾個嚴重的安全漏洞。然而從版本 6 開始,npm 在安裝過程中審核軟件包並顯示是否發現任何漏洞。可以通過對已安裝的軟件包運行 npm audit 來手動執行此檢查,如果發現任何漏洞,npm 會給出相應的安全建議。如發現有安全漏洞,可以運行 npm audit fix 來修復包漏洞。
在安全性上,yarn 和 npm 都使用加密哈希算法來確保包的完整性。
功能比較
就如上面介紹的命令一樣,一些特性是 npm 和 yarn 共有的,但也有一些區別,下面就來介紹主要的區別。
生成的鎖定文件
在package.json 文件中,npm 和 yarn 都在其中跟蹤項目的依賴項,版本號並不總是准確的,相反,可以定義一系列版本。這樣,可以選擇一個包的主版本和小版本,但允許npm安裝可能修復一些bug的最新補丁。
在語義版本控制的理想狀態下,補丁版本不會包含任何破壞性的更改。但顯示總是和理想有區別,導致真實情況下並非如此。npm 采用的策略可能會導致兩台機器以相同的 package.json 文件結束,但安裝了不同版本的包,這就埋下了可能產生bug的問題。
為避免包版本不匹配,確切安裝的版本被固定在包鎖定文件中,每次添加模塊時,npm 和 yarn 分別創建(或更新)一個 package-lock.json 和 yarn.lock 文件。
使用工作空間
工作區允許擁有一個 monorepo 來管理跨多個項目的依賴項,這意味着有一個單一的頂級根包,其中包含多個稱為工作區的子包。
遠程運行腳本
npx 命令用於從 ./node_modules/.bin 運行腳本。它還允許從 npm 注冊表中執行包,而無需將它們安裝在項目依賴項中。例如,可以通過運行以下命令來創建一個新的 React 應用程序:
npx create-react-app my-app
在 yarn 中,可以使用等效的 dlx 命令獲得相同的結果:
yarn dlx create-react-app my-app
下面將介紹 yarn 獨有的功能。
零安裝
零安裝將緩存存儲在項目目錄中的 .yarn 文件夾中。當使用 yarn 或 yarn add <package> 等命令時,yarn 會創建一個 .pnp.cjs 文件,此文件包含 Node 用於加載項目包的依賴關系層次結構。因此,幾乎可以在零時間訪問它們。
即插即用
即插即用是另一種安裝策略,yarn 沒有生成 node_modules 目錄並將解析留給 Node,而是生成單個 .pnp.cjs 文件,該文件將包映射到它們在磁盤上的位置及其依賴項列表。這個特性可以導致更快的項目啟動、更好的優化依賴樹、更快的安裝時間,當然也不需要 node_modules 文件夾。
Licenses
yarn 包含一個內置的許可證檢查器,可在開發應用程序時在不同場景中使用。
選擇哪個包管理器
上面已經討論了 npm 和 yarn 的各種相似和不同之處,但是還沒有確定哪一個更好,應該選擇哪一個,但是還是那句話,適合的團隊或者項目的才是最重要。
下面給出一個推薦的建議:
- 選擇 npm :如果對當前的工作流程感到滿意,不想安裝額外的工具,並且沒有很多磁盤空間。
- 選擇 yarn :如果想要一些很棒的功能,比如即插即用,需要一些 npm 中缺少的功能,並且有足夠的磁盤空間
如果仍然很難在 npm 和 yarn 之間做出明確的決定,那就無需在意,隨便用那一個都基本可以滿足項目開發要求。
總結
包管理器對現代 web 開發非常的重要,本文比較了市場上兩個最受歡迎的包管理器,它們都有各自的優點和缺點,選擇最適合項目的。
歡迎關注前端早茶,與廣東靚仔攜手共同進階
前端早茶專注前端,一起結伴同行,緊跟業界發展步伐~

