Error [the default configuration file is now eslint.config.js]

ESLint couldn't find an eslint.config.js file の直し方(ESLint 9 で .eslintrc が既定で読まれなくなった)

FIX SUMMARY verified
Applies when
node:22.23.1-alpineESLint 9.0.0 (flat config default; .eslintrc no longer read by default)running eslint 9 with only a .eslintrc.* file (no eslint.config.js), typically after a clean install pulls ESLint 9

Verified: reproduced in node:22.23.1-alpine, then the the default configuration file is now eslint.config.js signature was gone after the fix (exit 0).

これまで動いていた .eslintrc.json.eslintrc.js / .eslintrc.yml も同じ)のまま eslint を実行すると、lint が始まる前に次のエラーで止まることがあります。

Oops! Something went wrong! :(

ESLint: 9.37.0

ESLint couldn't find an eslint.config.(js|mjs|cjs) file.

From ESLint v9.0.0, the default configuration file is now eslint.config.js.
If you are using a .eslintrc.* file, please follow the migration guide
to update your configuration file to the new format:

https://eslint.org/docs/latest/use/configure/migration-guide

終了コードは 2 です。原因は、ESLint 9.0.0 で設定ファイルの既定が flat config(eslint.config.js)に変わり、.eslintrc.* が既定では読まれなくなったことです。.eslintrc.json を置いていても、ESLint 9 はそれを探しに行かず、eslint.config.js が無いと設定探索の段階で止まります。

本筋の直し方は、設定を flat config へ移すことです。ESLint 公式の変換ツールがあります。

npx @eslint/migrate-config .eslintrc.json

ESLint 9 系を使っている間なら、環境変数で旧 .eslintrc を読ませる延命策もあります(ESLint 10 では使えません。後述)。

ESLINT_USE_FLAT_CONFIG=false npx eslint app.js

なぜ起きるのか:設定形式の既定が変わり、探すファイルが変わった

ESLint には設定ファイルが2系統あります。従来の .eslintrc.*(eslintrc 形式)と、eslint.config.js(flat config 形式)です。flat config は ESLint 8 の途中から使えましたが、既定は eslintrc のままでした。ESLint 9.0.0 で既定が入れ替わり、flat config が既定・eslintrc は既定では読まれない状態になりました。

ESLint 9 は起動すると eslint.config.js.mjs / .cjs)を探します。見つからないと、.eslintrc.json があってもそれは使わず、設定が無いと判断してエラーで停止します。この停止は lint を1件も実行する前に起きるので、エラーには自分のコードの警告は出ず、「設定ファイルが見つからない」という趣旨だけが出ます。eslintrc は ESLint 9 では既定オフになっただけで、まだ環境変数で読み込めます。ESLint 10.0.0(2026年リリース)で eslintrc のサポートは削除されました。同じエラーは ESLint 10 でも出ますが、10 では下記の延命策(環境変数)も効かないため、flat config への移行だけが道になります。

なぜ ESLint 9 で出るのか

境界は ESLint のメジャーバージョンで、Node の版でもプロジェクトのコードでもありません。ESLint 8 までは .eslintrc.json をそのまま読みます。9 に上がった後だけ、同じ設定で設定探索に失敗します。

  • npm install で ESLint が 9 系に上がったpackage.jsoneslint を緩く指定している("latest"、あるいは範囲が 9 系を含む)と、クリーンインストールで 9 系が入ります。ローカルの node_modules に 8 系が残っている環境では動き、CI やコンテナのクリーンインストールでだけ 9 系が入って落ちます
  • npm install eslint@latest や依存プリセットの更新で上げた:共有設定(eslint-config-*)を上げた拍子に、ピア依存の ESLint も 9 系へ動くことがあります。

まず npx eslint --version で版を確認します。9 系でも 10 系でも、.eslintrc だけを置いているとこのエラーになります。ただし後述の延命策(環境変数)が効くのは 9 系だけで、10 系は移行するしかありません。

直し方1:設定を flat config へ移す

.eslintrc.json の内容を eslint.config.js.mjs)へ書き写します。手で書き換えることもできますが、ESLint 公式の変換ツールが既存の eslintrc を読んで flat config を生成します。

npx @eslint/migrate-config .eslintrc.json

これで eslint.config.mjs が作られます。変換された設定は、eslint:recommended などを flat config 用のパッケージ(@eslint/js)経由で読み込む形になるため、ツールが案内する依存を開発依存として入れます。

npm install --save-dev globals @eslint/js @eslint/eslintrc

このあと npx eslint . を実行すると、移した設定で lint が動きます。変換ツールは、環境(env)と sourceType の食い違いなど、eslintrc と flat config で意味が変わる箇所をメッセージで知らせるので、その指摘は目を通して直します。移し終えたら、.eslintrc.json は削除できます(flat config があれば ESLint 9 はそちらを優先しますが、混乱を避けるため残さないほうがよい)。

直し方2:ESLINT_USE_FLAT_CONFIG=false で当座しのぐ(ESLint 9 系のみ)

設定の移行がすぐに終わらない場合は、ESLint 9 系に限り、環境変数 ESLINT_USE_FLAT_CONFIG=false を付けると、ESLint は旧 eslintrc システムに戻って .eslintrc.json を読みます

ESLINT_USE_FLAT_CONFIG=false npx eslint app.js

