乐闻世界logo
搜索文章和话题

pnpm 的 overrides 和 resolutions 有什么区别?如何使用?

3月6日 23:39

pnpm 提供了强大的依赖覆盖机制,主要通过 overridesresolutions 来实现。

pnpm.overrides:

用于强制覆盖依赖版本,无论原始依赖声明什么版本。

json
// package.json { "pnpm": { "overrides": { "lodash": "^4.17.21", "react": "^18.0.0" } } }

使用场景:

  1. 修复安全漏洞
json
{ "pnpm": { "overrides": { "minimist@<1.2.6": "^1.2.6" } } }
  1. 强制统一版本
json
{ "pnpm": { "overrides": { "typescript": "^5.0.0" } } }
  1. 替换包
json
{ "pnpm": { "overrides": { "node-sass": "sass" } } }

路径覆盖:

json
{ "pnpm": { "overrides": { "react": "$react", // 使用项目中的版本 "webpack>lodash": "^4.17.21" // 只覆盖 webpack 的 lodash } } }

resolutions(Yarn 兼容):

json
// package.json { "resolutions": { "lodash": "^4.17.21" } }

区别对比:

特性pnpm.overridesresolutions
适用范围所有依赖所有依赖
优先级
Yarn 兼容
路径指定
版本引用

实际应用示例:

json
// 复杂覆盖场景 { "dependencies": { "react": "^18.0.0", "react-dom": "^18.0.0", "antd": "^5.0.0" }, "pnpm": { "overrides": { // 确保所有包使用相同 React 版本 "react": "$react", "react-dom": "$react-dom", // 修复 antd 的某个依赖漏洞 "antd>rc-util": "^5.30.0", // 替换废弃的包 "request": "axios" } } }

验证覆盖效果:

bash
# 查看实际安装的版本 pnpm list react # 查看依赖树 pnpm list --depth=10 # 查看为什么安装了这个版本 pnpm why lodash

注意事项:

  1. 谨慎使用全局覆盖
json
// ❌ 不推荐:全局覆盖可能导致不兼容 { "pnpm": { "overrides": { "react": "^18.0.0" } } } // ✅ 推荐:路径指定更精确 { "pnpm": { "overrides": { "some-package>react": "^18.0.0" } } }
  1. 更新锁文件
bash
# 修改 overrides 后需要重新安装 pnpm install # 或强制更新 pnpm install --force
标签:PNPM