长期以来,因为其与 Node.js 天然集成,NPM(Node Package Manager)一直是行业标准,但现在出现了一个新的竞争者:PNPM(Pinned Node Package Manager)。PNPM 提供了高速度、资源效率、有洞察力的日志,并且效率是 NPM 的 3 倍,它将自己定位为 npm 的一个可行替代方案,并展示了为什么 NPM 可能在落后。
在比较 PNPM 和 Yarn 时,可以明显看出,无论缓存类型(冷或热)如何,PNPM 在速度方面都优于 Yarn。PNPM 速度快的关键在于其文件链接方法,它只需从全局存储中链接文件,而 Yarn 则采用从缓存中复制文件的方法。此外,PNPM 不会在磁盘上多次保存软件包版本,从而确保高效使用磁盘。
2024年04月16日,PNPM 迎来了 v9.0.0 版本,带来了众多改进:
- 放弃对 Node.js v16 的支持
- Corepack 兼容性
- 配置更新
- 改进锁文件
- 改进依赖关系解析
- 其他
放弃对 Node.js v16 的支持
如果您仍然需要 Node.js 16,请不要担心。我们将 pnpm 与 Node.js 捆绑在一起。这意味着无论您安装的是哪个版本的 Node.js,pnpm 都将使用必要的 Node.js 运行时运行。为此,您需要使用独立脚本安装 pnpm 或安装 @pnpm/exe
软件包。
Corepack 兼容性
pnpm 现在会检查 package.json
文件中是否有 packageManager
字段。如果该字段指定了与当前使用的不同的软件包管理器或不同版本的 pnpm,pnpm 将不会继续执行。这将确保您始终使用项目所需的正确软件包管理器和版本。
注意:如果想降低检查的严格程度,请将 package-manager-strict 设置为 false,或将 COREPACK_ENABLE_STRICT
环境变量设置为 0。
配置更新
- dedupe-injected-deps: 默认已启用。
- link-workspace-packages: 默认禁用。这意味着默认情况下,只有在使用工作区协议指定依赖包时,才会从工作区包链接依赖包。
- hoist-workspace-packages: 默认启用。
- enable-pre-post-scripts:默认已启用。
在 macOS 上使用与 Linux 上相同的目录来存放状态文件(~/.local/state/pnpm)。
改进锁文件
- 采用了 Lockfile v9。新格式的变化是为了提高可读性,并更好地抵御 Git 冲突。
- 放弃对 lockfile v5 的支持。使用 pnpm v8 将 lockfile v5 转换为 lockfile v6。
改进依赖关系解析
可从依赖关系图中的任意软件包解析可选的同行依赖关系
其他
pnpm licenses list
会打印同一软件包所有版本的许可证信息,以防不同版本使用不同的许可证。pnpm licenses list --json
输出格式已更改。
添加了一条新命令,用于向控制台打印完成代码:pnpm completion
。删除了修改用户 shell dotfiles 的旧命令。
安装 git 托管的依赖包时,只选择与软件包一起打包的文件。
同时还带来了众多次要更新、bug修复,具体参见:github.com/pnpm/pnpm/r…
快速安装
# Node.js 已安装
npm install -g pnpm
# Node.js 未安装(以 exe 形式包含在软件包中)
npm install -g @pnpm/exe