コンテンツにスキップ

ESLint

Next.jsは、ESLintと統合されたエクスペリエンスをすぐに利用できます。`package.json` に `next lint` をスクリプトとして追加してください。

package.json
{
  "scripts": {
    "lint": "next lint"
  }
}

その後、`npm run lint` または `yarn lint` を実行してください。

ターミナル
yarn lint

アプリケーションにESLintがまだ設定されていない場合は、インストールと設定プロセスが案内されます。

ターミナル
yarn lint

次のようなプロンプトが表示されます。

? ESLintをどのように設定しますか?

❯ 厳格(推奨)
基本
キャンセル

次の3つのオプションのいずれかを選択できます。

  • **厳格**: Next.jsの基本ESLint設定と、より厳格なCore Web Vitalsルールセットが含まれています。ESLintを初めて設定する開発者には、この設定をお勧めします。

    .eslintrc.json
    {
      "extends": "next/core-web-vitals"
    }
  • **基本**: Next.jsの基本ESLint設定が含まれています。

    .eslintrc.json
    {
      "extends": "next"
    }
  • **キャンセル**: ESLint設定は含まれません。独自のカスタムESLint設定を行う場合にのみ、このオプションを選択してください。

2つの設定オプションのいずれかを選択すると、Next.jsは自動的にアプリケーションに`eslint`と`eslint-config-next`を依存関係としてインストールし、選択した設定を含む`.eslintrc.json`ファイルをプロジェクトのルートに作成します。

これで、ESLintを実行してエラーを検出したい場合はいつでも`next lint`を実行できます。ESLintが設定されると、ビルド(`next build`)ごとにも自動的に実行されます。エラーはビルドを失敗させますが、警告は失敗させません。

`next build`中にESLintを実行したくない場合は、ESLintの無視に関するドキュメントを参照してください。

開発中は、適切な統合を使用して、コードエディターで直接警告とエラーを表示することをお勧めします。

ESLint設定

デフォルト設定(`eslint-config-next`)には、Next.jsで最適なすぐに使えるリンティングエクスペリエンスを実現するために必要なすべてが含まれています。アプリケーションにESLintがまだ設定されていない場合は、`next lint`を使用してESLintをこの設定と共に設定することをお勧めします。

`eslint-config-next`を他のESLint設定と共に使用したい場合は、追加設定セクションを参照して、競合を起こさずに設定する方法を学習してください。

次のESLintプラグインの推奨ルールセットはすべて、`eslint-config-next`内で使用されます。

これは、 `next.config.js` の設定よりも優先されます。

ESLint プラグイン

Next.js は、基本設定に既にバンドルされている ESLint プラグイン eslint-plugin-next を提供しており、Next.js アプリケーションでよくある問題やエラーを検出することができます。 ルールの完全なセットは以下のとおりです。

推奨設定で有効化されています

ルール説明
@next/next/google-font-displayGoogle Fonts での font-display の挙動を強制します。
@next/next/google-font-preconnectGoogle Fonts で preconnect が使用されていることを確認します。
@next/next/inline-script-idインラインコンテンツを持つ next/script コンポーネントに id 属性を強制します。
@next/next/next-script-for-gaGoogle Analytics のインラインスクリプトを使用する場合は、next/script コンポーネントを優先します。
@next/next/no-assign-module-variablemodule 変数への代入を禁止します。
@next/next/no-async-client-componentクライアントコンポーネントが非同期関数になるのを防ぎます。
@next/next/no-before-interactive-script-outside-documentpages/_document.js の外部で next/scriptbeforeInteractive 戦略を使用することを禁止します。
@next/next/no-css-tags手動でのスタイルシートタグの使用を禁止します。
@next/next/no-document-import-in-pagepages/_document.js の外部で next/document をインポートすることを禁止します。
@next/next/no-duplicate-headpages/_document.js<Head> を重複して使用することを禁止します。
@next/next/no-head-element<head> 要素の使用を禁止します。
@next/next/no-head-import-in-documentpages/_document.jsnext/head を使用することを禁止します。
@next/next/no-html-link-for-pages内部の Next.js ページに移動するために <a> 要素を使用することを禁止します。
@next/next/no-img-elementLCP の低下と帯域幅の増加を防ぐため、<img> 要素の使用を禁止します。
@next/next/no-page-custom-fontページごとのカスタムフォントを禁止します。
@next/next/no-script-component-in-headnext/head コンポーネントで next/script を使用することを禁止します。
@next/next/no-styled-jsx-in-documentpages/_document.jsstyled-jsx を使用することを禁止します。
@next/next/no-sync-scripts同期スクリプトを禁止します。
@next/next/no-title-in-document-headnext/document からの Head コンポーネントで <title> を使用することを禁止します。
@next/next/no-typosNext.js のデータフェッチ関数でよくあるタイプミスを防止します。
@next/next/no-unwanted-polyfillioPolyfill.io からの重複するポリフィルを防止します。

