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

Pnpm 是憑什么對(duì) Npm 和 Yarn 降維打擊的

開發(fā) 前端
今天研究了一下它的機(jī)制,確實(shí)厲害,對(duì) yarn 和 npm 可以說是降維打擊。那具體好在哪里呢?我們一起來看一下。

大家最近是不是經(jīng)常聽到 pnpm,我也一樣。

今天研究了一下它的機(jī)制,確實(shí)厲害,對(duì) yarn 和 npm 可以說是降維打擊。

那具體好在哪里呢?我們一起來看一下。

我們按照包管理工具的發(fā)展歷史,從 npm2 開始講起:

npm2

用 node 版本管理工具把 node 版本降到 4,那 npm 版本就是 2.x 了。

圖片

然后找個(gè)目錄,執(zhí)行下 npm init -y,快速創(chuàng)建個(gè) package.json。

然后執(zhí)行 npm install express,那么 express 包和它的依賴都會(huì)被下載下來:

圖片

展開 express,它也有 node_modules:

圖片

再展開幾層,每個(gè)依賴都有自己的 node_modules:

圖片

也就是說 npm2 的 node_modules 是嵌套的。

這很正常呀?有什么不對(duì)么?

這樣其實(shí)是有問題的,多個(gè)包之間難免會(huì)有公共的依賴,這樣嵌套的話,同樣的依賴會(huì)復(fù)制很多次,會(huì)占據(jù)比較大的磁盤空間。

這個(gè)還不是最大的問題,致命問題是 windows 的文件路徑最長(zhǎng)是 260 多個(gè)字符,這樣嵌套是會(huì)超過 windows 路徑的長(zhǎng)度限制的。

當(dāng)時(shí) npm 還沒解決,社區(qū)就出來新的解決方案了,就是 yarn:

yarn

yarn 是怎么解決依賴重復(fù)很多次,嵌套路徑過長(zhǎng)的問題的呢?

鋪平。所有的依賴不再一層層嵌套了,而是全部在同一層,這樣也就沒有依賴重復(fù)多次的問題了,也就沒有路徑過長(zhǎng)的問題了。

我們把 node_modules 刪了,用 yarn 再重新安裝下,執(zhí)行 yarn add express:

這時(shí)候 node_modules 就是這樣了:

圖片

全部鋪平在了一層,展開下面的包大部分是沒有二層 node_modules 的:

圖片

當(dāng)然也有的包還是有 node_modules 的,比如這樣:

圖片

為什么還有嵌套呢?

因?yàn)橐粋€(gè)包是可能有多個(gè)版本的,提升只能提升一個(gè),所以后面再遇到相同包的不同版本,依然還是用嵌套的方式。

npm 后來升級(jí)到 3 之后,也是采用這種鋪平的方案了,和 yarn 很類似:

圖片

當(dāng)然,yarn 還實(shí)現(xiàn)了 yarn.lock 來鎖定依賴版本的功能,不過這個(gè) npm 也實(shí)現(xiàn)了。

yarn 和 npm 都采用了鋪平的方案,這種方案就沒有問題了么?

并不是,扁平化的方案也有相應(yīng)的問題。

最主要的一個(gè)問題是幽靈依賴,也就是你明明沒有聲明在 dependencies 里的依賴,但在代碼里卻可以 require 進(jìn)來。

這個(gè)也很容易理解,因?yàn)槎间伷搅寺铮且蕾嚨囊蕾囈彩强梢哉业降摹?/p>

但是這樣是有隱患的,因?yàn)闆]有顯式依賴,萬一有一天別的包不依賴這個(gè)包了,那你的代碼也就不能跑了,因?yàn)槟阋蕾囘@個(gè)包,但是現(xiàn)在不會(huì)被安裝了。

這就是幽靈依賴的問題。

而且還有一個(gè)問題,就是上面提到的依賴包有多個(gè)版本的時(shí)候,只會(huì)提升一個(gè),那其余版本的包不還是復(fù)制了很多次么,依然有浪費(fèi)磁盤空間的問題。

那社區(qū)有沒有解決這倆問題的思路呢?

當(dāng)然有,這不是 pnpm 就出來了嘛。

那 pnpm 是怎么解決這倆問題的呢?

pnpm

回想下 npm3 和 yarn 為什么要做 node_modules 扁平化?不就是因?yàn)橥瑯拥囊蕾嚂?huì)復(fù)制多次,并且路徑過長(zhǎng)在 windows 下有問題么?

那如果不復(fù)制呢,比如通過 link。

首先介紹下 link,也就是軟硬連接,這是操作系統(tǒng)提供的機(jī)制,硬連接就是同一個(gè)文件的不同引用,而軟鏈接是新建一個(gè)文件,文件內(nèi)容指向另一個(gè)路徑。當(dāng)然,這倆鏈接使用起來是差不多的。

如果不復(fù)制文件,只在全局倉(cāng)庫(kù)保存一份 npm 包的內(nèi)容,其余的地方都 link 過去呢?

這樣不會(huì)有復(fù)制多次的磁盤空間浪費(fèi),而且也不會(huì)有路徑過長(zhǎng)的問題。因?yàn)槁窂竭^長(zhǎng)的限制本質(zhì)上是不能有太深的目錄層級(jí),現(xiàn)在都是各個(gè)位置的目錄的 link,并不是同一個(gè)目錄,所以也不會(huì)有長(zhǎng)度限制。

沒錯(cuò),pnpm 就是通過這種思路來實(shí)現(xiàn)的。

