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:功能最强大,支持覆盖、删除、替换、引用顶层版本,适合复杂依赖树管理。