pnpm是什么惩嘉?
p代表performant挠阁,意為高性能的npm。
跟npm 和 yarn一樣都是JavaScript包管理工具硫朦,被稱(chēng)為快速的贷腕,節(jié)省磁盤(pán)空間的包管理工具。
為什么要用它咬展?它如何做到快速以及節(jié)省磁盤(pán)空間泽裳?
安裝在node_modules文件目錄如下
node_modules
-- .bin
-- .pnpm
-- vite ->符號(hào)鏈接
-- less ->符號(hào)鏈接
-- ...等等在package.json定義在dependencies 和 devDependencies 的依賴(lài)包
pnpm依賴(lài)包安裝在哪?
對(duì)比npm和yarn破婆,它們下載后的依賴(lài)包是實(shí)打?qū)嵉脑诟髯皂?xiàng)目的node_modules內(nèi)涮总,也就是說(shuō),假如我有多個(gè)項(xiàng)目祷舀,每個(gè)項(xiàng)目都進(jìn)行一遍install瀑梗,毫無(wú)疑問(wèn),我整個(gè)磁盤(pán)的node_modules容量都是龐大的裳扯。
然而我們進(jìn)行pnpm的安裝后抛丽,終端會(huì)顯示這段話(huà)
Packages are hard linked from the content-addressable store to the virtual store.
Content-addressable store is at: /mnt/h/.pnpm-store/v3
Virtual store is at: node_modules/.pnpm
- 分析第二行,意思是pnpm的包存儲(chǔ)在 /mnt/h/.pnpm-store/v3 這個(gè)地方饰豺,我的所有項(xiàng)目都在h盤(pán)亿鲜,它就把依賴(lài)包的內(nèi)容都安裝在h盤(pán)根目錄上。
- 分析第三行冤吨,意思是虛擬目錄構(gòu)建在你當(dāng)前項(xiàng)目的node_modules/.pnpm上蒿柳,也就是我們看到的.pnpm。
- 再分析第一行:依賴(lài)包從CAS(內(nèi)容可尋址存儲(chǔ))硬鏈接(hard linked)到虛擬存儲(chǔ)區(qū)(virtual store)
以結(jié)果為導(dǎo)論锅很,那就是說(shuō)
我h盤(pán)所有項(xiàng)目所用到的依賴(lài)包(在各自的.pnpm目錄內(nèi))其馏,通過(guò)了某種手段(硬鏈接)到CAS(h盤(pán)根目錄創(chuàng)建的倉(cāng)庫(kù))里獲取依賴(lài)包的內(nèi)容。
從而就減少了很多重復(fù)性依賴(lài)包的構(gòu)建爆安,減少了安裝時(shí)間也節(jié)省磁盤(pán)空間叛复。
補(bǔ)充:關(guān)于符號(hào)鏈接
我們可以看到 .pnpm 同級(jí)目錄下會(huì)有 我們定義引用的帶有符號(hào)鏈接的依賴(lài)包,比如例子中的vite。
其實(shí)可以打開(kāi).pnpm文件夾褐奥,細(xì)心找一下也是可以找到vite的內(nèi)容咖耘。
符號(hào)鏈接就是把package.json目錄下定義用到的依賴(lài)包,在.pnpm下找撬码,找到后抽出來(lái)儿倒,放到同級(jí)目錄下,方便查看源碼呜笑。
我覺(jué)得這一點(diǎn)真的很好夫否,依賴(lài)包的結(jié)構(gòu)就很清晰了,也方便查找源碼叫胁。
總結(jié)
個(gè)人理解的依賴(lài)包的調(diào)用流程:
- 項(xiàng)目需要調(diào)用依賴(lài)包A(import A)
- 從node_modules目錄上找到依賴(lài)包A
- 依賴(lài)包A通過(guò)符號(hào)鏈接凰慈,鏈接到虛擬倉(cāng)庫(kù)(/.pnpm)內(nèi)找到相應(yīng)的依賴(lài)包A
- 虛擬倉(cāng)庫(kù)(/.pnpm)通過(guò)硬鏈接到CAS(/.pnpm-store/v3)找到依賴(lài)包A內(nèi)容并返回