pnpm 对 peer dependencies 的处理更加严格和正确,这是其重要特性之一。
什么是 Peer Dependencies:
json// react-dom/package.json { "peerDependencies": { "react": "^18.0.0" // 需要宿主项目提供 react } }
npm/Yarn 的问题:
bash# 项目依赖 { "dependencies": { "react": "^17.0.0", "react-dom": "^18.0.0" # 需要 react 18 } } # npm/Yarn 可能静默安装,导致版本不匹配 # 运行时才发现问题
pnpm 的严格处理:
bash# 安装时报错 pnpm install # ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies # react-dom@18.0.0 requires react@^18.0.0 but you have react@17.0.0
解决方案:
- 正确安装匹配版本
bashpnpm add react@18 react-dom@18
- 使用 pnpm.overrides
json// package.json { "pnpm": { "overrides": { "react": "^18.0.0" } } }
- 忽略 peer dependency(不推荐)
json{ "pnpm": { "peerDependenciesMeta": { "react": { "optional": true } } } }
peerDependencies 的正确使用:
json// 插件包的 package.json { "name": "my-react-plugin", "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" }, "peerDependenciesMeta": { "react-dom": { "optional": true // 可选的 peer dependency } } }
monorepo 中的处理:
yaml# pnpm-workspace.yaml packages: - 'packages/*' # packages/plugin/package.json { "peerDependencies": { "react": "^18.0.0" } } # packages/app/package.json { "dependencies": { "react": "^18.0.0", "@my-org/plugin": "workspace:*" } } # pnpm 会自动将 app 中的 react 提供给 plugin
自动安装 peer dependencies:
toml# .npmrc auto-install-peers=true # 自动安装 peer dependencies strict-peer-dependencies=false # 不严格检查
对比总结:
| 特性 | npm/Yarn | pnpm |
|---|---|---|
| 检查时机 | 可能延迟到运行时 | 安装时立即检查 |
| 错误提示 | 可能不明显 | 明确的错误信息 |
| 版本冲突 | 可能静默忽略 | 严格报错 |
| monorepo 支持 | 一般 | 优秀 |