ESLint と Prettier の競合でフォーマットできない
ESLint と Prettier の整形ルールが衝突すると、保存→フォーマット→ESLint→再差分のループになる。
eslint-config-prettier で重複ルールを切り、整形は Prettier に一本化するのが定石。
#eslint#prettier#format#config#conflict
公開:
要約
ESLint と Prettier の競合は、両方が「整形」を担当しているときに発生する。
解決の原則は「整形は Prettier に一本化、ESLint は論理ルールのみ」。
公式の Integrating with Linters が推す構成は eslint-config-prettier を入れて重複ルールを無効化することだ。
よくある原因
- eslint-config-prettier 未導入: ESLint 側の
semi/quotes/indentなどの整形系ルールが残り、Prettier の出力を弾く - eslint-plugin-prettier の二重実行: ESLint 内部から Prettier を走らせると、保存ごとに差分が再計算され表示が揺れる
- エディタ設定の競合:
editor.formatOnSaveと ESLint のsource.fixAll.eslintが両方有効で順序が安定しない - 設定ファイルのドリフト:
.prettierrcとeslint.config.jsでsingleQuoteやprintWidthが食い違っている
解決策
1. eslint-config-prettier を導入
npm install --save-dev eslint-config-prettierflat config では末尾で展開する。
// eslint.config.js
import js from "@eslint/js";
import eslintConfigPrettier from "eslint-config-prettier";
export default [
js.configs.recommended,
// プロジェクト固有ルール
eslintConfigPrettier,
];これで Prettier と競合する ESLint ルールが一括 off になる。
2. eslint-plugin-prettier を外す
ESLint 経由で Prettier を走らせると、警告として表示・自動修正されるが、整形のたびに再 lint が走り体感が遅くなる。
整形は prettier --write または IDE 統合に任せる。
npm uninstall eslint-plugin-prettierCI では並列で走らせる。
npx prettier --check .
npx eslint .3. エディタの整形担当を固定
.vscode/settings.json に明示。
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
}
}保存時はまず Prettier で整形 → 続けて ESLint の autofix が走るので競合しない。
4. .prettierrc を真の正に
.prettierrc.json を一箇所に置き、ESLint 側からは semi / quotes / indent / comma-dangle などの整形ルールを削除する。
残すのは no-unused-vars / no-undef のような論理ルールのみ。
これで「どちらが正か」の議論が消える。