reference
ESLint 10 flat config の実務設定
ESLint 10 で flat config が事実上必須になった後、TypeScript / Vue / Nuxt プロジェクトで機能する最小設定とハマりどころを整理する。
#eslint #typescript #flat-config
AI 要約
Claude Haiku 4.5 で記事を 150 文字程度に要約します。
live AI 要約は公開デモのコスト保護のため、アクセスキー入力後に実行できます。 記事本文、検索、タグ、記事詳細はアクセスキーなしで確認できます。
ESLint 10 では .eslintrc.* のレガシー設定が削除され、eslint.config.js(flat config)のみが使えるようになりました。移行は一度やれば難しくありませんが、プラグインが flat config に対応しているかで負荷が変わります。
最小構成(TypeScript + Prettier)
// eslint.config.js
import js from '@eslint/js';
import tseslint from 'typescript-eslint';
import prettierConfig from 'eslint-config-prettier';
export default tseslint.config(
{
ignores: ['node_modules/**', 'dist/**', 'build/**', '.next/**', '.nuxt/**'],
},
js.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
{
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
rules: {
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'@typescript-eslint/no-explicit-any': 'error',
eqeqeq: ['error', 'always'],
},
},
prettierConfig, // 最後に置いてフォーマット系ルールを無効化
);
ポイントは 3 つ:
ignoresはトップレベルのオブジェクトで書く(.eslintignoreは廃止)。typescript-eslintのprojectService: trueで、tsconfig.jsonの自動検出が有効になります。従来のproject: trueより高速で、モノレポでもマッピングが不要です。eslint-config-prettierは最後に読み込む。順番を間違えると Prettier と衝突する装飾ルールが残ります。
Nuxt プロジェクトでは @nuxt/eslint
Nuxt 4 では @nuxt/eslint モジュールが推奨です。modules: ['@nuxt/eslint'] を追加すると、.nuxt/eslint.config.mjs が自動生成され、そこに Nuxt 固有のルール(自動インポート対応など)が含まれます。
import withNuxt from './.nuxt/eslint.config.mjs';
import prettierConfig from 'eslint-config-prettier';
export default withNuxt(
{
rules: {
'@typescript-eslint/no-explicit-any': 'error',
},
},
prettierConfig,
);
nuxt prepare を一度走らせないと .nuxt/eslint.config.mjs が生成されないため、初回 clone 時は npm install の postinstall 内で nuxt prepare が動いている前提になります。
ハマりどころ
- Vue ファイルのパース: Vue 3 の SFC は
vue-eslint-parserが必要です。typescript-eslintの設定だけだと.vue内の<script lang="ts">が解析できません。@nuxt/eslintは内部で面倒を見てくれますが、Nuxt 以外の Vue プロジェクトでは明示設定が必要です。 - プラグインの flat config 対応: コミュニティプラグインの一部はまだ legacy config しかサポートしていません。その場合は
@eslint/compatのfixupPluginRulesでラップして読み込みます。 projectServiceのコスト: 型情報を使うルール(no-unsafe-assignmentなど)はファイル数に比例して重くなります。モノレポで IDE が重いときは、型情報を使わないrecommendedセットに落とすことも検討します。
最低限の設定は 20 行程度で済むので、レガシー .eslintrc から移行するハードルはそれほど高くありません。むしろ、plugin 一個ずつ挙動を確認しながら整えるほうが結果的に早く終わります。