Hello,大家好,我是 Sunday。
在包管理工具的赛道上,pnpm 一直是开发者眼中的 “性能之选”。它通过独特的硬链接机制和优秀的性能表现,成功的在包管理工具上占据了一席之地。
而就在最近,pnpm v10 正式发布,这次发布包含了众多重大更新和功能改进,尤其是对安全性和性能的提升!
今天,咱们就一起来看看 v10 带来了哪些变化,以及这些变化将如何影响我们的日常开发。
核心变化一览
1. 默认禁用依赖生命周期脚本
pnpm v10 默认不再执行依赖的生命周期脚本(如 postinstall 和 preinstall)。这是一个显著的安全增强,可以有效防止恶意脚本在安装依赖时被执行。
如果需要允许某些特定依赖执行生命周期脚本,可以在 package.json 中通过 pnpm.onlyBuiltDependencies 字段进行显式配置。例如:
{
"pnpm": {
"onlyBuiltDependencies": ["fsevents"]
}
}
2. 改进的 pnpm link
pnpm link 的行为在 v10 中进行了优化:
- 工作区中:pnpm link 现在会将链接信息添加到工作区的根级 package.json,从而让所有项目都能共享相同的链接。
- 全局链接:想要全局链接一个包,只需在包的目录下运行 pnpm link,不再需要额外指定 -g 参数。
3. 安全性升级:全面切换到 SHA256 哈希算法
pnpm v10 将多个关键部分的哈希算法更新为 SHA256,以提升安全性和一致性:
- node_modules/.pnpm 中长路径的哈希。
- 锁定文件中的长依赖项哈希。
- pnpm-lock.yaml 文件的多项校验值(如 packageExtensionsChecksum 和 sideEffects)。
- 侧效缓存(Side Effects Cache)的校验值。
4. 配置管理更加智能
pnpm v10 对配置的管理也进行了优化:
- manage-package-manager-versions 默认启用:pnpm 会根据 package.json 中的 packageManager 字段自动管理版本。
- 公共提升(public hoisting)模式更新:默认情况下,不再提升任何包到 node_modules 根目录。这对依赖冲突的处理更加友好。
- 减少脚本执行中的环境变量:仅保留必要的环境变量(如 npm_package_name 和 npm_package_version),减少了不必要的污染。
5. 更智能的依赖安装
pnpm v10 对依赖安装的逻辑进行了多处优化:
- 即使 NODE_ENV=production,也会安装所有依赖。这解决了一些生产环境下依赖缺失的问题。
- 更快的重复安装:在重复执行安装命令时,pnpm 会快速校验 node_modules 是否已经是最新状态,无需重新生成。
- 增强的依赖验证:新增 verify-deps-before-run 设置,可控制在运行脚本前对依赖的检查策略(如自动安装、警告或抛出错误)。
6. 全球存储与索引优化
pnpm v10 对全局存储和依赖索引进行了优化:
- 存储版本升级到 v10:支持同一内容的不同包名或版本共享索引文件,从而提升一致性。
- 更高效的副作用缓存索引:仅记录文件差异,而非所有文件,节省了存储空间。
- 更可靠的依赖校验:通过存储内容哈希和包标识符,确保锁定文件中的完整性与一致性。
7. 新增支持:配置依赖(Configurational Dependencies)
pnpm v10 引入了一种新的依赖类型 配置依赖(configurational dependencies),这些依赖会在其他依赖之前优先安装。
配置依赖无法拥有自己的依赖或生命周期脚本,必须使用确切的版本号和校验值进行安装,例如:
{
"pnpm": {
"configDependencies": {
"my-configs": "1.0.0+sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="
}
}
}