淺談npm和yarn和pnpm

我們都知道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)限或者一次性刪除。


npm 2.x版本下載的依賴

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)它打印了這樣一句話:


image.png

除此之外 使用pnpm的動(dòng)機(jī)

節(jié)省磁盤空間
節(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。


image.png
安裝和兼容性

npm install -g pnpm


image.png
功能比較
image.png
cli命令
image.png
查看依賴項(xiàng)
image.png
運(yùn)行腳本
image.png

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容