pnpm 全称是 “Performant NPM”,即高性能的 npm。它结合软硬链接与新的依赖组织方式,大大提升了包管理的效率,也同时解决了 “幻影依赖” 的问题,让包管理更加规范,减少潜在风险发生的可能性。
使用 pnpm
很容易,可以使用 npm
安装:
npm i pnpm -g
之后便可用 pnpm
代替 npm
命令了,比如最重要的安装包步骤,可以使用 pnpm i
代替 npm i
,这样就算把 pnpm
使用起来了。
pnpm 的优势
用一个比较好记的词描述 pnpm
的优势那就是 “快、准、狠”:
快:安装速度快。
准:安装过的依赖会准确复用缓存,甚至包版本升级带来的变化都只 diff,绝不浪费一点空间,逻辑上也严丝合缝。
狠:直接废掉了幻影依赖,在逻辑合理性与含糊的便捷性上,毫不留情的选择了逻辑合理性。
而带来这些优势的点子,全在官网上的这张图上:

所有 npm 包都安装在全局目录
~/.pnpm-store/v3/files
下,同一版本的包仅存储一份内容,甚至不同版本的包也仅存储 diff 内容。每个项目的
node_modules
下有.pnpm
目录以打平结构管理每个版本包的源码内容,以硬链接方式指向 pnpm-store 中的文件地址。每个项目
node_modules
下安装的包结构为树状,符合 node 就近查找规则,以软链接方式将内容指向node_modules/.pnpm
中的包。
所以每个包的寻找都要经过三层结构:node_modules/package-a
> 软链接 node_modules/.pnpm/package-a@1.0.0/node_modules/package-a
> 硬链接 ~/.pnpm-store/v3/files/00/xxxxxx
。
经过这三层寻址带来了什么好处呢?为什么是三层,而不是两层或者四层呢?
依赖文件三层寻址的目的
第一层
接着上面的例子思考,第一层寻找依赖是 nodejs
或 webpack
等运行环境/打包工具进行的,他们的在 node_modules
文件夹寻找依赖,并遵循就近原则,所以第一层依赖文件势必要写在 node_modules/package-a
下,一方面遵循依赖寻找路径,一方面