我們都知道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ì)有公共的依賴(lài),這樣嵌套的話(huà)赃蛛,同樣的依賴(lài)會(huì)復(fù)制很多次恃锉,會(huì)占據(jù)比較大的磁盤(pán)空間,同時(shí)我們刪除依賴(lài)的時(shí)候,我們會(huì)發(fā)現(xiàn)焊虏,依賴(lài)嵌套太深的話(huà)淡喜,我們無(wú)權(quán)限或者一次性刪除。
2.高于npm2.x版本雖然解決了這個(gè)問(wèn)題诵闭,依賴(lài)鋪平了炼团。所有的依賴(lài)不再一層層嵌套了,而是全部在同一層疏尿,這樣也就沒(méi)有依賴(lài)重復(fù)多次的問(wèn)題了瘟芝,也就沒(méi)有路徑過(guò)長(zhǎng)的問(wèn)題了
yarn
yarn的出現(xiàn)是為了解決npm2.x依賴(lài)重復(fù)很多次,嵌套路徑過(guò)長(zhǎng)的問(wèn)題的褥琐,雖然高版本npm已經(jīng)解決了這個(gè)問(wèn)題锌俱,但是高版本npm和yarn出現(xiàn)另外一個(gè)問(wèn)題就是幽靈依賴(lài)。什么幽靈依賴(lài)呢敌呈?
通俗理解:dependencies 里的依賴(lài)贸宏,但在代碼里卻可以 require 進(jìn)來(lái),這個(gè)很容易理解,因?yàn)槎间伷搅?那個(gè)依賴(lài)的依賴(lài)也都是可以找到的造寝。但是這樣是有隱患的,因?yàn)闆](méi)有顯式依賴(lài)吭练,萬(wàn)一有一天別的包不依賴(lài)這個(gè)包了诫龙,那你的代碼也就不能跑了,因?yàn)槟阋蕾?lài)這個(gè)包鲫咽,但是現(xiàn)在不會(huì)被安裝了签赃。這個(gè)就是典型的幽靈依賴(lài)的問(wèn)題。
而且還有一個(gè)問(wèn)題分尸,就是上面提到的依賴(lài)包有多個(gè)版本的時(shí)候锦聊,只會(huì)提升一個(gè),那其余版本的包不還是復(fù)制了很多次么箩绍,依然有浪費(fèi)磁盤(pán)空間的問(wèn)題
pnpm
pnpm的出現(xiàn)就是為了解決 npm和yarn遺留的問(wèn)題孔庭。可以很好的解決一下幽靈依賴(lài)的問(wèn)題材蛛。那我們來(lái)說(shuō)一下pnpm的實(shí)現(xiàn)原理:
回想下 npm3 和 yarn 為什么要做 node_modules 扁平化史飞?不就是因?yàn)橥瑯拥囊蕾?lài)會(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ù)制多次的磁盤(pán)空間浪費(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)它打印了這樣一句話(huà):
除此之外 使用pnpm的動(dòng)機(jī)
節(jié)省磁盤(pán)空間
提高安裝速度
pnpm 分三個(gè)階段執(zhí)行安裝:
1.依賴(lài)解析茉盏。 倉(cāng)庫(kù)中沒(méi)有的依賴(lài)都被識(shí)別并獲取到倉(cāng)庫(kù)鉴未。
2.目錄結(jié)構(gòu)計(jì)算枢冤。 node_modules 目錄結(jié)構(gòu)是根據(jù)依賴(lài)計(jì)算出來(lái)的。
3.鏈接依賴(lài)項(xiàng)铜秆。 所有以前安裝過(guò)的依賴(lài)項(xiàng)都會(huì)直接從倉(cāng)庫(kù)中獲取并鏈接到 node_modules淹真。
安裝和兼容性
npm install -g pnpm
功能比較
cli命令
查看依賴(lài)項(xiàng)
運(yùn)行腳本
具體可以查看官方文檔https://pnpm.io/zh/installation