Plugin ESLint

Next.js fournit un plugin ESLint, eslint-plugin-next, déjà inclus dans la configuration de base, qui permet de détecter les problèmes courants dans une application Next.js.

Référence

Les ensembles de règles recommandés par les plugins ESLint suivants sont tous utilisés dans eslint-config-next :

Cette configuration prendra le pas sur celle de next.config.js.

Règles

L'ensemble complet des règles est le suivant :

Activé dans la config recommandéeRègleDescription
Check Icon@next/next/google-font-displayApplique le comportement de font-display avec les polices Google.
Check Icon@next/next/google-font-preconnectS'assure que preconnect est utilisé avec les polices Google.
Check Icon@next/next/inline-script-idApplique l'attribut id sur les composants next/script avec du contenu en ligne.
Check Icon@next/next/next-script-for-gaPréfère le composant next/script lors de l'utilisation d'un script en ligne pour Google Analytics.
Check Icon@next/next/no-assign-module-variableEmpêche l'assignation à la variable module.
Check Icon@next/next/no-async-client-componentEmpêche les Client Components d'être des fonctions asynchrones.
Check Icon@next/next/no-before-interactive-script-outside-documentEmpêche l'utilisation de la stratégie beforeInteractive de next/script en dehors de pages/_document.js.
Check Icon@next/next/no-css-tagsEmpêche les balises de feuille de style manuelles.
Check Icon@next/next/no-document-import-in-pageEmpêche l'importation de next/document en dehors de pages/_document.js.
Check Icon@next/next/no-duplicate-headEmpêche l'utilisation en double de <Head> dans pages/_document.js.
Check Icon@next/next/no-head-elementEmpêche l'utilisation de l'élément <head>.
Check Icon@next/next/no-head-import-in-documentEmpêche l'utilisation de next/head dans pages/_document.js.
Check Icon@next/next/no-html-link-for-pagesEmpêche l'utilisation d'éléments <a> pour naviguer vers les pages internes de Next.js.
Check Icon@next/next/no-img-elementEmpêche l'utilisation de l'élément <img> en raison d'un LCP plus lent et d'une bande passante plus élevée.
Check Icon@next/next/no-page-custom-fontEmpêche les polices personnalisées spécifiques à une page.
Check Icon@next/next/no-script-component-in-headEmpêche l'utilisation de next/script dans le composant next/head.
Check Icon@next/next/no-styled-jsx-in-documentEmpêche l'utilisation de styled-jsx dans pages/_document.js.
Check Icon@next/next/no-sync-scriptsEmpêche les scripts synchrones.
Check Icon@next/next/no-title-in-document-headEmpêche l'utilisation de <title> avec le composant Head de next/document.
Check Icon@next/next/no-typosEmpêche les fautes de frappe courantes dans les fonctions de récupération de données de Next.js
Check Icon@next/next/no-unwanted-polyfillioEmpêche les polyfills en double de Polyfill.io.

Nous recommandons d'utiliser une intégration appropriée pour voir les avertissements et les erreurs directement dans votre éditeur de code pendant le développement.

Exemples

Linting des répertoires et fichiers personnalisés

Par défaut, Next.js exécutera ESLint pour tous les fichiers des répertoires pages/, app/, components/, lib/ et src/. Cependant, vous pouvez spécifier les répertoires à l'aide de l'option dirs dans la configuration eslint de next.config.js pour les builds de production :

next.config.js
module.exports = {
  eslint: {
    dirs: ['pages', 'utils'], // Exécute ESLint uniquement sur les répertoires 'pages' et 'utils' pendant les builds de production (next build)
  },
}

De même, les flags --dir et --file peuvent être utilisés avec next lint pour linter des répertoires et fichiers spécifiques :

Terminal
next lint --dir pages --dir utils --file bar.js

Spécification d'un répertoire racine dans un monorepo

Si vous utilisez eslint-plugin-next dans un projet où Next.js n'est pas installé dans votre répertoire racine (comme un monorepo), vous pouvez indiquer à eslint-plugin-next où trouver votre application Next.js en utilisant la propriété settings dans votre .eslintrc :

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname est disponible à partir de 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 peut être un chemin (relatif ou absolu), un glob (c'est-à-dire "packages/*/") ou un tableau de chemins et/ou globs.

Désactivation du cache

Pour améliorer les performances, les informations des fichiers traités par ESLint sont mises en cache par défaut. Ceci est stocké dans .next/cache ou dans votre répertoire de build défini. Si vous incluez des règles ESLint qui dépendent de plus que le contenu d'un seul fichier source et que vous devez désactiver le cache, utilisez le flag --no-cache avec next lint.

Terminal
next lint --no-cache

Désactivation des règles

Si vous souhaitez modifier ou désactiver certaines règles fournies par les plugins pris en charge (react, react-hooks, next), vous pouvez les modifier directement en utilisant la propriété rules dans votre .eslintrc :

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname est disponible à partir de 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

Avec Core Web Vitals

L'ensemble de règles next/core-web-vitals est activé lorsque next lint est exécuté pour la première fois et que l'option strict est sélectionnée.

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname est disponible à partir de 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 met à jour eslint-plugin-next pour signaler comme erreurs un certain nombre de règles qui sont des avertissements par défaut si elles affectent les Core Web Vitals.

Le point d'entrée next/core-web-vitals est automatiquement inclus pour les nouvelles applications créées avec Create Next App.

Avec TypeScript

En plus des règles ESLint de Next.js, create-next-app --typescript ajoutera également des règles de lint spécifiques à TypeScript avec next/typescript à votre configuration :

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname est disponible à partir de Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next/core-web-vitals', 'next/typescript'],
  }),
]

