ESLint で eslint-plugin が読み込めないエラーが解消できない
`Cannot find module 'eslint-plugin-xxx'` の原因は、依存インストール漏れ・パッケージ名の綴り違い・flat config と従来形式の混在のいずれか。
flat config では import してオブジェクトとして渡す。
公開:
要約
「Cannot find module 'eslint-plugin-xxx'」が出るときは 依存インストール・命名・flat config 記法 の 3 点でほぼ片付く。
ESLint v9 以降は flat config が既定で、文字列指定をやめてオブジェクトを直接 import する形に変わったことに注意する。
よくある原因
- インストール漏れ:
package.jsonに書いてあってもnpm installが走っていない、または別ワークスペースに入っている - タイプミス:
eslint-plugin-importをeslint-plugins-importと書く、スコープ付き(@typescript-eslint/eslint-plugin)の書き間違い - flat config 記法違い: 旧
.eslintrc.jsonの"plugins": ["foo"]を新eslint.config.jsにそのまま持ち込む - monorepo: pnpm の strict hoist や Yarn workspace の resolve 設定でルートから見えない
- バージョン不一致: ESLint v9 と非対応プラグインの組み合わせ
解決策
1. インストールを確認する
npm install -D eslint-plugin-import
npm ls eslint-plugin-import # 実際に解決されているか確認npm ls が (empty) を返す場合、別ワークスペースに入っているか、node_modules 破損の可能性が高い。
2. flat config で書き直す
公式のプラグイン設定ドキュメント(新しいタブで開く) のとおり、import してオブジェクトとして登録する。
import importPlugin from "eslint-plugin-import";
export default [
{
plugins: {
import: importPlugin,
},
rules: {
"import/no-unresolved": "error",
},
},
];旧形式 (.eslintrc.json) からの移行は 公式の設定ファイル解説(新しいタブで開く) を参照する。
3. monorepo 構成での確認
pnpm why eslint-plugin-importhoist や workspace 設定で resolve できないなら、ルートにも明示的に dev dep として追加すると解決することが多い。
実行例
実際に上記の手順を node:20 環境で動かすと、eslint-plugin-example を未インストールのまま flat config で文字列 import しようとした時点で Cannot find package 'eslint-plugin-example' が発生し(ESLint 終了コード 2)、プラグインをオブジェクトとして直接渡す形に書き直すことで終了コード 0 に変わることが確認できる。
== versions ==
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
v20.20.2
Python 3.11.2
git version 2.39.5
This is not the tsc command you are looking for
To get access to the TypeScript compiler, tsc, from the command line either:
- Use npm install typescript to first add TypeScript to your project before using npx
- Use yarn to avoid accidentally running code from un-installed packages
v10.5.0
== run ==
--- ESLint を install(プラグインは入れない)---
v9.39.4
--- 未インストールのプラグインを import する flat config ---
--- npx eslint app.js (Cannot find package eslint-plugin-example を想定)---
Oops! Something went wrong! :(
ESLint: 9.39.4
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'eslint-plugin-example' imported from /tmp/tmp.HO5y8uYJlT/eslint.config.mjs
at packageResolve (node:internal/modules/esm/resolve:873:9)
at moduleResolve (node:internal/modules/esm/resolve:946:18)
at defaultResolve (node:internal/modules/esm/resolve:1188:11)
at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:708:12)
at #cachedDefaultResolve (node:internal/modules/esm/loader:657:25)
at ModuleLoader.resolve (node:internal/modules/esm/loader:640:38)
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:264:38)
at ModuleJob._link (node:internal/modules/esm/module_job:168:49)
eslint 終了コード: 2
--- 解消: プラグインをオブジェクトとして直接渡す(import 不要)---
eslint 終了コード: 0(0 なら設定が読み込めている)— 2026-06-26 時点の出力