ESLintプラグイン
Next.jsは、ベース設定にバンドルされているESLintプラグインeslint-plugin-next
を提供しており、Next.jsアプリケーションで一般的な問題を検出することが可能です。
リファレンス
eslint-config-next
では以下のESLintプラグインから推奨されるルールセットがすべて使用されています:
これはnext.config.js
の設定よりも優先されます。
ルール
完全なルールセットは以下の通りです:
推奨設定で有効 | ルール | 説明 |
---|---|---|
@next/next/google-font-display | Google Fontsでfont-displayの動作を強制します。 | |
@next/next/google-font-preconnect | Google Fontsでpreconnect が使用されていることを確認します。 | |
@next/next/inline-script-id | インラインコンテンツを持つnext/script コンポーネントにid 属性を強制します。 | |
@next/next/next-script-for-ga | Google Analyticsのインラインスクリプトを使用する際にnext/script コンポーネントを優先します。 | |
@next/next/no-assign-module-variable | module 変数への代入を防止します。 | |
@next/next/no-async-client-component | クライアントコンポーネントがasync関数になるのを防止します。 | |
@next/next/no-before-interactive-script-outside-document | pages/_document.js の外でnext/script のbeforeInteractive 戦略を使用するのを防止します。 | |
@next/next/no-css-tags | 手動のスタイルシートタグを防止します。 | |
@next/next/no-document-import-in-page | pages/_document.js の外でnext/document をインポートするのを防止します。 | |
@next/next/no-duplicate-head | pages/_document.js で<Head> を重複して使用するのを防止します。 | |
@next/next/no-head-element | <head> 要素の使用を防止します。 | |
@next/next/no-head-import-in-document | pages/_document.js でnext/head を使用するのを防止します。 | |
@next/next/no-html-link-for-pages | Next.jsの内部ページに移動するために<a> 要素を使用するのを防止します。 | |
@next/next/no-img-element | LCPが遅く帯域幅が高くなるため<img> 要素の使用を防止します。 | |
@next/next/no-page-custom-font | ページ専用のカスタムフォントを防止します。 | |
@next/next/no-script-component-in-head | next/head コンポーネントでnext/script を使用するのを防止します。 | |
@next/next/no-styled-jsx-in-document | pages/_document.js でstyled-jsx を使用するのを防止します。 | |
@next/next/no-sync-scripts | 同期スクリプトを防止します。 | |
@next/next/no-title-in-document-head | next/document のHead コンポーネントで<title> を使用するのを防止します。 | |
@next/next/no-typos | Next.jsのデータフェッチ関数での一般的なタイポを防止します | |
@next/next/no-unwanted-polyfillio | Polyfill.ioからの重複したポリフィルを防止します。 |
開発中にコードエディタで直接警告やエラーを表示するには、適切な統合を使用することをお勧めします。
例
カスタムディレクトリとファイルのリンティング
デフォルトでは、Next.jsはpages/
、app/
、components/
、lib/
、src/
ディレクトリ内のすべてのファイルに対してESLintを実行します。ただし、next.config.js
のeslint
設定でdirs
オプションを使用して、プロダクションビルド時にリンティングするディレクトリを指定できます:
module.exports = {
eslint: {
dirs: ['pages', 'utils'], // プロダクションビルド時(next build)に'pages'と'utils'ディレクトリのみでESLintを実行
},
}
同様に、next lint
で--dir
と--file
フラグを使用して、特定のディレクトリとファイルをリンティングできます:
next lint --dir pages --dir utils --file bar.js
モノレポ内のルートディレクトリの指定
Next.jsがルートディレクトリにインストールされていないプロジェクト(モノレポなど)でeslint-plugin-next
を使用する場合、.eslintrc
のsettings
プロパティを使用してNext.jsアプリケーションの場所を指定できます:
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({
// import.meta.dirnameはNode.js v20.11.0以降で利用可能
baseDirectory: import.meta.dirname,
})
const eslintConfig = [
...compat.config({
extends: ['next'],
settings: {
next: {
rootDir: 'packages/my-app/',
},
},
}),
]
export default eslintConfig
rootDir
には、相対パスまたは絶対パス、glob(例:`"packages/*/")、またはパスやglobの配列を指定できます。
キャッシュの無効化
パフォーマンス向上のため、ESLintで処理されたファイルの情報はデフォルトでキャッシュされます。これは.next/cache
または設定したビルドディレクトリに保存されます。単一のソースファイルの内容以外に依存するESLintルールを含めており、キャッシュを無効にする必要がある場合は、next lint
で--no-cache
フラグを使用します。
next lint --no-cache
ルールの無効化
サポートされているプラグイン(react
、react-hooks
、next
)が提供するルールを変更または無効にしたい場合は、.eslintrc
のrules
プロパティを直接変更できます:
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({
// import.meta.dirnameはNode.js v20.11.0以降で利用可能
baseDirectory: import.meta.dirname,
})
const eslintConfig = [
...compat.config({
extends: ['next'],
rules: {
'react/no-unescaped-entities': 'off',
'@next/next/no-page-custom-font': 'off',
},
}),
]
export default eslintConfig
Core Web Vitalsとの統合
next/core-web-vitals
ルールセットは、next lint
を初めて実行し、strictオプションを選択した場合に有効になります。
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({
// import.meta.dirnameはNode.js v20.11.0以降で利用可能
baseDirectory: import.meta.dirname,
})
const eslintConfig = [
...compat.config({
extends: ['next/core-web-vitals'],
}),
]
export default eslintConfig
next/core-web-vitals
は、Core Web Vitalsに影響を与えるルールについて、デフォルトでは警告となるものをエラーに更新します。
next/core-web-vitals
エントリポイントは、Create Next Appで構築された新しいアプリケーションに自動的に含まれます。
TypeScriptとの統合
Next.jsのESLintルールに加えて、create-next-app --typescript
はnext/typescript
を使用してTypeScript固有のリンタールールを設定に追加します:
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({
// import.meta.dirnameはNode.js v20.11.0以降で利用可能
baseDirectory: import.meta.dirname,
})
const eslintConfig = [
...compat.config({
extends: ['next/core-web-vitals', 'next/typescript'],
}),
]
export default eslintConfig
これらのルールはplugin:@typescript-eslint/recommended
に基づいています。
詳細についてはtypescript-eslint > Configsを参照してください。
Prettierとの統合
ESLintにはコードフォーマットルールも含まれており、既存のPrettier設定と競合する可能性があります。ESLintとPrettierを連携させるために、ESLint設定にeslint-config-prettierを含めることをお勧めします。
まず、依存関係をインストールします:
npm install --save-dev eslint-config-prettier
yarn add --dev eslint-config-prettier
pnpm add --save-dev eslint-config-prettier
bun add --dev eslint-config-prettier
次に、既存のESLint設定にprettier
を追加します:
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({
// import.meta.dirnameはNode.js v20.11.0以降で利用可能
baseDirectory: import.meta.dirname,
})
const eslintConfig = [
...compat.config({
extends: ['next', 'prettier'],
}),
]
export default eslintConfig
ステージングされたファイルのリンティング
next lint
をlint-stagedと一緒に使用して、ステージングされたgitファイルに対してリンターを実行したい場合は、プロジェクトのルートにある.lintstagedrc.js
ファイルに以下を追加して、--file
フラグの使用を指定する必要があります。
const path = require('path')
const buildEslintCommand = (filenames) =>
`next lint --fix --file ${filenames
.map((f) => path.relative(process.cwd(), f))
.join(' --file ')}`
module.exports = {
'*.{js,jsx,ts,tsx}': [buildEslintCommand],
}
プロダクションビルド時のリンティングの無効化
next build
時にESLintを実行したくない場合は、next.config.js
でeslint.ignoreDuringBuilds
オプションをtrue
に設定できます:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
eslint: {
// 警告:これにより、プロジェクトにESLintエラーがあってもプロダクションビルドが正常に完了します。
ignoreDuringBuilds: true,
},
}
export default nextConfig
const nextConfig = {
eslint: {
// 警告:これにより、プロジェクトにESLintエラーがあってもプロダクションビルドが正常に完了します。
ignoreDuringBuilds: true,
},
}
export default nextConfig
既存設定の移行
アプリケーションに既にESLintが設定されている場合、いくつかの条件が満たされない限り、eslint-config-next
を含めるのではなく、このプラグインから直接拡張することをお勧めします。
推奨プラグインルールセット
以下の条件がすべて当てはまる場合:
- 以下のプラグインの1つ以上が既にインストールされている(個別または
airbnb
やreact-app
などの別の設定を通じて):react
react-hooks
jsx-a11y
import
- Next.js内でBabelが設定されている方法とは異なる特定の
parserOptions
を定義している(Babel設定をカスタマイズしていない限り推奨されません) - Node.jsやTypeScriptのリゾルバを定義した
eslint-plugin-import
がインストールされている
これらのプロパティがeslint-config-next
内でどのように設定されているかを好む場合はこれらの設定を削除するか、Next.js ESLintプラグインから直接拡張することをお勧めします:
module.exports = {
extends: [
//...
'plugin:@next/next/recommended',
],
}
このプラグインは、next lint
を実行する必要なく、通常通りプロジェクトにインストールできます:
npm install --save-dev @next/eslint-plugin-next
yarn add --dev @next/eslint-plugin-next
pnpm add --save-dev @next/eslint-plugin-next
bun add --dev @next/eslint-plugin-next
これにより、複数の設定で同じプラグインやパーサーをインポートすることによる衝突やエラーのリスクが排除されます。
追加設定
既に別のESLint設定を使用していて、eslint-config-next
を含めたい場合、他の設定の後に最後に拡張されるようにしてください。例:
import js from '@eslint/js'
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({
// import.meta.dirnameはNode.js v20.11.0以降で利用可能
baseDirectory: import.meta.dirname,
recommendedConfig: js.configs.recommended,
})
const eslintConfig = [
...compat.config({
extends: ['eslint:recommended', 'next'],
}),
]
export default eslintConfig
next
設定は既にparser
、plugins
、settings
プロパティのデフォルト値を設定する処理を含んでいます。特別なユースケースがない限り、これらのプロパティを手動で再宣言する必要はありません。
他の共有可能な設定を含める場合、これらのプロパティが上書きまたは変更されないようにする必要があります。そうでない場合は、next
設定と重複する動作をする設定を削除するか、前述のようにNext.js ESLintプラグインから直接拡張することを推奨します。