再把 node_modules 刪掉,然后用 pnpm 重新裝一遍,執(zhí)行 pnpm install。

你會(huì)發(fā)現(xiàn)它打印了這樣一句話:

圖片

包是從全局 store 硬連接到虛擬 store 的,這里的虛擬 store 就是 node_modules/.pnpm。

我們打開 node_modules 看一下:

圖片

確實(shí)不是扁平化的了,依賴了 express,那 node_modules 下就只有 express,沒有幽靈依賴。

展開 .pnpm 看一下:

圖片

所有的依賴都在這里鋪平了,都是從全局 store 硬連接過來的,然后包和包之前的依賴關(guān)系是通過軟鏈接組織的。

比如 .pnpm 下的 expresss,這些都是軟鏈接,

圖片

也就是說,所有的依賴都是從全局 store 硬連接到了 node_modules/.pnpm 下,然后之間通過軟鏈接來相互依賴。

官方給了一張?jiān)韴D,配合著看一下就明白了:

圖片

這就是 pnpm 的實(shí)現(xiàn)原理。

那么回過頭來看一下,pnpm 為什么優(yōu)秀呢?

首先,最大的優(yōu)點(diǎn)是節(jié)省磁盤空間呀,一個(gè)包全局只保存一份,剩下的都是軟硬連接,這得節(jié)省多少磁盤空間呀。

其次就是快,因?yàn)橥ㄟ^鏈接的方式而不是復(fù)制,自然會(huì)快。

這也是它所標(biāo)榜的優(yōu)點(diǎn):

圖片

相比 npm2 的優(yōu)點(diǎn)就是不會(huì)進(jìn)行同樣依賴的多次復(fù)制。

相比 yarn 和 npm3+ 呢,那就是沒有幽靈依賴,也不會(huì)有沒有被提升的依賴依然復(fù)制多份的問題。

這就已經(jīng)足夠優(yōu)秀了,對(duì) yarn 和 npm 可以說是降維打擊。

總結(jié)

pnpm 最近經(jīng)常會(huì)聽到,可以說是爆火。本文我們梳理了下它爆火的原因:

npm2 是通過嵌套的方式管理 node_modules 的,會(huì)有同樣的依賴復(fù)制多次的問題。

npm3+ 和 yarn 是通過鋪平的扁平化的方式來管理 node_modules,解決了嵌套方式的部分問題,但是引入了幽靈依賴的問題,并且同名的包只會(huì)提升一個(gè)版本的,其余的版本依然會(huì)復(fù)制多次。

pnpm 則是用了另一種方式,不再是復(fù)制了,而是都從全局 store 硬連接到 node_modules/.pnpm,然后之間通過軟鏈接來組織依賴關(guān)系。

這樣不但節(jié)省磁盤空間,也沒有幽靈依賴問題,安裝速度還快,從機(jī)制上來說完勝 npm 和 yarn。

pnpm 就是憑借這個(gè)對(duì) npm 和 yarn 降維打擊的。

責(zé)任編輯:武曉燕 來源: 神光的編程秘籍
相關(guān)推薦

2022-09-16 22:23:35

pnpmCLI軟件

2024-06-20 08:06:04

2024-01-31 21:54:22

NodeDenoMacOS

2022-02-28 10:22:08

前端管理工具

2022-08-27 13:35:39

L4級(jí)自動(dòng)駕駛輔助駕駛自動(dòng)駕駛

2025-03-25 08:50:00

2021-05-24 08:00:00

機(jī)器學(xué)習(xí)數(shù)據(jù)云計(jì)算

2021-11-29 12:11:09

npm包管理器工具

2022-02-21 09:58:31

包管理器npmyarn

2022-02-25 14:19:56

依賴管理前端命令

2024-05-10 08:41:05

NPMYarn

2023-04-12 00:00:40

Node.jsMonoreponpm

2020-07-23 10:51:29

NginxWebApache

2021-03-30 11:29:02

人工智能深度學(xué)習(xí)

2022-07-05 08:25:10

Reactyarn link

2017-09-11 09:20:14

機(jī)器學(xué)習(xí)無監(jiān)督學(xué)習(xí)聚類

2021-02-25 07:24:35

pnpm包管理器前端

2024-02-19 00:05:00

視頻AI

2023-02-20 14:52:43

模型研究

2024-09-10 12:11:18

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: www.久| 亚洲精品第一 | 一区二区三区亚洲视频 | 亚洲精品久久久一区二区三区 | 手机av网 | 天堂在线www | 日韩一区二区三区四区五区 | 色偷偷888欧美精品久久久 | 国产激情视频在线观看 | 日韩中文视频 | 日本一区高清 | 国产免费一区二区 | av在线三级 | 欧美日韩亚洲国产 | 毛片一区二区 | 黑人巨大精品欧美一区二区一视频 | 搞av.com | 久久国产精品久久久久久 | 一级黄色短片 | 国产1区| 免费99精品国产自在在线 | 紧缚调教一区二区三区视频 | 国产欧美精品一区二区 | 亚洲+变态+欧美+另类+精品 | 精品中文字幕一区二区三区 | 欧美精品一区二区三区在线播放 | 中文成人在线 | 操视频网站| 成人妇女免费播放久久久 | aaaaaaa片毛片免费观看 | 中文字幕免费在线 | 国产一区 在线视频 | 国产ts人妖一区二区三区 | 97久久久久久 | 亚洲国产视频一区二区 | 国产日韩视频在线 | 亚洲国产一区二区三区 | 一级毛片免费看 | 黄色片在线免费看 | 日韩三级在线 | 欧美成人一区二区三区 |