できない.dev

peerDependencies

別名: peer dependency / ピア依存 / peer-dependency

プラグインなどが「ホスト側にこのバージョンが入っている前提で動く」と宣言する依存。npm 7 以降は実体としてインストールされている版が範囲を満たすかを厳格に検査する。

#npm#peer-dependency#package-json#dependency#eresolve

公開:

定義

peerDependencies は、package.json「自分はこのパッケージのバージョン X 系を前提として動く」 と宣言する依存指定。
プラグイン・ホストの関係が典型で、ホスト本体(React / ESLint / webpack 等)に直接依存するのではなく、利用者側に同じ範囲のバージョンを入れさせる仕組み。

詳細

ホスト側のインスタンスを「共有」して動くケースで使われる(React Hooks がコンテキストを共有するなど)。
npm v6 以前は警告のみだったが、npm v7 以降は厳格化 され、解決できないと ERESOLVE unable to resolve dependency tree でインストールが停止する。
複数プラグインの要求範囲が交わらないと衝突する。
一時回避は --legacy-peer-deps、恒久対応は overrides で版を固定するのが定石。
仕様は npm package.json 公式ドキュメント に詳しい。

よくある誤解

  • dependencies に書けばよい: ホスト本体を dependencies に入れると依存ツリーの別位置に別バージョンが入り、多重インスタンス になって Hooks の挙動などが壊れる。
  • devDependencies と同じ: 違う。devDependencies は開発時のみ、peerDependencies はランタイムでもホストが必要。
    両方に併記するパターンもある。

関連

解決失敗の代表例が ERESOLVE unable to resolve dependency tree
ESLint プラグインの読み込み失敗も同根の plugin not found を参照。