😋

Next.js を快適に開発するための ESLint と Prettier

2023/03/21に公開

Next.js を TypeScript で開発する際に ESLintPrettier を設定する方法を紹介します。
Vercel が掲げる "Zero Config" のコンセプトを踏襲して、シンプルで効果的な設定を紹介します。

これらの設定は少し繊細な部分があって、正しく設定されていないと開発体験が悪くなることもあります。実際に私たちのチームでもこれらの設定が複雑化・陳腐化してしまい正しく動作しないことがありました。開発環境を改善するため、ESLint とその周辺ライブラリ・プラグインの設定を見直すことにしました。

これらのライブラリやプラグインは歴史が長く、その設定方法を何度も変えてきた経緯があり、同時にベストプラクティスも変化してきた経緯があります。しかし、Next11 以降は next lint によって ESLint の設定は簡略化(隠蔽)しているので、以前のような複雑な設定はいらなくなりました。

設定方法

Setup Next.js

Next.js は create-next-app を使うことでインタラクティブに環境構築できます。オフィシャルにメンテナンスされているので安心です。

npx create-next-app@latest --ts --eslint

Configure ESLint

TypeScript に最適化された ESLint のルールとコードスタイリングツールである Prettier をインストールします。

npm install --save-dev @typescript-eslint/eslint-plugin eslint-config-prettier prettier

.eslintrc.json を以下のように書き換えます。extends の順序に注意してこれらのプラグインを追記します。

{
  "extends": [
+   "plugin:@typescript-eslint/recommended",
    "next/core-web-vitals"
+   "prettier"
  ]
}

あとは IDE があなたの好ましいタイミングで next lintprettier コマンドを実行するように設定してください。

ここから先は上記の各々の設定が何を意味しているのかもう少し詳しく解説します。設定をアレンジしたくなった場合は参考にしてください。

Next.js with ESLint

create-next-appeslint-config-next パッケージをインストールします。eslint-config-next は Next.js に最適化された ESLint の設定を代行するパッケージです。eslint-plugin-next を含む様々な ESLint プラグインを設定してくれます。.eslintrc.js で指定されている next/core-web-vitalseslint-plugin-next プラグインで定義されています。

なお、eslint の設定を自分でアレンジする場合は、eslint-config-next と干渉しないように気を付ける必要があります。

ESLint with TypeScript

next/core-web-vitals には TypeScript に関するルールが含まれません。
そこで @typescript-eslint/eslint-plugin を追加しました。
https://typescript-eslint.io/

{
  "extends": [
+   "plugin:@typescript-eslint/recommended",
    "next/core-web-vitals"
  ],
}

プラグインの設定順序などは Next.js のドキュメントを参考にしてください。
https://nextjs.org/docs/basic-features/eslint#additional-configurations

なお、@typescript-eslint/parsereslint-config-next で設定されます。
https://github.com/vercel/next.js/blob/canary/packages/eslint-config-next/index.js#L96

ESLint with Prettier

ESLint はコード整形ツールとして利用することもできます。つまり、ESLint に設定できるコーディング規約にはコードスタイルに関するものも多く含まれます。もし ESLint と Prettier の設定に矛盾がある状態で両者を同時に使用すると、ESLint と Prettier はお互いの修正を修正しあう競合状態になり開発体験が悪くなります。

ESLint と Prettier を同時に使用する場合は、両者の責務を分離する必要があります。具体的には、ESLint に eslint-config-prettier プラグインを設定することで、ESLint のコードスタイルに関するルールを無効化しています。これにより、コード品質の担保は ESLint が、コードの整形は Prettier がそれぞれ専任して担当するようになります。

{
  "extends": [
    "plugin:@typescript-eslint/recommended",
    "next/core-web-vitals"
+   "prettier"
  ]
}

プラグインの設定順序はドキュメントを参考にしてください。
https://nextjs.org/docs/basic-features/eslint#prettier

Discussion