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

How does pnpm handle peer dependencies and how is it different from npm?

3月6日 23:39

pnpm handles peer dependencies more strictly and correctly, which is one of its important features.

What are Peer Dependencies:

json
// react-dom/package.json { "peerDependencies": { "react": "^18.0.0" // Requires host project to provide react } }

npm/Yarn Issues:

bash
# Project dependencies { "dependencies": { "react": "^17.0.0", "react-dom": "^18.0.0" # Needs react 18 } } # npm/Yarn may install silently, causing version mismatch # Problems only discovered at runtime

pnpm's Strict Handling:

bash
# Error during installation 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

Solutions:

  1. Install Correct Matching Version
bash
pnpm add react@18 react-dom@18
  1. Use pnpm.overrides
json
// package.json { "pnpm": { "overrides": { "react": "^18.0.0" } } }
  1. Ignore peer dependency (not recommended)
json
{ "pnpm": { "peerDependenciesMeta": { "react": { "optional": true } } } }

Correct Usage of peerDependencies:

json
// Plugin package's package.json { "name": "my-react-plugin", "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" }, "peerDependenciesMeta": { "react-dom": { "optional": true // Optional peer dependency } } }

Handling in 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 automatically provides react from app to plugin

Auto-install peer dependencies:

toml
# .npmrc auto-install-peers=true # Auto install peer dependencies strict-peer-dependencies=false # Non-strict checking

Comparison Summary:

Featurenpm/Yarnpnpm
Check TimingMay delay to runtimeCheck immediately at install
Error MessagesMay be unclearClear error messages
Version ConflictsMay silently ignoreStrict error reporting
Monorepo SupportAverageExcellent
标签:PNPM