ERESOLVE unable to resolve dependency tree は、インストールしようとしたパッケージが「このバージョンの○○と一緒に使ってください」(peer dependency)と指定している範囲と、プロジェクトに入っているバージョンが合わないときに出るエラーです。 npm 7 以降は、この食い違いを見つけるとインストールを止めます。

直し方は、上から順に検討します。

  1. パッケージを、今のバージョンに対応した版(または後継のパッケージ)に変える(本来の直し方)
  2. package.json の overrides で、どの版を使うかを明示する
  3. --legacy-peer-deps で、peer dependency のチェックを外す(一時しのぎ)

この記事では、React 19 と ESLint 9 でエラーを実際に起こし、それぞれの直し方を試した結果を並べました。

確認環境:Node.js 22.22.2、npm 10.9.7(表記の比較に npm 9・10.0〜10.8・11.21 も使用)、React 19.3.0(確認日 2026年10月10日)。

エラー文の読み方

React 19 のプロジェクトに、React 17 までにしか対応していない @testing-library/react-hooks を入れました。

$ npm i @testing-library/react-hooks@8
npm error code ERESOLVE
npm error ERESOLVE unable to resolve dependency tree
npm error
npm error While resolving: a@1.0.0
npm error Found: react@19.3.0
npm error node_modules/react
npm error   react@"^19.3.0" from the root project
npm error
npm error Could not resolve dependency:
npm error peer react@"^16.9.0 || ^17.0.0" from @testing-library/react-hooks@8.0.1
npm error node_modules/@testing-library/react-hooks
npm error   @testing-library/react-hooks@"8" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
行 意味 この例では
Found: 今プロジェクトに入っているバージョン react@19.3.0
Could not resolve dependency: の次の peer 入れようとしたパッケージが求める範囲 react の ^16.9.0 か ^17.0.0
from ... その範囲を求めているパッケージ @testing-library/react-hooks@8.0.1

「Found の版」と「peer の範囲」が重ならないのが原因です。この例では「React 19 が入っているのに、React 17 までのパッケージを入れようとした」と読めます。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「npm ERR! ERESOLVEの原因と直し方|peer依存の読み方」

npm ERR! と npm error は同じエラー

同じ操作を npm のバージョンを変えて実行すると、行頭の表記が変わりました。

npm のバージョン 行頭の表記
9、10.0.0〜10.5.0 npm ERR! code ERESOLVE
10.6.0 以降、11 npm error code ERESOLVE

内容は同じなので、どちらで検索しても、この記事の手順で直せます。

原因になりやすい組み合わせ

入っているもの 入れようとしたもの 起きること
React 19 React 18 までに対応したライブラリ peer の react@"^16 || ^17 || ^18" と合わない
ESLint 9 ESLint 8 までの設定パッケージ 下の再現例
Angular の新しい版 以前の版向けの周辺ライブラリ @angular/core の範囲が合わない
TypeScript の新しい版 型定義や周辺ツールの以前の版 typescript の範囲が合わない

ESLint 9 に、ESLint 8 までに対応した設定パッケージを入れた結果です。

$ npm i -D eslint@9 eslint-config-airbnb-base
npm error Found: eslint@9.39.5
npm error Could not resolve dependency:
npm error peer eslint@"^7.32.0 || ^8.2.0" from eslint-config-airbnb-base@15.0.0

本体をメジャーバージョンアップした直後に、周辺のパッケージが追いついていない、というのがほとんどのケースです。

直し方1:対応した版・後継のパッケージに変える

まず、パッケージの peer dependency を、版ごとに確認します。

$ npm view @testing-library/react-hooks@8 peerDependencies
@testing-library/react-hooks@8.0.1 {
  react: '^16.9.0 || ^17.0.0',
  'react-dom': '^16.9.0 || ^17.0.0',
  ...
}

最新の版でも React 17 までなので、このパッケージは React 19 に対応していません。@testing-library/react-hooks の機能(renderHook)は @testing-library/react に取り込まれていて、こちらは React 19 に対応しています。

$ npm view @testing-library/react version peerDependencies
version = '16.3.3'
peerDependencies = {
  react: '^18.0.0 || ^19.0.0',
  'react-dom': '^18.0.0 || ^19.0.0',
  ...
}
確認すること コマンド
最新版の peer dependency npm view パッケージ名 peerDependencies
すべての版の一覧 npm view パッケージ名 versions
特定の版の peer dependency npm view パッケージ名@版 peerDependencies
非推奨(後継の案内)になっていないか npm view パッケージ名 deprecated、パッケージの README

対応した版が出ていれば、その版を入れるのが本来の直し方です。 出ていなければ、後継のパッケージを探すか、本体(React など)のバージョンアップを周辺が追いつくまで待つ判断になります。

直し方2:overrides で使う版を明示する

「本体の新しい版でも動くことを自分で確かめた」場合は、package.json の overrides で、そのパッケージが使う版を指定できます。$react は「package.json の dependencies に書いた react と同じ指定」という意味です。

{
  "dependencies": {
    "@testing-library/react-hooks": "^8.0.1",
    "react": "^19.3.0",
    "react-dom": "^19.3.0"
  },
  "overrides": {
    "@testing-library/react-hooks": {
      "react": "$react",
      "react-dom": "$react-dom"
    }
  }
}
$ npm i
added 6 packages, and audited 7 packages in 913ms

