我們都知道npm cnpm yarn 但是在最近出現(xiàn)的pnpm 為什么pnpm會(huì)這么爆火,有的人說(shuō),pnpm會(huì)碾壓npm和yarn?下面的來(lái)談一下 npm yarn 和pnpm的區(qū)別。
npm
npm是最常見(jiàn)的一個(gè)包管理器,這個(gè)我們就不多介紹了,我們來(lái)說(shuō)他的不足之處:
1.在npm2.x版本中,通過(guò)的npm2.xnpm2 的 node_modules 是嵌套的,這樣其實(shí)是有問(wèn)題的,多個(gè)包之間難免會(huì)有公共的依賴,這樣嵌套的話,同樣的依賴會(huì)復(fù)制很多次,會(huì)占據(jù)比較大的磁盤空間,同時(shí)我們刪除依賴的時(shí)候,我們會(huì)發(fā)現(xiàn),依賴嵌套太深的話,我們無(wú)權(quán)限或者一次性刪除。

2.高于npm2.x版本雖然解決了這個(gè)問(wèn)題,依賴鋪平了。所有的依賴不再一層層嵌套了,而是全部在同一層,這樣也就沒(méi)有依賴重復(fù)多次的問(wèn)題了,也就沒(méi)有路徑過(guò)長(zhǎng)的問(wèn)題了

yarn
yarn的出現(xiàn)是為了解決npm2.x依賴重復(fù)很多次,嵌套路徑過(guò)長(zhǎng)的問(wèn)題的,雖然高版本npm已經(jīng)解決了這個(gè)問(wèn)題,但是高版本npm和yarn出現(xiàn)另外一個(gè)問(wèn)題就是幽靈依賴。什么幽靈依賴呢?
通俗理解:dependencies 里的依賴,但在代碼里卻可以 require 進(jìn)來(lái),這個(gè)很容易理解,因?yàn)槎间伷搅?那個(gè)依賴的依賴也都是可以找到的。但是這樣是有隱患的,因?yàn)闆](méi)有顯式依賴,萬(wàn)一有一天別的包不依賴這個(gè)包了,那你的代碼也就不能跑了,因?yàn)槟阋蕾囘@個(gè)包,但是現(xiàn)在不會(huì)被安裝了。這個(gè)就是典型的幽靈依賴的問(wèn)題。
而且還有一個(gè)問(wèn)題,就是上面提到的依賴包有多個(gè)版本的時(shí)候,只會(huì)提升一個(gè),那其余版本的包不還是復(fù)制了很多次么,依然有浪費(fèi)磁盤空間的問(wèn)題
pnpm
pnpm的出現(xiàn)就是為了解決 npm和yarn遺留的問(wèn)題??梢院芎玫慕鉀Q一下幽靈依賴的問(wèn)題。那我們來(lái)說(shuō)一下pnpm的實(shí)現(xiàn)原理:
回想下 npm3 和 yarn 為什么要做 node_modules 扁平化?不就是因?yàn)橥瑯拥囊蕾嚂?huì)復(fù)制多次,并且路徑過(guò)長(zhǎng)在 windows 下有問(wèn)題么?
那如果不復(fù)制呢,比如通過(guò) link。
首先介紹下 link,也就是軟硬連接,這是操作系統(tǒng)提供的機(jī)制,硬連接就是同一個(gè)文件的不同引用,而軟鏈接是新建一個(gè)文件,文件內(nèi)容指向另一個(gè)路徑。當(dāng)然,這倆鏈接使用起來(lái)是差不多的。
這樣不會(huì)有復(fù)制多次的磁盤空間浪費(fèi),而且也不會(huì)有路徑過(guò)長(zhǎng)的問(wèn)題。因?yàn)槁窂竭^(guò)長(zhǎng)的限制本質(zhì)上是不能有太深的目錄層級(jí),現(xiàn)在都是各個(gè)位置的目錄的 link,并不是同一個(gè)目錄,所以也不會(huì)有長(zhǎng)度限制。
再把 node_modules 刪掉,然后用 pnpm 重新裝一遍,執(zhí)行 pnpm install。
你會(huì)發(fā)現(xiàn)它打印了這樣一句話:

除此之外 使用pnpm的動(dòng)機(jī)
節(jié)省磁盤空間

提高安裝速度
pnpm 分三個(gè)階段執(zhí)行安裝:
1.依賴解析。 倉(cāng)庫(kù)中沒(méi)有的依賴都被識(shí)別并獲取到倉(cāng)庫(kù)。
2.目錄結(jié)構(gòu)計(jì)算。 node_modules 目錄結(jié)構(gòu)是根據(jù)依賴計(jì)算出來(lái)的。
3.鏈接依賴項(xiàng)。 所有以前安裝過(guò)的依賴項(xiàng)都會(huì)直接從倉(cāng)庫(kù)中獲取并鏈接到 node_modules。

安裝和兼容性
npm install -g pnpm
image.png
功能比較

cli命令

查看依賴項(xiàng)

運(yùn)行腳本

具體可以查看官方文檔https://pnpm.io/zh/installation