アプリケーションで既に ESLint が設定されている場合は、いくつかの条件が満たされない限り、`eslint-config-next` を含めるのではなく、このプラグインを直接拡張することをお勧めします。 詳細については、推奨プラグインルールセット を参照してください。

カスタム設定

rootDir

Next.js がルートディレクトリにインストールされていないプロジェクト (モノレポなど) で eslint-plugin-next を使用している場合は、.eslintrcsettings プロパティを使用して、Next.js アプリケーションの場所を eslint-plugin-next に指示できます。

.eslintrc.json
{
  "extends": "next",
  "settings": {
    "next": {
      "rootDir": "packages/my-app/"
    }
  }
}

rootDir は、パス (相対パスまたは絶対パス)、glob (例: "packages/*/")、またはパスと glob の配列を指定できます。

カスタムディレクトリとファイルのリンティング

デフォルトでは、Next.js は pages/app/components/lib/、および src/ ディレクトリ内のすべてのファイルに対して ESLint を実行します。 ただし、本番ビルドでは、next.config.jseslint 設定で dirs オプションを使用して、どのディレクトリを指定するかを指定できます。

next.config.js
module.exports = {
  eslint: {
    dirs: ['pages', 'utils'], // Only run ESLint on the 'pages' and 'utils' directories during production builds (next build)
  },
}

同様に、--dir および --file フラグを next lint で使用して、特定のディレクトリとファイルをリントできます。

ターミナル
next lint --dir pages --dir utils --file bar.js

キャッシング

パフォーマンスを向上させるため、ESLint によって処理されるファイルの情報はデフォルトでキャッシュされます。 これは .next/cache または定義済みの ビルドディレクトリ に保存されます。 単一のソースファイルの内容以上のものに依存する ESLint ルールを含めていて、キャッシュを無効にする必要がある場合は、next lint--no-cache フラグを使用します。

ターミナル
next lint --no-cache

ルールの無効化

サポートされているプラグイン (reactreact-hooksnext) によって提供されるルールを変更または無効にする場合は、.eslintrcrules プロパティを使用して直接変更できます。

.eslintrc.json
{
  "extends": "next",
  "rules": {
    "react/no-unescaped-entities": "off",
    "@next/next/no-page-custom-font": "off"
  }
}

Core Web Vitals

next/core-web-vitals ルールセットは、next lint が初めて実行され、**厳格** オプションが選択されたときに有効になります。

.eslintrc.json
{
  "extends": "next/core-web-vitals"
}

next/core-web-vitals は、Core Web Vitals に影響を与える場合、デフォルトでは警告である多数のルールでエラーが発生するように eslint-plugin-next を更新します。

next/core-web-vitals エントリポイントは、Create Next App でビルドされた新しいアプリケーションに自動的に含まれます。

TypeScript
.eslintrc.json
{
  "extends": ["next/core-web-vitals", "next/typescript"]
}

これらのルールは、plugin:@typescript-eslint/recommended に基づいています。 詳細については、typescript-eslint > 設定 を参照してください。

他のツールとの併用

Prettier 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 を追加します。

.eslintrc.json
{
  "extends": ["next", "prettier"]
}

lint-staged

ステージングされた git ファイルに対してリンターを実行するために、lint-staged と一緒に next lint を使用したい場合は、プロジェクトのルートにある .lintstagedrc.js ファイルに以下を追加して、--file フラグの使用を指定する必要があります。

.lintstagedrc.js
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],
}

既存の設定の移行

アプリケーションで ESLint が既に設定されていて、以下のいずれかの条件に当てはまる場合

  • 以下のプラグインのいずれか 1 つ以上が既にインストールされている場合 (個別に、または airbnbreact-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 を含めたい場合は、他の設定の後に最後に拡張されていることを確認してください。例:

.eslintrc.json
{
  "extends": ["eslint:recommended", "next"]
}

next 設定では、parserpluginssettings プロパティのデフォルト値の設定が既に処理されています。ユースケースに合わせて異なる設定が必要な場合を除き、これらのプロパティを手動で再宣言する必要はありません。

他の共有可能な設定を含める場合は、**これらのプロパティが上書きまたは変更されていないことを確認する必要があります**。そうでない場合は、`next` 設定と動作を共有する設定を削除するか、上記のように Next.js ESLint プラグインから直接拡張することをお勧めします。