このとき、eslintrc が非推奨であることと、サポートが v10.0.0 で削除される旨の警告(ESLintRCWarning)が出ます。動きますが、恒久策ではありません。eslintrc の書き方に必要な設定(parserOptions など)が揃っていないと、今度は eslintrc 側の解析エラーに変わることもあります。この環境変数は移行を終えるまでの猶予として使い、.eslintrc に依存し続ける前提にはしません。

ESLint 10 ではこの環境変数は無効です。 ESLint 10.0.0 で eslintrc サポートと ESLINT_USE_FLAT_CONFIG そのものが削除されたため、ESLINT_USE_FLAT_CONFIG=false を付けても .eslintrc は読まれず、同じ「設定ファイルが見つからない」エラーのままです(実測)。10 系では直し方1(flat config への移行)だけが道です。npm install eslint@latest で 10 系が入るので、延命策を当てにして版を上げると、この環境変数ごと消えます。

空の eslint.config.js を置いただけでは、ルールが消える

エラーを消すだけなら、最小の eslint.config.js を1つ置けば設定探索は通ります。ただし空に近い flat config は、あなたのルールを1つも適用しません

// これでエラーは消えるが、ルールが空なので lint は何も検出しない
module.exports = [];

これは「設定ファイルが見つからない」エラーを解消するだけで、.eslintrc.json に書いていた extends やルールは引き継がれません。lint が緑になったのは、チェックする項目が無くなったからです。ルールを残すなら、直し方1の変換で eslintrc の内容を flat config へ移します。

切り分け(うまくいかないとき)

  • eslint.config.js を足したのに、今度は lint エラーが大量に出る/逆に何も出ない:flat config は eslintrc とルールの既定が違います。何も出ないなら設定が空に近く、大量に出るなら eslint:recommended などの継承先が変わっています。変換ツールの出力を基点に、.eslintrc.jsonextendsrules が移っているか確認します。
  • ESLINT_USE_FLAT_CONFIG=false を付けても何も変わらない(同じエラーのまま):ESLint 10 では eslintrc サポートと ESLINT_USE_FLAT_CONFIG が削除されているため、この環境変数は無視されます。npx eslint --version で 10 系なら、flat config へ移行するしかありません。9 系で付けたのに別の解析エラーになった場合は、旧 eslintrc の parserOptionsecmaVersionsourceType)が不足しています。eslintrc 側にこれらを補うか、flat config への移行に切り替えます。
  • eslint.config.js が読み込みでエラーになる(module is not defined など)package.json"type": "module" があると .js は ESM として読まれます。その場合は module.exports ではなく export default を使うか、ファイル名を eslint.config.cjs にします。
  • エディタ(VS Code など)の ESLint 拡張だけがまだ古い設定で動く/エラーになる:拡張が使う ESLint の版と、プロジェクトの node_modules の版がずれていることがあります。プロジェクトローカルの ESLint を使う設定にして、版を突き合わせます。
  • 手元では通るのに CI でだけ落ちる:ESLint の版が違います。CI のログで実際に入った eslint の版を確認します。9 系・10 系のどちらでも .eslintrc だけなら本記事の既定変更に当たります(10 系では延命策も使えません)。

検証環境

  • node:22.23.1-alpine、ネットワーク有り、[email protected]
  • 再現:.eslintrc.json だけを置いて npx eslint app.js を実行すると、ESLint couldn't find an eslint.config.(js|mjs|cjs) file.From ESLint v9.0.0, the default configuration file is now eslint.config.js. を出して終了コード 2
  • 修正:最小の eslint.config.js(flat config)を1つ足すと、.eslintrc.json を残したまま npx eslint app.js が終了コード 0・シグネチャ消滅

再現から修正までは errfix の検証ハーネスが機械的に確認しています。境界が ESLint の版であることは、同じ .eslintrc.json を ESLint 8 系は読む一方、9.37.0 は既定で読まないことを実測して裏づけました。直し方1の変換ツール(npx @eslint/migrate-config .eslintrc.jsoneslint.config.mjs を生成し、案内された依存を入れると npx eslint が終了コード 0 になる)と、直し方2の環境変数(ESLint 9 系では ESLINT_USE_FLAT_CONFIG=false で eslintrc を読み、ESLintRCWarning に「サポートは v10.0.0 で削除」と出る)も、それぞれ同じイメージで実行して確認しました。ESLint 10 系(10.7.0)では、.eslintrc だけだと同じ「設定ファイルが見つからない」エラーが出て終了コード 2 になり、ESLINT_USE_FLAT_CONFIG=false を付けても無視される(eslintrc も環境変数も削除済み)ことも実測しました。 各コマンド・版・終了コードはケースの verification/probes.txt に記録しています。

検証(machine-verified)

この修正は node:22.23.1-alpine のバージョン固定コンテナ内で再現し、修正後に the default configuration file is now eslint.config.js のシグネチャが消えることを機械で確認しています。

verify — run-case.mjs
$ node run-case.mjs node/eslint9-flat-config-required
● reproduce the default configuration file is now eslint.config.js present ✓
● apply fix exit 0
● re-run the default configuration file is now eslint.config.js gone ✓
PASS verified · node:22.23.1-alpine · signature gone

確認したのは上のイメージの中だけです。別の環境で直らなかった、記述が違う、という場合は 報告してください(対象と検証イメージは件名・本文に入ります)。