できない.dev

ESLint で eslint-plugin が読み込めないエラーが解消できない

Cannot find module 'eslint-plugin-xxx' の原因は、依存インストール漏れ・パッケージ名の綴り違い・flat config と従来形式の混在のいずれか。
flat config では import してオブジェクトとして渡す。

公開: 更新:

実行例あり(2026-08-02 に実環境で検証)

要約

Cannot find module 'eslint-plugin-xxx'」が出るときは 依存インストール・命名・flat config 記法 の 3 点でほぼ片付く。
ESLint v9 以降は flat config が既定で、文字列指定をやめてオブジェクトを直接 import する形に変わったことに注意する。

よくある原因

  1. インストール漏れ: package.json に書いてあっても npm install が走っていない、または別ワークスペースに入っている
  2. タイプミス: eslint-plugin-importeslint-plugins-import と書く、スコープ付き(@typescript-eslint/eslint-plugin)の書き間違い
  3. flat config 記法違い: 旧 .eslintrc.json"plugins": ["foo"] を新 eslint.config.js にそのまま持ち込む
  4. monorepo: pnpm の strict hoist や Yarn workspace の resolve 設定でルートから見えない
  5. バージョン不一致: 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-import

hoist や workspace 設定で resolve できないなら、ルートにも明示的に dev dep として追加すると解決することが多い。

実行例

実際に上記の手順を node:20 環境で動かすと、eslint-plugin-example を未インストールのまま flat config で文字列 import しようとした時点で Cannot find package 'eslint-plugin-example' が発生し(ESLint 終了コード 2)、プラグインをオブジェクトとして直接渡す形に書き直すことで終了コード 0 に変わることが確認できる。

v9.39.5
$ npx eslint app.js
Oops! Something went wrong! :(
 
ESLint: 9.39.5
 
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'eslint-plugin-example' imported from /tmp/tmp.KCpT4YldNE/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
$ npx eslint app.js
eslint 終了コード: 0(0 なら設定が読み込めている)

— 2026-08-02 時点の出力

検証環境

検証日
実行環境
node:20

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

この記事は役立ちましたか?