乐闻世界logo
搜索文章和话题

pnpm 如何处理 peer dependencies?与 npm 有什么不同?

3月6日 23:39

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

解决方案:

  1. 正确安装匹配版本
bash
pnpm add react@18 react-dom@18
  1. 使用 pnpm.overrides
json
// package.json { "pnpm": { "overrides": { "react": "^18.0.0" } } }
  1. 忽略 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/Yarnpnpm
检查时机可能延迟到运行时安装时立即检查
错误提示可能不明显明确的错误信息
版本冲突可能静默忽略严格报错
monorepo 支持一般优秀
标签:PNPM