共计 2109 个字符,预计需要花费 6 分钟才能阅读完成。
作者:京东批发 杨秀竹
pnpm 是什么
pnpm(performant npm)指的是高性能的 npm,与 npm 和 yarn 一样是一款包管理工具,其依据本身独特的包治理办法解决了 npm、yarn 外部潜在的平安及性能问题,在少数状况下领有更疾速的装置速度、占用更小的存储空间,联合官网给出的性能测试及我的项目中的应用体现,其具备良好的利用前景。
pnpm 劣势
更快的依赖装置速度
pnpm 通过特有的依赖治理形式,使其与其余包管理器相比具备更快的依赖装置速度,下图是官网给出的性能测试数据,在不同状况下装置、更新依赖包的速度性能体现,能够看出在少数状况下其耗时相比于其余包管理工具更短。
action | cache | lockfile | node_modules | npm | pnpm | Yarn | Yarn PnP |
---|---|---|---|---|---|---|---|
install | 37.6s | 17.3s | 22.1s | 20.2s | |||
install | ✔ | ✔ | ✔ | 2.1s | 1.4s | 695ms | n/a |
install | ✔ | ✔ | 8.8s | 4.7s | 8.8s | 668ms | |
install | ✔ | 13.1s | 8s | 22.8s | 15.2s | ||
install | ✔ | 13.7s | 14.7s | 8.9s | 670ms | ||
install | ✔ | ✔ | 2.6s | 4s | 16s | n/a | |
install | ✔ | ✔ | 2s | 1.4s | 681ms | n/a | |
install | ✔ | 2.5s | 14.1s | 16.6s | n/a | ||
update | n/a | n/a | n/a | 8.3s | 7.4s | 8.7s | 16.9s |
更小的包治理空间
应用 pnpm 时,依赖会被存储在内容可寻址的同一存储空间,能够节俭大量的磁盘空间。
1、如果你用到了某依赖项的不同版本,只会将不同版本间有差别的文件增加到仓库(store)。
例如,如果某个包有 100 个文件,而它的新版本只扭转了其中 1 个文件。那么 pnpm update 时只会向存储核心额定增加 1 个新文件,而不会因为仅仅一个文件的扭转复制整新版本包的内容。
2、所有文件都会存储在硬盘上的某一地位。
当软件包被被装置时,包里的文件会硬链接到这一地位,而不会占用额定的磁盘空间这容许你跨我的项目地共享同一版本的依赖。
更高效平安的依赖治理形式
npm3 与 yarn 存在幽灵依赖(Phantom dependencies)以及 NPM 分身(NPM doppelgangers)问题
pnpm 默认创立一个非平铺的 node_modules 及网状链接的包治理形式,因而代码无法访问任意包防止了幽灵依赖问题;又因为依赖始终都是存在 store 目录下,通过硬链接(hard links)进行寻址,一份雷同的依赖始终只会被装置一次,因而能够防止 npm 分身问题。
幽灵依赖:某个包没有在 package.json 被依赖,然而用户却可能援用到这个包
npm 包分身:在 npm3+ 和 yarn 中,因为存在 hoist 机制,可能大量的依赖被反复装置,导致 npm/yarn 的性能损失
独特的依赖治理形式(links + store)
links
pnpm 通过链接 (links) 与全局存储空间(store)治理的不同我的项目的 node\_modules 依赖。硬链接(hard links)能指向磁盘上原始文件所在的同一地位(store),然而因为 pnpm 的 node\_modules 是树形目录构造,且硬链接只能用于文件不能用于目录,因而须要通过软链接(symbolic link)来实现目录寻址,通过如下一张我的项目依赖关系图能够更好的了解 pnpm 是如何进行依赖寻址的。
store
例如,如果您的我的项目中多处都应用 foo 包并且它占用 1MB 的空间,那么看起来它在我的项目的 node_modules 文件夹中占用了与全局存储(.pnpm store)雷同的 1MB 空间。然而,该 1MB 是磁盘上两个不同地位的雷同空间,所以 foo 总共占用 1MB,而不是 2MB。
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 的兼容版本
npm install -g pnpm
Node.js | pnpm 5 | pnpm 6 | pnpm 7 | pnpm 8 |
---|---|---|---|---|
Node.js 12 | ✔️ | ✔️ | ❌ | ❌ |
Node.js 14 | ✔️ | ✔️ | ✔️ | ❌ |
Node.js 16 | 未知 | ✔️ | ✔️ | ✔️ |
Node.js 18 | 未知 | ✔️ | ✔️ | ✔️ |
lock 文件迁徙
通过 pnpm import 能够将 npm、yarn 的 lock 文件迁徙生成 pnpm-lock.yaml 锁定依赖版本
总结
pnpm 通过软、硬链接(hark link、symbolic link)+ 全局存储(store)联合的依赖治理形式齐全实现了依赖树结构的包治理形式,解决了 npm3 及 yarn 中的幽灵依赖和 npm 分身的问题,晋升了依赖包的装置速度,减小了磁盘空间占用。