pnpm 11 发布,弃用 JSON 和 npm CLI,进化为纯 ES6 模块,新增 pnpm pack-app 等命令,供应链保护默认启用,要求 Node

今日要闻

打破信息壁垒,走近全球前端。Hello World 大家好,我是林语冰。

pnpm 发布了 v11 主版本,涵盖了新功能和破坏性更新,主要包括:

  • pnpm 现在以纯 ESM 模块分发,且要求 node@>=22
  • 全局模块安装隔离,模块的 JSON 存储索引换用 SQLite 数据库
  • pnpm view 等命令原生实现,不再委托给 npm CLI
  • 供应链保护默认启用,新增配置或修改默认值

新功能

pnpm CLI 新命令

pnpm@11 新增了一些终端命令:

  • pnpm pack-app:通过 Node SEA(独立可执行应用)把 CJS 项目打包成多平台的独立可执行文件
  • pnpm peers check:检查锁定文件中的对等依赖
  • 所有新命令另请参阅 pnpm 官方文档......

此外,pnpm@11 还提供了一些简写的新别名:

完整命令 简写别名
pnpm pn
pnpx / pnpm dlx pnx
--filter -F

供应链保护

由于 axios 等重大供应链攻击事件频发,pnpm 从 v10 开始就提供了一些缓解供应链攻击的防御机制,pnpm@11 继续新增功能或修改了默认配置。

为了缓解供应链攻击,我们希望模块新版本刚发布时不要立即同步更新,而是暂缓观察,确保安全后再更新。

为此,pnpm@10.16pnpm-workspace.yaml 中新增了 minimumReleaseAge,支持配置模块更新的最小发布延时,但该配置的默认值是 0,也就意味着默认不开启。

在此基础上,pnpm@11minimumReleaseAge 默认值修改为 1440 分钟,确保模块的新版本延时 至少一天 再升级。

yaml 复制代码
# pnpm 10.16 之后的默认值:
minimumReleaseAge: 0
# pnpm 11 之后的默认值:
minimumReleaseAge: 1440

如果你升级到 pnm@11 之后,仍想回退到 pnpm@10 的默认行为,可以重置为 minimumReleaseAge: 0

此外,大多数供应链攻击会在 npm install <pkg> 之后,通过 postinstall 脚本自动运行恶意代码,因此 pnpm@10 开始就禁用了 postinstall 脚本。

同时,pnpm@11 使用 allowBuilds 取代了 ignoreDepScripts 等旧版配置,建议用它来显式列出可信任的依赖,允许它们运行脚本。

yaml 复制代码
# ❌ pnpm 10 的配置全部移除:
onlyBuiltDependencies:
  - electron
onlyBuiltDependenciesFile: "allowed-builds.json"
neverBuiltDependencies:
  - core-js
ignoredBuiltDependencies:
  - esbuild
# ✅ pnpm 11 之后:
allowBuilds:
  electron: true
  core-js: false
  esbuild: false

PS:更多缓解供应链攻击的措施,另请参阅 pnpm 官方指南。

底层实现变动

pnpm@11 之前,模块索引使用 JSON 文件来存储,现在换用为单一 SQLite 数据库。

另外,使用 pnpm add -g <pkg>pnx 命令安装的全局模块会使用全局虚拟存储隔离,package.jsonnode_modules/ 和锁定文件存储在自己单独的文件夹下,防止全局模块之间互相干扰。

还有,pnpm view 等命令原本委托 npm CLI 来实现,现在 pnpm 自己原生实现,不再委托 npm。

结果,pnpm publish 等命令都是原生实现,pnpm set-script 等命令直接删除,运行没有实现的冷门命令时,pnpm 也会报警告诉你。

底层依赖方面,采用 undici 取代了 node-fetch,用于所有 HTTP 请求,爽用更好的 keep-alive 和优化的全局调度器。

升级须知

pnpm@11 现在以纯 ESM 模块格式分发,且要求 node>=22

pnpm 升级大致有两种场景,全局升级或本地项目升级。

pnpm 现在只会从 .npmrc 读取注册源和认证授权配置,其他配置不再从 .npmrc 中读取。所以,将 pnpm 的本地设置从 .npmrc 迁移到 pnpm-workspace.yaml,将全局配置迁移到 ~/.config/pnpm/config.yaml

pnpm 提供了自动迁移工具,能迁移大部分配置,但少数配置还是需要手动调整。

pnpm@10 升级到 pnpm@11 属于主版本升级,不仅涵盖新功能还涉及不向后兼容的破坏性更新,另请参阅 pnpm 完整的迁移指南。

重点总结

总之,pnpm@11 主版本更新主要包括:

  • pnpm 新增了命令和简写别名,升级要求 node@>=22
  • 全局模块安装存储索引换用 SQLite 数据库,避免互相干扰
  • pnpm view 等命令原生实现,.npmrc 只读取注册源和认证相关配置
  • 供应链保护默认禁用恶意脚本和启用延迟依赖更新,allowBuilds 替换旧配置等

以上就是今日《前端快讯》的全部内容了,希望对你有所帮助。

👍 感谢大家按赞跟转发分享本文,你的手动支持是我坚持创作的不竭动力喔。

😘 已经关注我的粉丝们,我们下期再见啦,掰掰~~

参考文献:

相关推荐
漓漾li1 小时前
每日面试题-前端2
前端·react.js·面试
Alice-YUE1 小时前
深入解析 JS 事件循环:浏览器与 Node.js 的差异全解析
前端·javascript·笔记·学习
HYCS1 小时前
用pixijs实现fabricjs(二):对象的基础位置信息
前端·javascript·canvas
Alice-YUE1 小时前
【无标题】
开发语言·javascript·ecmascript
淸湫1 小时前
项目中使用了全局权限管理,请详细描述如何通过Vue Router的路由守卫来实现全局权限控制?
前端·vue.js
Twsit丶1 小时前
ECMAScript 常用特性整理(ES6 — ES13)
javascript
雪铃儿1 小时前
Shorebird 之外,Flutter Android 热更新还有什么选择
android·前端
李剑一1 小时前
前端必看 | Vue 刷新页面,生命周期钩子直接 "罢工",原来问题在这?90% 开发者都栽过!
前端·vue.js
閞杺哋笨小孩2 小时前
域名驱动多租户入驻:后台配置 + 前端解析
前端·vue.js