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

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

特性 / 维度 pnpm: overrides Yarn: resolutions npm: overrides
配置位置 pnpm-workspace.yaml 或 package.json 的 pnpm.overrides 字段 package.json 的 resolutions 字段 package.json 的 overrides 字段(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:功能最强大,支持覆盖、删除、替换、引用顶层版本,适合复杂依赖树管理。
相关推荐
Java后端的Ai之路6 小时前
06-React-Props
前端·react.js·前端框架
Flynt7 小时前
开源"间谍卫星"说数据全是真的,我把它的免key数据源挨个试了一遍
前端·开源·数据可视化
Csvn7 小时前
渲染管线
前端
程序员大阳7 小时前
副队长CSS教程(33)–圆角与透明
前端·css·透明·圆角
志尊宝7 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
鬼手点金8 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉8 小时前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化
IMPYLH8 小时前
HTML 的 <wbr> 元素
前端·html
Dovis(誓平步青云)9 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus
IT_陈寒10 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端