?? npm、yarn與pnpm詳解
?? 一、npm
?? 簡(jiǎn)介:npm
是隨Node.js
一起安裝的官方包管理工具,它為開發(fā)者搭建了一個(gè)龐大的資源庫(kù),允許他們?cè)谶@個(gè)平臺(tái)上搜索、安裝和管理項(xiàng)目所必需的各種代碼庫(kù)或模塊。
?? 常用命令:
-
npm install
:安裝package.json中聲明的所有依賴項(xiàng)。 -
npm install <package-name>
:安裝指定名稱的包。 -
npm uninstall <package-name>
:移除指定名稱的包。 -
npm update
:更新所有已安裝包至最新版本。 -
npm update <package-name>
:更新指定包至最新版本。 -
npm start
:執(zhí)行package.json中的"start"腳本。
?? 特點(diǎn):npm
作為最早的JavaScript
包管理器,坐擁龐大的社區(qū)和海量資源,盡管在處理大型項(xiàng)目時(shí)的安裝速度和性能上可能不如后起之秀Yarn
和pnpm
理想。
?? 二、Yarn
?? 簡(jiǎn)介:Yarn
是由Facebook
開發(fā)的一款JavaScript
包管理工具,旨在優(yōu)化npm
的部分性能和安全性問題。
?? 常用命令:
-
yarn install
:安裝package.json中列舉的依賴。 -
yarn add <package-name>
:添加指定名稱的包。 -
yarn remove <package-name>
:刪除指定包。 -
yarn upgrade
:全局更新所有包至最新版。 -
yarn upgrade <package-name>
:更新指定包至最新版本。 -
yarn start
:執(zhí)行package.json中的"start"腳本。
?? 特點(diǎn):
Yarn通過并行下載和緩存技術(shù)提升了安裝速度,增強(qiáng)了依賴關(guān)系的安全性保障。
?? 三、pnpm
?? 簡(jiǎn)介:pnpm
是另一種廣受歡迎的JavaScript
包管理器,其獨(dú)特之處在于采用了名為 硬鏈接 的安裝策略,從而極大地節(jié)省磁盤空間。
?? 常用命令:
-
pnpm install
:安裝package.json文件中列出的所有依賴項(xiàng)。 -
pnpm add <package-name>
:安裝指定包。 -
pnpm remove <package-name>
:卸載指定包。 -
pnpm upgrade
:升級(jí)所有已安裝包至最新版本。 -
pnpm upgrade <package-name>
:升級(jí)指定包至最新版本。 -
pnpm run <script-name>
:執(zhí)行package.json中scripts字段下指定的腳本。
?? 特點(diǎn):pnpm
借助硬鏈接技術(shù),在保證與npm
和yarn
命令集類似的同時(shí),大大提升了磁盤空間的使用效率。
?? 四、差異比較
-
性能:相較于
npm
,Yarn
和pnpm
在處理大型項(xiàng)目時(shí)通常表現(xiàn)出更快的安裝速度。 -
磁盤空間:
pnpm
通過硬鏈接技術(shù),相較于npm
和yarn
能更有效地節(jié)約磁盤存儲(chǔ)空間。 -
安全性:
Yarn
因其嚴(yán)謹(jǐn)?shù)囊蕾嚱馕霾呗远灰曌鞅?code>npm更為安全的選擇。 -
兼容性:
npm
作為最早的包管理工具,擁有最為廣泛的支持和兼容性優(yōu)勢(shì)。
?? 五、深入了解
?? npm
工作原理:npm的工作原理基于遞歸非循環(huán)依賴樹模型,每個(gè)項(xiàng)目都有一個(gè)node_modules
目錄,其中包含了項(xiàng)目直接依賴和間接依賴的所有模塊。每次安裝新的包時(shí),npm
會(huì)遍歷依賴樹并創(chuàng)建相應(yīng)的子目錄來存放每個(gè)依賴包。
緩存機(jī)制:npm有本地緩存機(jī)制,用于加快重復(fù)安裝的速度,但它并不像Yarn
那樣強(qiáng)制一致性的全局緩存。當(dāng)多個(gè)項(xiàng)目共享相同依賴時(shí),這些依賴可能會(huì)在每個(gè)項(xiàng)目的node_modules
目錄下單獨(dú)復(fù)制一份。
鎖定文件:npm從5.0版本開始引入了package-lock.json文件,用于鎖定安裝時(shí)的具體依賴版本,確??绛h(huán)境和團(tuán)隊(duì)成員間的依賴一致性。然而,在處理依賴樹時(shí),npm
遵循的是扁平化原則,即盡可能地把所有依賴放在同一層級(jí),這可能導(dǎo)致在大型項(xiàng)目中node_modules
目錄非常龐大。
?? Yarn
工作原理:Yarn同樣遵循依賴樹模型,但在安裝過程中采用了一種更高效的方法。它不僅有一個(gè)全局緩存,而且在安裝新包時(shí),如果發(fā)現(xiàn)緩存中有匹配的包,則直接復(fù)用,而非重新下載。此外,Yarn
同時(shí)處理多個(gè)依賴包的下載和安裝,顯著提高了安裝速度。
一致性保證:Yarn通過yarn.lock文件實(shí)現(xiàn)嚴(yán)格的版本控制,這個(gè)文件精確記錄了每一個(gè)依賴包及其依賴鏈的具體版本,確保不同環(huán)境下項(xiàng)目構(gòu)建的一致性。Yarn
在處理依賴時(shí)也采取扁平化策略,但在處理沖突時(shí)有更好的解決方案。
?? pnpm
工作原理:pnpm創(chuàng)新性地使用了硬鏈接(hard link)和符號(hào)鏈接(symlink)技術(shù),這使得同一個(gè)依賴在磁盤上僅存儲(chǔ)一份,多個(gè)項(xiàng)目共用此唯一副本。這種機(jī)制通過store
(存儲(chǔ))目錄集中管理所有的包版本,極大程度上減少了磁盤空間的占用。
高效的安裝與卸載:pnpm在安裝時(shí)能夠識(shí)別出哪些包已經(jīng)存在于全局存儲(chǔ)中,并通過硬鏈接指向它們,而非復(fù)制文件。在卸載時(shí),由于沒有物理文件的移動(dòng),所以速度極快,同時(shí)避免了不必要的磁盤空間浪費(fèi)。
鎖定文件:pnpm使用pnpm-lock.yaml文件鎖定依賴版本,該文件同樣提供了強(qiáng)大的版本控制能力。pnpm
的獨(dú)特之處還在于它能更好地處理深層依賴場(chǎng)景,尤其是當(dāng)項(xiàng)目存在大量共享依賴時(shí),其帶來的性能提升尤為明顯。
??總結(jié)
特性/工具 | npm | Yarn | pnpm |
---|---|---|---|
工作原理 | 遞歸地安裝所有依賴到node_modules目錄下 | 構(gòu)建扁平化的依賴樹并優(yōu)化安裝過程 | 使用單個(gè)全局存儲(chǔ)層和符號(hào)鏈接來減少磁盤空間占用 |
安裝方式 | npm install |
yarn add/install |
pnpm install |
緩存機(jī)制 | 本地緩存每個(gè)項(xiàng)目的依賴 | 共享緩存,保證多個(gè)項(xiàng)目間的依賴版本一致 | 共享存儲(chǔ)層緩存,避免重復(fù)下載 |
安裝速度 | 相對(duì)較慢,尤其在網(wǎng)絡(luò)不佳時(shí) | 快于npm,支持并行安裝 | 更快,充分利用磁盤空間和網(wǎng)絡(luò)資源 |
磁盤空間占用 | 每個(gè)項(xiàng)目下的node_modules有完整副本,占用較多空間 | 同一依賴只在全局緩存一份 | 利用符號(hào)鏈接進(jìn)一步減少磁盤占用 |
鎖定文件 | package-lock.json | yarn.lock | pnpm-lock.yaml |
依賴一致性 | 通過package-lock.json實(shí)現(xiàn)一定的依賴版本控制 | 強(qiáng)制一致,每次安裝都會(huì)嚴(yán)格按照yarn.lock文件 | 同樣強(qiáng)制一致,基于pnpm-lock.yaml |
離線模式 | 支持,但需先下載過相關(guān)包 | 提供強(qiáng)大的離線模式 | 也支持離線安裝 |
網(wǎng)絡(luò)策略 | 單線程請(qǐng)求 | 多線程并行請(qǐng)求 | 多線程并行請(qǐng)求,智能網(wǎng)絡(luò)調(diào)度 |
安全性 | 通過npm audit檢查依賴的安全性 | 同樣具有審計(jì)功能,檢查安全漏洞 | 支持安全審計(jì) |
交互界面 | 提供基本的命令行交互 | 更友好的CLI,提供進(jìn)度條等反饋 | CLI體驗(yàn)良好,同樣提供進(jìn)度顯示 |
生態(tài)系統(tǒng) | 最大,兼容性最好 | 兼容npm的所有特性,并額外增強(qiáng)了一些功能 | 對(duì)npm生態(tài)完全兼容,但在大型項(xiàng)目中有更好表現(xiàn) |
特色功能 | npx,用于執(zhí)行一次性命令;npm ci用于快速、可靠的持續(xù)集成環(huán)境構(gòu)建 | 更加嚴(yán)格的版本控制,改進(jìn)的沖突解決策略;workspaces支持多包管理 | 針對(duì)monorepo設(shè)計(jì),高效的多包管理和tree shaking能力 |
以上表格涵蓋了這些包管理器的主要特性對(duì)比,實(shí)際使用中還可能涉及其他細(xì)節(jié)上的差異。
-
性能:??
Yarn
和pnpm
在安裝速度方面優(yōu)于npm
,尤其對(duì)于大型項(xiàng)目和頻繁安裝的情況。??pnpm
在磁盤空間占用上表現(xiàn)最佳。 -
一致性:?? 三者都支持依賴版本鎖定,但
Yarn
和pnpm
在這方面更為嚴(yán)格,能有效防止因依賴版本不一致引發(fā)的問題。 -
生態(tài):??
npm
擁有最大的生態(tài)系統(tǒng),但由于Yarn
和pnpm
的高度兼容性,大多數(shù)npm
包都可以無縫遷移到這兩個(gè)工具上。
在實(shí)際項(xiàng)目中,開發(fā)者可以根據(jù)項(xiàng)目的具體需求和團(tuán)隊(duì)偏好選擇合適的包管理器。對(duì)于小型項(xiàng)目或者初次接觸Node.js
生態(tài)的新手,npm
可能是入門的最佳選擇;而對(duì)于需要高效管理大型項(xiàng)目和依賴的大團(tuán)隊(duì),Yarn
或 pnpm
則可能帶來更高的效率和更好的資源管理效果。文章來源:http://www.zghlxwxcb.cn/news/detail-857436.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-857436.html
到了這里,關(guān)于npm、yarn與pnpm詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!