Next.js version 11.0.0 で ESLint を使うために公式ドキュメントを紐解く
ESLint.org
docs/rules
npm/ESLint
Next.js/ESLint
バージョン11.0.0以降、Next.jsは統合されたESLint体験をすぐに提供します。
next lintをスクリプトとしてpackage.jsonに追加します。
"scripts": {
"lint": "next lint"
}
とのことなので npx create-next-app を実行して確認してみる
すると確かにセットアップ中に eslint と eslint-config-next がインストールされている

セットアップ後のファイルを確認したところ、ドキュメントにあるとおり、 package.json に next lint の scripts がある

eslintrc (拡張子はない) に "next": "eslint" も含まれている
(今回の設定で eslintrc に自動的に含まれる next/core-web-vitals の説明は後述します)

npm か yarn で以下のコマンドをターミナルに入力すると next lint scripts を実行可能
yarn lint
npm run lint
まだESLintがアプリケーションに設定されていない場合は必要なパッケージのインストールを案内します。
yarn lint
# 以下のような説明があります:
#
# Please install eslint and eslint-config-next by running:
# (eslint と eslint-config-next をインストールしてください)
# yarn add --dev eslint eslint-config-next
#
# ...
ESLint の設定ファイルが存在しない場合、 Next.js はプロジェクトのルートに
.eslintrcファイルを自動的に作成します。
{
"extends": "next"
}
ESLint を実行してエラーを検出するたびに next lint を実行することができるようになりました。
デフォルトの基本設定("extends": "next")はいつでもアップデート可能で、ESLint設定がない場合にのみ含まれます。
開発中にコードエディタで直接警告やエラーを表示するには、適切な統合機能を使用することをお勧めします。
Linting During Builds
build 時の linting
ESLintが設定されると、 build の度に自動的に実行されます。
エラーの場合はビルドに失敗しますが、警告の場合は失敗しません。
build の際、ESLintを実行させたくない場合は、 Ignoring ESLint のドキュメントを参照してください。
Linting Custom Directories
ESLint が有効になるディレクトリを任意で設定することもできるようです
デフォルトでは、 Next.js は
pagescomponentslibディレクトリ内のすべてのファイルに対して ESLint を実行します。
ただし、プロダクションビルドでは next.config.js の eslint 設定で
dirsオプションを使ってどのディレクトリで実行するかを指定できます。
module.exports = {
eslint: {
dirs: ['pages', 'utils'],
// 'pages' と 'utils' でのみ ESLint を実行する
},
}
yarn lint時に --dir を使用し、同様の設定が可能
yarn lint --dir pages --dir utils
ESLint Plugin
Next.jsにはESLintプラグインである
eslint-plugin-nextが用意されており、Next.jsアプリケーションの一般的な問題や課題を簡単に捉えることができます。ルールの全容
Base Configuration
Next.jsベースのESLint設定は、next lintの初回実行時に自動的に生成されます。
{
"extends": "next"
}
この設定は、以下のESLintプラグインの推奨ルールセットを拡張するものです。
eslint-plugin-react
eslint-plugin-react-hooks
eslint-plugin-next
シェアできる設定の詳細は
eslint-config-nextパッケージに記載されています。
Disabling Rules
ルールの無効化
サポートされているプラグイン
reactreact-hooksnextが提供するルールを変更したり無効にしたりしたい場合は、.eslintrcのrulesプロパティを使って直接変更することができます。
例)
{
"extends": "next",
"rules": {
"react/no-unescaped-entities": "off",
"@next/next/no-page-custom-font": "off",
}
}
{
"extends": ["eslint:recommended", "next"]
}
nextの設定では、parserpluginsの各プロパティのデフォルト値の設定がすでに行われています。
ユースケースに応じて異なる構成が必要な場合を除き、これらのプロパティを手動で再宣言する必要はありません。
他の共有可能な構成を含める場合は、これらのプロパティが上書きされたり変更されたりしないように注意する必要があります。
Core Web Vitals
より厳しい next/core-web-vitals ルールセットを .eslintrc で追加することもできます。
{
"extends": ["next", "next/core-web-vitals"]
}
next/core-web-vitalsは、eslint-plugin-nextを更新して、 Core Web Vitals に影響を与える場合にデフォルトで警告となるいくつかのルールをエラーにしました。
Create Next App で構築された新しいアプリケーションには、
nextおよびnext/core-web-vitalsの両方のエントリーポイントが自動的に含まれます。
Usage with Prettier
Prettier との併用
ESLint にはコードフォーマットのルールが含まれており、既存の Prettier のセットアップと衝突する可能性があります。
ESLint と Prettier を連動させるために、 ESLint の設定に eslint-config-prettier を含めることをお勧めします。
{
"extends": ["next", "prettier"]
}
Migrating Existing Config
既存設定の移行
すでにアプリケーションに ESLint が設定されている場合は、共有可能な設定ではなく、 Next.js の ESLint プラグインから直接拡張することをお勧めします。
module.exports = {
extends: [
//...
'plugin:@next/next/recommended',
],
}
これにより、同じプラグインやパーサーを複数の設定でインポートすることによる衝突のリスクを排除することができます。
公式ドキュメントは以上です
個人的な結論
これから新規プロジェクトを作る場合はデフォルトで設定される以下の内容で問題無いと判断
ファイルに拡張子が無いが、 Next.js の仕様であり問題ないと判断
{
"extends": ["next", "next/core-web-vitals"]
}
既存の Next.js プロジェクトへの ESLint ルールの適用については、ドキュメント通り以下の設定を追記するのがベストプラクティスと判断
module.exports = {
...//
extends: [
//...
'plugin:@next/next/recommended',
],
}
Discussion