成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Pnpm:包管理的新星,如何顛覆 Npm 和 Yarn

開發 前端
為了更好地理解 pnpm 的優勢,我們從包管理工具的歷史開始探索,從 npm2 開始的各個階段。我們將看到 pnpm 如何通過技術創新解決歷史遺留問題,并極大地提高性能和效率。接下來,深入了解 pnpm 的核心機制以及它如何改變開發者處理依賴管理的方式。

在探索現代 JavaScript 生態系統時,我們常常會遇到新興技術的快速迭代和改進。其中,包管理工具的發展尤為重要,因為它們直接影響開發效率和項目性能。最近,pnpm 作為一種新的包管理工具引起了廣泛關注。它不僅挑戰了傳統工具如 npm 和 Yarn,還提供了一些獨特的優勢,使其在許多方面超越了前輩。

為了更好地理解 pnpm 的優勢,我們從包管理工具的歷史開始探索,從 npm2 開始的各個階段。我們將看到 pnpm 如何通過技術創新解決歷史遺留問題,并極大地提高性能和效率。接下來,深入了解 pnpm 的核心機制以及它如何改變開發者處理依賴管理的方式。

npm2

使用 Node 版本管理工具將 Node 版本降級到 4,然后 npm 版本將是 2.x。

在一個目錄中運行 npm init -y 快速創建一個 package.json 文件。

然后運行 npm install express,express 包及其依賴項將被下載:

展開 express,它也有 node_modules:

繼續展開幾層,每個依賴項都有自己的 node_modules:

換句話說,npm2 的 node_modules 是嵌套的。

這正常嗎?這有什么問題嗎?

實際上,這確實有問題。多個包不可避免地具有共同的依賴項。當像這樣嵌套時,相同的依賴項將被多次重復,占用了相對較大的磁盤空間。

這還不是最大的問題;致命的問題是 Windows 中文件路徑的最大長度超過 260 個字符。像這樣嵌套會超過 Windows 的路徑長度限制。

在 npm 尚未解決這個問題時,社區出現了一個新的解決方案:yarn

yarn

Yarn 如何解決重復依賴和過長嵌套路徑的問題?

扁平化。所有依賴項不再逐層嵌套,而是全部處于同一層級,因此不再存在重復依賴或路徑過長的問題。

我們刪除 node_modules,使用 Yarn 重新安裝并執行 yarn add express:

此時,node_modules 看起來像這樣:

所有依賴項都在同一層級,大多數包在其下沒有第二層 node_modules:

當然,有些包仍然有 node_modules,例如這個:

為什么仍然存在嵌套?

因為一個包可能有多個版本,并且只有一個版本可以被提升。因此,當遇到不同版本的同一包時,仍然使用嵌套。

npm 升級到版本 3 后,也采用了這種扁平化解決方案,與 yarn 非常相似:

當然,yarn 也實現了 yarn.lock 的功能來鎖定依賴項版本,但 npm 也實現了這一點。

yarn 和 npm 都采用了扁平化解決方案。這種方法沒有問題嗎?

不完全是,扁平化解決方案也有自己的問題。

主要問題是幽靈依賴,這意味著在代碼中可以引入未在依賴項部分聲明的依賴項。

這很容易理解,因為一切都是扁平化的,所以可以找到依賴項的依賴項。

然而,這帶來了風險,因為沒有明確的依賴聲明,如果有一天另一個包不再依賴于那個包,你的代碼將無法運行,因為依賴于它,但現在沒有安裝。

這就是幽靈依賴的問題。

另一個問題是多個版本的依賴項,如上所述。只有一個版本會被提升,而其他版本則會重復多次,導致磁盤空間浪費。

社區有解決這兩個問題的想法嗎?

當然有!這就是為什么引入了 pnpm。

pnpm

回顧一下,為什么 npm3 和 yarn 扁平化 node_modules?不就是因為相同的依賴項會被多次重復,并且長路徑可能會在 Windows 上引發問題嗎?

如果我們不重復它們,而是使用鏈接呢?

首先,介紹鏈接。它是操作系統提供的軟鏈接和硬鏈接。硬鏈接是同一個文件的不同引用,而符號鏈接會創建一個新文件,其內容指向另一個路徑。當然,這兩種鏈接的使用方式是類似的。

如果不復制文件,而是將 npm 包的唯一副本存儲在全局倉庫中,并將其他位置鏈接到它呢?

這樣就不會因多次復制而浪費磁盤空間,也不會有路徑過長的問題。路徑長度的限制本質上意味著不應該有太深的目錄層級;現在所有位置的目錄是鏈接在一起的,而不是在同一個目錄中,因此沒有長度限制。

是的,pnpm 通過這種方法實現了這一點。

