pnpm是什么?
p代表performant,意為高性能的npm。
跟npm 和 yarn一樣都是JavaScript包管理工具,被稱為快速的,節(jié)省磁盤空間的包管理工具。
為什么要用它?它如何做到快速以及節(jié)省磁盤空間?
安裝在node_modules文件目錄如下
node_modules
-- .bin
-- .pnpm
-- vite ->符號鏈接
-- less ->符號鏈接
-- ...等等在package.json定義在dependencies 和 devDependencies 的依賴包
pnpm依賴包安裝在哪?
對比npm和yarn,它們下載后的依賴包是實打?qū)嵉脑诟髯皂椖康膎ode_modules內(nèi),也就是說,假如我有多個項目,每個項目都進行一遍install,毫無疑問,我整個磁盤的node_modules容量都是龐大的。
然而我們進行pnpm的安裝后,終端會顯示這段話
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的包存儲在 /mnt/h/.pnpm-store/v3 這個地方,我的所有項目都在h盤,它就把依賴包的內(nèi)容都安裝在h盤根目錄上。
- 分析第三行,意思是虛擬目錄構(gòu)建在你當(dāng)前項目的node_modules/.pnpm上,也就是我們看到的.pnpm。
- 再分析第一行:依賴包從CAS(內(nèi)容可尋址存儲)硬鏈接(hard linked)到虛擬存儲區(qū)(virtual store)
以結(jié)果為導(dǎo)論,那就是說
我h盤所有項目所用到的依賴包(在各自的.pnpm目錄內(nèi)),通過了某種手段(硬鏈接)到CAS(h盤根目錄創(chuàng)建的倉庫)里獲取依賴包的內(nèi)容。
從而就減少了很多重復(fù)性依賴包的構(gòu)建,減少了安裝時間也節(jié)省磁盤空間。
補充:關(guān)于符號鏈接
我們可以看到 .pnpm 同級目錄下會有 我們定義引用的帶有符號鏈接的依賴包,比如例子中的vite。
其實可以打開.pnpm文件夾,細(xì)心找一下也是可以找到vite的內(nèi)容。
符號鏈接就是把package.json目錄下定義用到的依賴包,在.pnpm下找,找到后抽出來,放到同級目錄下,方便查看源碼。
我覺得這一點真的很好,依賴包的結(jié)構(gòu)就很清晰了,也方便查找源碼。
總結(jié)
個人理解的依賴包的調(diào)用流程:
- 項目需要調(diào)用依賴包A(import A)
- 從node_modules目錄上找到依賴包A
- 依賴包A通過符號鏈接,鏈接到虛擬倉庫(/.pnpm)內(nèi)找到相應(yīng)的依賴包A
- 虛擬倉庫(/.pnpm)通過硬鏈接到CAS(/.pnpm-store/v3)找到依賴包A內(nèi)容并返回