pnpm / Yarn / npm 覆盖依赖用法对比

pnpm / Yarn / npm 覆盖依赖用法对比

特性 / 维度 pnpm: overrides Yarn: resolutions npm: overrides
配置位置 pnpm-workspace.yamlpackage.jsonpnpm.overrides 字段 package.jsonresolutions 字段 package.jsonoverrides 字段(npm 8.3+ 支持)
作用范围 可以覆盖任意依赖树中的依赖(全局 + 子依赖) 全局覆盖依赖,影响所有匹配项 可以覆盖任意依赖树中的依赖(全局 + 子依赖)
覆盖粒度 支持全局覆盖 / 子依赖覆盖(如 foo>bar) / 版本范围覆盖 主要是全局覆盖,不能单独针对某个子依赖 支持全局覆盖 / 子依赖覆盖(如 foo>bar) / 版本范围覆盖
删除依赖 ✅ 支持 "-" 删除子依赖(适合 optionalDependencies) ❌ 不支持删除依赖 ❌ 不支持删除依赖
替换 fork 包 ✅ 支持(如 npm:@org/pkg@1.0.0 ❌ 不支持 ✅ 支持(如 npm:@org/pkg@1.0.0
引用顶层版本 ✅ 支持 $ 引用顶层依赖版本 ❌ 不支持 ❌ 不支持
典型使用场景 安全漏洞修复、统一依赖版本、删除无用依赖、替换 fork 安全漏洞修复、统一版本 安全漏洞修复、替换 fork、统一依赖版本
适用范围 最终应用项目(不推荐在库中使用) 应用或库都可用(库发布时一般不推荐) 应用或库都可用

🔹 使用示例

1. pnpm.overrides

perl 复制代码
// package.json
{
  "pnpm": {
    "overrides": {
      "lodash": "4.17.21",          // 全局覆盖 lodash 版本
      "foo>bar": "1.2.3",           // 覆盖 foo 的子依赖 bar
      "quux": "npm:@myorg/quux@2.0" // 替换为 fork 包
    }
  }
}

删除子依赖示例:

json 复制代码
"pnpm": {
  "overrides": {
    "foo>bar": "-"   // 删除 foo 的 bar 子依赖
  }
}

2. Yarn resolutions

json 复制代码
// package.json
{
  "resolutions": {
    "lodash": "4.17.21",  // 全局覆盖 lodash
    "foo/bar": "1.2.3"    // 覆盖 foo 的 bar(Yarn v2+ 支持路径写法)
  }
}

Yarn 不支持删除依赖或引用顶层版本。


3. npm overrides

perl 复制代码
// package.json
{
  "overrides": {
    "lodash": "4.17.21",            // 全局覆盖 lodash
    "foo>bar": "1.2.3",             // 覆盖 foo 的 bar 子依赖
    "quux": "npm:@myorg/quux@2.0"   // 替换为 fork 包
  }
}

npm 目前不支持删除子依赖,也不支持 $ 引用顶层版本。


🔹 总结

  • Yarn resolutions:功能最简单,主要是"强制锁定版本"。
  • npm overrides:功能比 Yarn 强,支持覆盖子依赖和替换包,但不能删除。
  • pnpm overrides:功能最强大,支持覆盖、删除、替换、引用顶层版本,适合复杂依赖树管理。
相关推荐
HuangYongbiao16 分钟前
Rspack 原理:webpack,我为什么不要你
前端
yinuo19 分钟前
前端项目开发阶段崩溃?试试这招“Node 内存扩容术”,立马复活!
前端
前端鳄鱼崽21 分钟前
【react-native-inspector】全网唯一开源 react-native 点击组件跳转到编辑器
前端·react native·react.js
用户984022766791821 分钟前
【React.js】渐变环形进度条
前端·react.js·svg
90后的晨仔22 分钟前
Webpack完全指南:从零到一彻底掌握前端构建工具
前端·vue.js
Holin_浩霖23 分钟前
JavaScript 语言革命:ES6+ 现代编程范式深度解析与工程实践
前端
前端拿破轮29 分钟前
从0到1搭一个monorepo项目(一)
前端·javascript·git
m0_7414122433 分钟前
大文件上传与文件下载
前端
wu_jing_sheng034 分钟前
Python中使用HTTP 206状态码实现大文件下载的完整指南
开发语言·前端·python
90后的晨仔40 分钟前
Vue3项目全面部署指南:从构建到上线
前端·vue.js