pnpm是什么
新一代的包管理工具,pnpm = performant npm;从名字中自然是比npm更高性能,那么它的高性能,具体表现在哪些方面?
- 节约磁盘空间;
- 提高安装速度;
- 创建一个非扁平的node_modules目录, 可以区分直接依赖&间接依赖;
pnpm/npm生成的node_modules
npm生成的node_modules
可以先来看看npm和pnpm生成的node_modules
npm生成的node_modules目录, 所有的依赖是平铺在node_modules底下的; 如果多个项目都引用同一个包,都需要重新下载,做不到资源的共享。
pnpm生成的node_module目录
pnpm add express -w 命令安装一个express依赖后生成的目录 ; 可以看到node_moduls中的目录结构主要有以下三级,
node_moduels
- express(直接依赖)
- .pnpm
- .modules.yaml
/express目录
- express目录右边有个箭头,这其实是个软链接,真实链接到.pnpm/express@4.21.1/node_modules/express下,
- express目录只维护了直接依赖,间接依赖全部维护在 .pnpm/express@4.21.1/node_modules/ 底下;
/pnpm目录
该目录维护了所有的依赖,其采用硬链接,链接到pnpm的store存储中;
store存储
- store类似vuex中的store,依赖的集中存储在硬盘的某一位置,所以不同项目可以相互引用,起到了节约磁盘空间的作用;可以跑以下命令找到store的具体目录;
store存储的好处
- 相同名字和版本的包只会在store中安装一次;
- 如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库。 例如,如果某个包有100个文件,而它的新版本只改变了其中1个文件。那么
pnpm update时只会向存储中心额外添加1个新文件,而不会因为仅仅一个文件的改变复制整新版本包的内容。 所以整个安装速度会比较快;
关键知识点——软链接和硬链接
软链接(Symbolic Link)
- 是一个特殊的文件,比如A是B的软链接,A和B执行两个不同的数据块,A中存放的是B的路径,所A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
硬链接(Hard Link)-ln
- 通过索引节点来进行链接,比如有A、B两个文件名指向同一份文件,就是指向同一索引节点,可以使得一个文件拥有多个有效的路径名,防止被"误删"
软链接和硬链接在pnpm中应用
直接依赖软链接到.pnpm中,.pnpm中的资源硬链接到store中,store中的资源全局垮项目共享;