pnpm是什么?
p代表performant,意为高性能的npm。
跟npm 和 yarn一样都是JavaScript包管理工具,被称为快速的,节省磁盘空间的包管理工具。
为什么要用它?它如何做到快速以及节省磁盘空间?
安装在node_modules文件目录如下
node_modules
-- .bin
-- .pnpm
-- vite ->符号链接
-- less ->符号链接
-- ...等等在package.json定义在dependencies 和 devDependencies 的依赖包
pnpm依赖包安装在哪?
对比npm和yarn,它们下载后的依赖包是实打实的在各自项目的node_modules内,也就是说,假如我有多个项目,每个项目都进行一遍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盘,它就把依赖包的内容都安装在h盘根目录上。
- 分析第三行,意思是虚拟目录构建在你当前项目的node_modules/.pnpm上,也就是我们看到的.pnpm。
- 再分析第一行:依赖包从CAS(内容可寻址存储)硬链接(hard linked)到虚拟存储区(virtual store)
以结果为导论,那就是说
我h盘所有项目所用到的依赖包(在各自的.pnpm目录内),通过了某种手段(硬链接)到CAS(h盘根目录创建的仓库)里获取依赖包的内容。
从而就减少了很多重复性依赖包的构建,减少了安装时间也节省磁盘空间。
补充:关于符号链接
我们可以看到 .pnpm 同级目录下会有 我们定义引用的带有符号链接的依赖包,比如例子中的vite。
其实可以打开.pnpm文件夹,细心找一下也是可以找到vite的内容。
符号链接就是把package.json目录下定义用到的依赖包,在.pnpm下找,找到后抽出来,放到同级目录下,方便查看源码。
我觉得这一点真的很好,依赖包的结构就很清晰了,也方便查找源码。
总结
个人理解的依赖包的调用流程:
- 项目需要调用依赖包A(import A)
- 从node_modules目录上找到依赖包A
- 依赖包A通过符号链接,链接到虚拟仓库(/.pnpm)内找到相应的依赖包A
- 虚拟仓库(/.pnpm)通过硬链接到CAS(/.pnpm-store/v3)找到依赖包A内容并返回