これまで動いていた .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.jsonがeslintを緩く指定している("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.jsonのextends・rulesが移っているか確認します。ESLINT_USE_FLAT_CONFIG=falseを付けても何も変わらない(同じエラーのまま):ESLint 10 では eslintrc サポートとESLINT_USE_FLAT_CONFIGが削除されているため、この環境変数は無視されます。npx eslint --versionで 10 系なら、flat config へ移行するしかありません。9 系で付けたのに別の解析エラーになった場合は、旧 eslintrc のparserOptions(ecmaVersion・sourceType)が不足しています。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.json が eslint.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 に記録しています。