pnpm 的 overrides 和 resolutions 有什么区别?如何使用?
pnpm 提供了强大的依赖覆盖机制,主要通过 overrides 和 resolutions 来实现。pnpm.overrides:用于强制覆盖依赖版本,无论原始依赖声明什么版本。// package.json{ "pnpm": { "overrides": { "lodash": "^4.17.21", "react": "^18.0.0" } }}使用场景:修复安全漏洞{ "pnpm": { "overrides": { "minimist@<1.2.6": "^1.2.6" } }}强制统一版本{ "pnpm": { "overrides": { "typescript": "^5.0.0" } }}替换包{ "pnpm": { "overrides": { "node-sass": "sass" } }}路径覆盖:{ "pnpm": { "overrides": { "react": "$react", // 使用项目中的版本 "webpack>lodash": "^4.17.21" // 只覆盖 webpack 的 lodash } }}resolutions(Yarn 兼容):// package.json{ "resolutions": { "lodash": "^4.17.21" }}区别对比:| 特性 | pnpm.overrides | resolutions ||------|----------------|-------------|| 适用范围 | 所有依赖 | 所有依赖 || 优先级 | 高 | 中 || Yarn 兼容 | ❌ | ✅ || 路径指定 | ✅ | ❌ || 版本引用 | ✅ | ❌ |实际应用示例:// 复杂覆盖场景{ "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" } }}验证覆盖效果:# 查看实际安装的版本pnpm list react# 查看依赖树pnpm list --depth=10# 查看为什么安装了这个版本pnpm why lodash注意事项:谨慎使用全局覆盖// ❌ 不推荐:全局覆盖可能导致不兼容{ "pnpm": { "overrides": { "react": "^18.0.0" } }}// ✅ 推荐:路径指定更精确{ "pnpm": { "overrides": { "some-package>react": "^18.0.0" } }}更新锁文件# 修改 overrides 后需要重新安装pnpm install# 或强制更新pnpm install --force