export default eslintConfig

Ces règles sont basées sur plugin:@typescript-eslint/recommended. Voir typescript-eslint > Configs pour plus de détails.

Avec Prettier

ESLint inclut également des règles de formatage de code, qui peuvent entrer en conflit avec votre configuration existante de Prettier. Nous recommandons d'inclure eslint-config-prettier dans votre configuration ESLint pour faire fonctionner ESLint et Prettier ensemble.

Premièrement, installez la dépendance :

Terminal
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

Ensuite, ajoutez prettier à votre configuration ESLint existante :

eslint.config.mjs
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname est disponible à partir de Node.js v20.11.0
  baseDirectory: import.meta.dirname,
})

const eslintConfig = [
  ...compat.config({
    extends: ['next', 'prettier'],
  }),
]

export default eslintConfig

Exécution du lint sur les fichiers mis en stage

Si vous souhaitez utiliser next lint avec lint-staged pour exécuter le linter sur les fichiers git mis en stage, vous devrez ajouter ce qui suit au fichier .lintstagedrc.js à la racine de votre projet afin de spécifier l'utilisation du flag --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],
}

Désactivation du lint pendant les builds de production

Si vous ne souhaitez pas qu'ESLint s'exécute pendant next build, vous pouvez définir l'option eslint.ignoreDuringBuilds dans next.config.js sur true :

import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  eslint: {
    // Attention : Cela permet aux builds de production de se terminer avec succès même si
    // votre projet contient des erreurs ESLint.
    ignoreDuringBuilds: true,
  },
}

export default nextConfig

Migration d'une configuration existante

Si vous avez déjà configuré ESLint dans votre application, nous recommandons d'étendre directement ce plugin plutôt que d'inclure eslint-config-next, sauf si certaines conditions sont remplies.

Ensemble de règles recommandé du plugin

Si les conditions suivantes sont vraies :

  • Vous avez un ou plusieurs des plugins suivants déjà installés (soit séparément, soit via une configuration différente comme airbnb ou react-app) :
    • react
    • react-hooks
    • jsx-a11y
    • import
  • Vous avez défini des parserOptions spécifiques qui diffèrent de la configuration de Babel dans Next.js (ce n'est pas recommandé sauf si vous avez personnalisé votre configuration Babel)
  • Vous avez installé eslint-plugin-import avec des résolveurs Node.js et/ou TypeScript définis pour gérer les imports

Alors nous recommandons soit de supprimer ces paramètres si vous préférez la façon dont ces propriétés ont été configurées dans eslint-config-next, soit d'étendre directement le plugin ESLint de Next.js :

module.exports = {
  extends: [
    //...
    'plugin:@next/next/recommended',
  ],
}

Le plugin peut être installé normalement dans votre projet sans avoir besoin d'exécuter next lint :

Terminal
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

Cela élimine le risque de collisions ou d'erreurs qui peuvent survenir en raison de l'importation du même plugin ou parseur à travers plusieurs configurations.

Configurations supplémentaires

Si vous utilisez déjà une configuration ESLint séparée et souhaitez inclure eslint-config-next, assurez-vous qu'elle est étendue en dernier après les autres configurations. Par exemple :

eslint.config.mjs
import js from '@eslint/js'
import { FlatCompat } from '@eslint/eslintrc'

const compat = new FlatCompat({
  // import.meta.dirname est disponible à partir de Node.js v20.11.0
  baseDirectory: import.meta.dirname,
  recommendedConfig: js.configs.recommended,
})

const eslintConfig = [
  ...compat.config({
    extends: ['eslint:recommended', 'next'],
  }),
]

export default eslintConfig

La configuration next gère déjà la définition des valeurs par défaut pour les propriétés parser, plugins et settings. Il n'est pas nécessaire de redéclarer manuellement ces propriétés sauf si vous avez besoin d'une configuration différente pour votre cas d'utilisation.

Si vous incluez d'autres configurations partageables, vous devrez vous assurer que ces propriétés ne sont pas écrasées ou modifiées. Sinon, nous recommandons de supprimer les configurations qui partagent un comportement avec la configuration next ou d'étendre directement depuis le plugin ESLint de Next.js comme mentionné ci-dessus.