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:功能最强大,支持覆盖、删除、替换、引用顶层版本,适合复杂依赖树管理。
相关推荐
风骏时光牛马10 小时前
C语言核心高频问题与代码实战梳理
前端
葬送的代码人生10 小时前
别再「Ctrl+C/V」了!Git 开发必备技能,10 分钟告别单机码农
前端·github·代码规范
xuankuxiaoyao10 小时前
vue.js 设计与开发 ---路由
前端·javascript·vue.js
ZC跨境爬虫10 小时前
跟着 MDN 学CSS day_6:(伪类和伪元素详解)
前端·javascript·css·数据库·ui·html
idcu10 小时前
Lyt.js + Vite 快速开发指南
前端·typescript
暗不需求10 小时前
玩转 React Hooks:从基础到实战,逐行解析带你彻底掌握
前端·react.js·面试
一颗小青松10 小时前
css 文字区域根据图片形状显示,根据文字设置背景图
前端·css
阿黎梨梨10 小时前
跟 Git 打交道的正确姿势
前端
idcu10 小时前
深入 Lyt.js 路由系统:L6 生态系统层的核心
前端·typescript
idcu10 小时前
用 Lyt.js 构建 Todo 应用:完整教程
前端·typescript