包管理工具:pnpm | 京东云技术团队
作者:京东零售 杨秀竹
pnpm 是什么
pnpm( performant npm )指的是高性能的 npm,与 npm 和 yarn 一样是一款包管理工具,其根据自身独特的包管理方法解决了 npm、yarn 内部潜在的安全及性能问题,在多数情况下拥有更快速的安装速度、占用更小的存储空间,结合官网给出的性能测试及项目中的使用表现,其具有良好的应用前景。
pnpm 优势
更快的依赖安装速度
pnpm 通过特有的依赖管理方式,使其与其他包管理器相比具有更快的依赖安装速度,下图是官网给出的性能测试数据,在不同情况下安装、更新依赖包的速度性能表现,可以看出在多数情况下其耗时相比于其他包管理工具更短。
更小的包管理空间
使用 pnpm 时,依赖会被存储在内容可寻址的同一存储空间,可以节省大量的磁盘空间。
1、如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库(store)。
2、所有文件都会存储在硬盘上的某一位置。
更高效安全的依赖管理方式
npm3 与 yarn 存在幽灵依赖(Phantom dependencies)以及 NPM 分身(NPM doppelgangers )问题
pnpm 默认创建一个非平铺的 node_modules 及网状链接的包管理方式,因此代码无法访问任意包避免了幽灵依赖问题;又因为依赖始终都是存在 store 目录下,通过硬链接(hard links)进行寻址,一份相同的依赖始终只会被安装一次,因此可以避免 npm 分身问题。
独特的依赖管理方式( links + store)
links
pnpm 通过链接( links)与全局存储空间(store)管理的不同项目的 node_modules 依赖。硬链接(hard links)能指向磁盘上原始文件所在的同一位置(store),但是因为 pnpm 的 node_modules 是树形目录结构,且硬链接只能用于文件不能用于目录,因此需要通过软链接(symbolic link)来实现目录寻址,通过如下一张项目依赖关系图可以更好的理解 pnpm 是如何进行依赖寻址的。
store
pnpm 会使用名为 .pnpm-store 的存储路径来存储该磁盘项目下的所有 node_modules 依赖,通常是在项目的根目录下,Mac/linux 中默认会设置到 {home dir}>/.pnpm-store/v3;windows 下会设置到当前盘的根目录下,比如 D 盘(D/.pnpm-store/v3)。由于硬链接寻址的限制,pnpm 不可以跨多个驱动器或文件系统工作,即不同的系统磁盘目录都会存处一份依赖包。
项目应用
从 npm、yarn 进行迁移的过程
pnpm 的安装
有无安装 nodejs,pnpm 都提供了对应的安装方式,具体指令可参考官网,将 npm 对应的指令置换为 pnpm 即可。在安装 pnpm 时需要注意 nodejs 的兼容版本
lock 文件迁移
通过 pnpm import 可以将 npm、yarn 的 lock 文件迁移生成 pnpm-lock.yaml 锁定依赖版本
总结
pnpm 通过软、硬链接(hark link、symbolic link) + 全局存储(store)结合的依赖管理方式完全实现了依赖树结构的包管理方式,解决了 npm3 及 yarn 中的幽灵依赖和 npm 分身的问题,提升了依赖包的安装速度,减小了磁盘空间占用。
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/d41073b219ab5218176f7b311】。文章转载请联系作者。
评论