$ npm ls react
d@1.0.0
+-- @testing-library/react-hooks@8.0.1 overridden
| `-- react@19.3.0 deduped
+-- react-dom@19.3.0 overridden

エラーにならずに入り、npm ci でも同じ結果になりました。overrides は package.json に残るので、なぜ上書きしたかがチームで分かります。ただし、パッケージが React 19 で正しく動くかは保証されないため、テストで確かめます。

直し方3:--legacy-peer-deps と --force

エラー文にある2つのオプションは、動きが違います。

オプション 動き 結果
--legacy-peer-deps peer dependency をまったく見ない(npm 3〜6 と同じ動き) 入るが、npm ls で invalid と表示される
--force さまざまな保護を外し、食い違いを警告にして入れる npm warn ERESOLVE overriding peer dependency と表示されて入る
$ npm i @testing-library/react-hooks@8 --legacy-peer-deps
added 3 packages, and audited 7 packages in 676ms

$ npm ls react
+-- @testing-library/react-hooks@8.0.1
| `-- react@19.3.0 deduped invalid: "^16.9.0 || ^17.0.0" from node_modules/@testing-library/react-hooks
$ npm i @testing-library/react-hooks@8 --force
npm warn using --force Recommended protections disabled.
npm warn ERESOLVE overriding peer dependency
...
added 3 packages, and audited 7 packages in 1s

npm の公式ドキュメントでも、--force は「何をしたいかがはっきりしていなければ使わないことを強く勧める」とされています。どちらかを使うなら、影響が peer dependency の扱いに限られる --legacy-peer-deps のほうが分かりやすいです。

--legacy-peer-deps で入れると、npm ci で再発する

--legacy-peer-deps を付けて作った package-lock.json で、付けずに npm ci(CI や他の人の環境)を実行すると、同じエラーになりました。

$ npm ci
npm error code ERESOLVE
npm error ERESOLVE could not resolve
npm error
npm error While resolving: @testing-library/react-hooks@8.0.1
npm error Found: react@19.3.0
...
npm error Conflicting peer dependency: react@17.0.2

自分の PC では動いたのに CI で落ちるのは、このためです。使い続けるなら、プロジェクトの .npmrc に書いて、全員・CI で同じ設定にします。

# .npmrc(package.json と同じフォルダ)
legacy-peer-deps=true

.npmrc に書くと、以後すべてのパッケージで peer dependency のチェックが外れるため、別の食い違いにも気づけなくなります。対象のパッケージが限られているなら、直し方2の overrides のほうが影響を絞れます。

3つの直し方の比較

直し方 安全さ チームでの再現 向いている場面
対応した版・後継に変える ◎ ◎(package.json に残る) まず検討する
overrides ○(動作は自分で確認) ◎(package.json に残る) 対応版が無いが、動くことを確認できた
.npmrc に legacy-peer-deps=true △(すべての peer を無視) ○(.npmrc をコミットすれば) 移行期間の一時しのぎ
コマンドに --legacy-peer-deps・--force だけ付ける × ×(CI で再発) 試しに入れてみるときだけ

よくある質問

Q. npm install は通ったのに、npm ci だけ ERESOLVE になります。 A. package-lock.json を作ったときに --legacy-peer-deps か --force を付けていた可能性が高いです。.npmrc に設定を書くか、overrides に切り替えます。

Q. yarn や pnpm でも同じエラーになりますか。 A. 表示は違いますが、peer dependency の食い違いは同じように警告やエラーになります。原因(Found の版と peer の範囲が合わない)と、直し方の考え方は同じです。

Q. ERESOLVE could not resolve と ERESOLVE unable to resolve dependency tree の違いは何ですか。 A. 確認環境では、自分で直接入れようとしたパッケージで食い違うと unable to resolve dependency tree、package-lock.json の中の依存関係を解決する途中で食い違うと could not resolve になりました。読み方(Found と peer の行を比べる)は同じです。

Q. node_modules と package-lock.json を消して入れ直せば直りますか。 A. peer dependency の食い違いは、package.json に書いたバージョンの組み合わせの問題なので、消しても直りません。むしろ、それまで固定されていた版が変わって、別の問題が出ることがあります。

まとめ

  • ERESOLVE は peer dependency の食い違い。Found: の版と peer ...@"範囲" を比べる
  • npm ERR!(npm 10.5 まで)と npm error(10.6 以降)は同じエラー
  • まず対応した版・後継のパッケージを探す。npm view パッケージ名 peerDependencies で確認
  • 動作を確かめたなら overrides で明示。package.json に残るのでチームで再現できる
  • --legacy-peer-deps をコマンドだけに付けると npm ci で再発。使うなら .npmrc に書く。--force は避ける

参考・出典

確認日はいずれも 2026年10月10日です。

  • npm Docs「config(legacy-peer-deps・strict-peer-deps・force)」:https://docs.npmjs.com/cli/v10/using-npm/config#legacy-peer-deps
  • npm Docs「package.json(overrides)」:https://docs.npmjs.com/cli/v10/configuring-npm/package-json#overrides

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「npm ERR! ERESOLVEの原因と直し方|peer依存の読み方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?