學(xué)習(xí)記錄-pnpm

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
  1. 分析第二行,意思是pnpm的包存儲在 /mnt/h/.pnpm-store/v3 這個地方,我的所有項目都在h盤,它就把依賴包的內(nèi)容都安裝在h盤根目錄上。
  2. 分析第三行,意思是虛擬目錄構(gòu)建在你當(dāng)前項目的node_modules/.pnpm上,也就是我們看到的.pnpm。
  3. 再分析第一行:依賴包從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)用流程:

  1. 項目需要調(diào)用依賴包A(import A)
  2. 從node_modules目錄上找到依賴包A
  3. 依賴包A通過符號鏈接,鏈接到虛擬倉庫(/.pnpm)內(nèi)找到相應(yīng)的依賴包A
  4. 虛擬倉庫(/.pnpm)通過硬鏈接到CAS(/.pnpm-store/v3)找到依賴包A內(nèi)容并返回

學(xué)習(xí)資料

2022年了,你還沒用pnpm嗎?

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

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

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