Featured image of post ESLint Flat Config:従来の.eslintrcからの移行ガイド

ESLint Flat Config:従来の.eslintrcからの移行ガイド

.eslintrcからESLint Flat Config(eslint.config.js)への移行を完全ガイド。新しい形式、プラグイン互換性、TypeScript統合、Prettier連携、パフォーマンス向上まで網羅。

ESLint v9.0(2024年リリース)は、Flat Configシステム(eslint.config.js)をデフォルトとし、10年以上使われてきた従来の.eslintrc形式を置き換えました。この移行ガイドでは、移行プロセス全体、新しい概念、実践的な例を解説します。

Flat Configが必要な理由

従来の.eslintrcシステムには、設定のカスケードによる予測不能な動作、ディレクトリベースの解決の複雑さ、JSON/YAMLの制限(関数やコメントの非対応)、共有設定の合成困難さなどの問題がありました。Flat Configは単一設定ファイル、JavaScript配列による明示的な合成、簡略化されたプラグイン解決、JavaScriptネイティブの構文でこれらを解決します。

Flat Configの形式

新しい形式はeslint.config.jsから設定オブジェクトの配列をエクスポートします:

import js from "@eslint/js";
import typescript from "typescript-eslint";

export default [
  js.configs.recommended,
  ...typescript.configs.recommended,
  {
    files: ["src/**/*.ts"],
    rules: {
      "@typescript-eslint/no-unused-vars": "error",
    },
  },
  {
    ignores: ["dist/**", "node_modules/**"],
  },
];

各設定オブジェクトはfiles(適用対象)、ignores(除外対象)、rulespluginslanguageOptionslinterOptionsを指定できます。


移行手順

従来の.eslintrcからFlat Configへの変換パターン:

従来の概念Flat Configでの対応
parserlanguageOptions.parser
parserOptionslanguageOptions.parserOptions
envlanguageOptions.globals
extends設定配列の合成
plugins(文字列)インポートされたプラグインオブジェクト
overridesfilesを持つ複数設定オブジェクト
.eslintignore設定内のignores
// 移行前: .eslintrc.json
// { "env": { "browser": true }, "extends": ["eslint:recommended"] }

// 移行後: eslint.config.js
import globals from "globals";
import js from "@eslint/js";

export default [
  js.configs.recommended,
  {
    languageOptions: { globals: globals.browser },
  },
];

TypeScript統合

typescript-eslint v7+はFlat Configを完全サポートしています:

import tseslint from "typescript-eslint";

export default tseslint.config({
  files: ["src/**/*.ts"],
  languageOptions: {
    parserOptions: { project: true },
  },
  rules: {
    "@typescript-eslint/no-floating-promises": "error",
  },
});

tseslint.config()ヘルパーは型チェック付きの設定オブジェクトを提供し、TypeScript認識リンティングの設定を簡素化します。


プラグイン互換性

Flat Configではプラグインを文字列ではなく、オブジェクトとしてインポートします:

import react from "eslint-plugin-react";

export default [
  {
    files: ["src/**/*.jsx"],
    plugins: { react },
    rules: {
      "react/jsx-uses-react": "error",
    },
  },
];

Flat Config未対応のレガシープラグインには@eslint/compatfixupPluginRulesラッパーを使用します。FlatCompatユーティリティは段階的な移行中にレガシーextendsチェーンを橋渡しします。

パフォーマンス向上

Flat Configは、レガシーのO(n)カスケード方式に対してO(1)の設定解決を実現します。大規模なモノレポではリンティング時間が大幅に短縮されます。ESLint v9のキャッシュ改善により、CIパイプラインでのリント時間もさらに削減されます。


CI設定

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci
      - run: npx eslint src/ --cache

よくある落とし穴

@eslint/jsプリセットの欠如(eslint:recommendedを提供)、envの置き換え方法の混乱(globalsパッケージを使用)、全ファイルに適用される空の設定オブジェクトに注意。トラブルシューティング時は--debugフラグを使用:npx eslint --debug src/

まとめ

Flat Configへの移行はESLintの設定を簡素化し、パフォーマンスを向上させ、より保守しやすい設定形式を提供します。初期の移行作業は、明確な設定合成、高速なリンティング、より良いツール連携という形で投資対効果をもたらします。まずは単一プロジェクトから始め、出力がレガシー設定と一致することを検証した上で、コードベース全体に展開しましょう。