再次刪除 node_modules,然后使用 pnpm 通過運行 pnpm install 重新安裝。

你會注意到它打印出這樣一句話:

軟件包從全局存儲硬鏈接到虛擬存儲,這里的虛擬存儲是 node_modules/.pnpm。

我們打開 node_modules 看一看。

確實不是扁平的,依賴 express,所以在 node_modules 下只有 express,沒有任何幽靈依賴。

展開 .pnpm 看看:

所有依賴項都在這里解決,全部從全局倉庫直接鏈接過來,并通過符號鏈接組織包之間的依賴關系。

例如,.pnpm 下的 express,都是符號鏈接。

換句話說,所有依賴項都是從全局倉庫硬鏈接到 node_modules/.pnpm,然后它們通過符號鏈接相互依賴。

官方提供了一個示意圖,結合起來看很清楚:

這就是 pnpm 的實現原理。

pnpm 的優越性

首先,最大的優勢是節省磁盤空間。包只在全局保存一份,其余的都是符號鏈接或硬鏈接。這節省了大量磁盤空間。

其次,它很快,因為它使用鏈接而不是復制,這自然使它更快。

這些也是它所宣稱的優勢:

相比 npm2,優勢在于不會多次重復相同的依賴項。

相比 yarn 和 npm3+,沒有幽靈依賴,也沒有未提升依賴項的重復問題。

這已經足夠優秀,可以說是對 yarn 和 npm 的一次打擊。

結語

最近,pnpm 頻繁被提及,可以說是當下的趨勢。在本文中,我們總結了其受歡迎的原因:

npm2 以嵌套方式管理 node_modules,導致多次重復依賴項的問題。

npm3+ 和 yarn 通過扁平化方式管理 node_modules,解決了嵌套方式的一些問題,但引入了幽靈依賴的問題。此外,同名包只有一個版本被提升,而其他版本仍會重復。

pnpm 通過不復制文件,而是從全局倉庫硬鏈接到 node_modules/.pnpm,并通過符號鏈接組織依賴關系,解決了這些問題。

這不僅節省了磁盤空間,消除了幽靈依賴問題,還加快了安裝速度。從機械角度來看,pnpm 超越了 npm 和 yarn。

通過這種對 npm 和 yarn 的創新方法,pnpm 正在通過簡化依賴管理的方式產生影響。

責任編輯:姜華 來源: 大遷世界
相關推薦

2022-02-28 10:22:08

前端管理工具

2022-02-21 09:58:31

包管理器npmyarn

2023-04-12 00:00:40

Node.jsMonoreponpm

2021-11-29 12:11:09

npm包管理器工具

2022-09-16 22:23:35

pnpmCLI軟件

2022-02-25 14:19:56

依賴管理前端命令

2022-08-03 00:04:29

pnpmyarnnpm

2025-03-25 08:50:00

2021-02-25 07:24:35

pnpm包管理器前端

2024-05-10 08:41:05

NPMYarn

2022-05-09 19:19:36

Pnpm管理工具

2022-05-26 08:01:44

Pnpm包管理器磁盤

2020-03-17 10:18:27

GitHub代碼開發者

2021-11-11 11:13:20

js Npm基礎

2025-03-24 00:00:15

2024-12-04 13:54:19

pnpm存儲項目

2022-02-14 11:25:26

區塊鏈技術加密貨幣

2023-04-18 08:52:35

模塊Python

2022-10-09 14:50:24

前端pnpm工具

2018-05-07 13:42:52

LinuxnpmNodeJS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线视频免费观看 | 成人av网站在线观看 | 久在线观看 | 日韩不卡视频在线 | 精品国产一区二区三区久久久久久 | 人人人人人爽 | 国产福利在线看 | 亚洲精品久久嫩草网站秘色 | 国产高清视频一区 | 精品国产一区二区在线 | 欧美日韩三级 | 久久r免费视频 | 亚洲色视频 | 天天天久久久 | 国产精品一区二区三级 | 大陆一级毛片免费视频观看 | 亚洲精品久久久久久一区二区 | 中文字幕av色 | 日本不卡免费新一二三区 | 91视频久久 | 小川阿佐美pgd-606在线 | 久久福利电影 | 亚洲第一黄色网 | 男女网站在线观看 | 亚洲欧美日韩精品久久亚洲区 | 高清国产午夜精品久久久久久 | 精品网站999www| 免费一区二区三区 | 欧美偷偷| 欧美看片| 久久一区二区三区四区五区 | 第四色影音先锋 | 午夜影院网站 | 国产特一级黄色片 | 国产在线一区二区三区 | 久久久久国产一级毛片 | 国产日本精品视频 | 日韩电影一区 | 在线观看国产视频 | 亚洲一区二区三区视频 | 九九综合|