什么是 pnpm?

173 阅读2分钟

速度快、节省磁盘空间的软件包管理器

对比 npmyarnpnpm 可以极大地提升安装速度和节省磁盘空间。

NPM 和 Yarn 存在的问题

当使用 npm 时,如果你有 100 个项目,并且所有项目都有一个相同的依赖包,那么, 你在硬盘上就需要保存 100 份该相同依赖包的副本。如下

image.png

npm v1npm v2 中,包是通过嵌套结构进行管理的, 通过这种方式管理包,有多种缺点

  • 依赖无法被共用,例如 package-cpackage-d 两个模块引用了相同版本的 lodash@3.0.0,嵌套结构会安装两次 lodash@3.0.0,造成磁盘空间的浪费,以及安装依赖时的低效。
  • 依赖层级太深,导致文件路径过长,在不同的操作系统下有存在问题,在 windows 中复制目录会报错,路径长度超过限制。

npm v3 开始

通过扁平化处理,解决依赖无法被共用,依赖层级太深的问题,所有的依赖都被平铺在node_modules ****中的一级目录。这样在安装新的依赖时,根据 node 加载模块的路径查找算法,递归向上查找 node_modules ****中的 package ****,这种查找核心简单来说是

  • 优先在同级目录查找 node_modules 文件夹
  • 如果同级目录下没有 node_modules 或者没有找到相关版本的依赖,会继续在上一级目录中查找,解决了包重复安装的问题,本地开发项目大小得到了改善。

随着 node_modules 扁平化的提出,解决问题也伴随着问题的产生。

node_modules 困境 - 知乎 (zhihu.com)

PNPM 的包管理机制

pnpm 结构图.png

针对以上问题,如图所见,pnpm通过软链接和硬链接的方式去解决了依赖包重复调用的问题。

  • node_module里面存放的是一个一个软链接,软链接的体积非常小
  • 由于是链接形式,相同的依赖包会指向同一个硬链接
  • 再通过硬链接的方式指向全局的pnpm依赖库,由于有硬链接和全局依赖库的存在,那么不同项目的包也就不会重复。

pnpm针对相同依赖包的不同版本做了对比优化,会对比两个版本的文件异同, 如果新版本有不同之处,则只会在依赖库中添加新版本的不同文件,而其他相同的文件则会保留。

总结

经过以上的对比分析,可以看出pnpm是真正的解决node_modules的依赖困境,主要通过软链接和硬链接的结合使用,最终达到节省磁盘空间,安装速度快,严格高效等优点。