Contactez-nous

Linting avec ESLint et configuration pour React

Apprenez à installer, configurer et utiliser ESLint avec les plugins React essentiels pour analyser statiquement votre code, détecter les erreurs et maintenir la cohérence.

Qu'est-ce que le Linting et pourquoi ESLint ?

Le linting est le processus d'analyse statique du code source pour identifier et signaler les erreurs de programmation potentielles, les bugs, les erreurs stylistiques et les constructions suspectes. Un outil de linting, ou "linter", agit comme un vérificateur orthographique et grammatical pour votre code, vous aidant à maintenir une haute qualité et une cohérence avant même d'exécuter votre application.

Dans l'écosystème JavaScript et React, ESLint est l'outil de linting le plus populaire et le plus puissant. Sa force réside dans sa grande configurabilité et son architecture pluggable. ESLint lui-même fournit un moteur d'analyse et des règles de base pour JavaScript, mais sa véritable puissance vient de la possibilité d'ajouter des plugins pour étendre ses capacités à des bibliothèques spécifiques (comme React), des frameworks, ou pour faire respecter des ensembles de règles personnalisés ou communautaires.

Utiliser ESLint dans un projet React permet de :

  • Détecter les erreurs courantes en JavaScript et React (variables non utilisées, erreurs de syntaxe, etc.).
  • Faire respecter les règles fondamentales de React (comme les Règles des Hooks).
  • Assurer un style de code cohérent au sein de l'équipe.
  • Identifier les problèmes potentiels d'accessibilité dans le JSX.
  • Prévenir les anti-patterns et encourager les bonnes pratiques.

Installation des dépendances nécessaires

Pour utiliser ESLint avec React, vous devez installer plusieurs paquets comme dépendances de développement :

  • `eslint` : Le moteur ESLint principal.
  • Plugins spécifiques à React :
    • `eslint-plugin-react` : Contient des règles spécifiques à la syntaxe et aux bonnes pratiques de React (gestion des props, des clés, etc.).
    • `eslint-plugin-react-hooks` : Indispensable, il contient les règles pour faire respecter les Règles des Hooks (`rules-of-hooks`) et vérifier les dépendances des hooks (`exhaustive-deps`).
    • `eslint-plugin-jsx-a11y` (recommandé) : Fournit des règles pour vérifier les problèmes d'accessibilité courants dans votre JSX.
  • Parser : ESLint a besoin d'un parser pour comprendre la syntaxe spécifique que vous utilisez (ES modules, JSX, TypeScript).
    • Pour JavaScript moderne avec Babel : `@babel/eslint-parser`.
    • Pour TypeScript : `@typescript-eslint/parser` (accompagné de `@typescript-eslint/eslint-plugin` pour les règles spécifiques à TypeScript).

Installation typique (pour un projet JS/Babel) :

npm install --save-dev eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-jsx-a11y @babel/eslint-parser @babel/core @babel/preset-react
# Ou avec yarn
yarn add --dev eslint eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-jsx-a11y @babel/eslint-parser @babel/core @babel/preset-react

Pour TypeScript, remplacez `@babel/eslint-parser` par `@typescript-eslint/parser` et `@typescript-eslint/eslint-plugin` et assurez-vous que `typescript` est installé.

Configuration d'ESLint (`.eslintrc.js` ou `.eslintrc.json`)

ESLint est configuré via un fichier à la racine de votre projet, le plus souvent nommé `.eslintrc.js` (recommandé car permet les commentaires et la logique JS) ou `.eslintrc.json`. Voici les sections clés de la configuration :

  • `parser` : Spécifie quel parser utiliser (ex: `'@babel/eslint-parser'` ou `'@typescript-eslint/parser'`).
  • `parserOptions` : Configure les options du parser, comme la version ECMAScript (`ecmaVersion`), le type de source (`sourceType: 'module'`), et les fonctionnalités à activer (`ecmaFeatures: { jsx: true }`).
  • `env` : Définit les environnements globaux disponibles (ex: `browser: true` pour les API du navigateur, `node: true`, `es2021: true`).
  • `plugins` : Liste les plugins à utiliser (ex: `['react', 'react-hooks', 'jsx-a11y']`). Le nom du paquet est généralement préfixé par `eslint-plugin-`.
  • `extends` : Permet d'hériter d'ensembles de règles prédéfinis (configs). C'est très pratique pour démarrer. Les configurations courantes à étendre pour React sont :
    • `eslint:recommended` : Les règles de base recommandées par ESLint.
    • `plugin:react/recommended` : Les règles recommandées par `eslint-plugin-react`.
    • `plugin:react-hooks/recommended` : Les règles cruciales de `eslint-plugin-react-hooks`.
    • `plugin:jsx-a11y/recommended` : Les règles recommandées pour l'accessibilité JSX.
    • (Pour TypeScript) `plugin:@typescript-eslint/recommended`.
  • `rules` : Permet de surcharger ou de personnaliser des règles spécifiques définies par les plugins ou les configs étendues. Vous pouvez désactiver une règle (`'off'` ou `0`), la définir comme un avertissement (`'warn'` ou `1`), ou comme une erreur (`'error'` ou `2`), et parfois configurer des options spécifiques à la règle.
  • `settings` : Contient des configurations partagées entre les règles de différents plugins. Pour React, on spécifie souvent la version de React : `settings: { react: { version: 'detect' } }`.

Exemple de configuration `.eslintrc.js` pour React (JS/Babel) :

module.exports = {
  env: {
    browser: true,
    es2021: true,
    jest: true, // Si vous utilisez Jest
  },
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:jsx-a11y/recommended',
    // Ajoutez 'prettier' ici si vous utilisez Prettier (voir chapitre suivant)
  ],
  parser: '@babel/eslint-parser',
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
    ecmaVersion: 12, // ou 'latest'
    sourceType: 'module',
    requireConfigFile: false, // Peut être nécessaire pour @babel/eslint-parser
    babelOptions: {
      presets: ['@babel/preset-react'] // Indique à Babel de comprendre le JSX
    }
  },
  plugins: [
    'react',
    'react-hooks',
    'jsx-a11y',
  ],
  rules: {
    // Ex: Désactiver une règle spécifique
    'react/prop-types': 'off',
    // Ex: Changer la sévérité d'une règle
    'react/react-in-jsx-scope': 'off', // Plus nécessaire avec le nouveau runtime JSX
    // Ex: Configurer une règle avec des options
    'jsx-a11y/anchor-is-valid': ['error', { 
      components: ['Link'], 
      specialLink: ['to'] 
    }],
    // ... autres règles personnalisées
  },
  settings: {
    react: {
      version: 'detect', // Détecte automatiquement la version de React
    },
  },
};

Importance des règles `eslint-plugin-react-hooks`

Il est crucial de souligner l'importance capitale du plugin `eslint-plugin-react-hooks` et de ses deux règles activées par `plugin:react-hooks/recommended` :

  • `react-hooks/rules-of-hooks` : Cette règle fait respecter les deux Règles fondamentales des Hooks :
    • N'appelez les Hooks qu'au niveau supérieur de vos composants fonctionnels ou de vos hooks personnalisés (pas dans les boucles, conditions ou fonctions imbriquées).
    • N'appelez les Hooks que depuis des composants fonctionnels React ou des hooks personnalisés (pas depuis des fonctions JavaScript classiques).
    Le non-respect de ces règles peut entraîner des bugs subtils et imprévisibles liés à l'ordre des appels de hooks.
  • `react-hooks/exhaustive-deps` : Cette règle analyse les dépendances de vos hooks `useEffect`, `useCallback`, `useMemo`, etc., et vous avertit si des valeurs réactives utilisées à l'intérieur du hook ne sont pas incluses dans le tableau des dépendances. Oublier une dépendance est une source très fréquente de bugs (closures périmées, effets qui ne se ré-exécutent pas quand ils le devraient). Bien qu'il puisse parfois y avoir des faux positifs ou des cas où l'on souhaite intentionnellement omettre une dépendance (à faire avec une extrême prudence et souvent via des commentaires `eslint-disable-next-line`), cette règle est un filet de sécurité extrêmement précieux.

Intégration dans le flux de travail

Pour maximiser l'efficacité d'ESLint :

  • Intégration à l'éditeur : Installez l'extension ESLint pour votre éditeur de code (VS Code, WebStorm, etc.). Cela vous fournira un retour d'information instantané avec des soulignements et des messages d'erreur/avertissement pendant que vous codez.
  • Scripts NPM/Yarn : Ajoutez un script `lint` à votre `package.json` pour pouvoir lancer ESLint sur l'ensemble du projet depuis la ligne de commande :
    {
      "scripts": {
        "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
        "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix"
      }
    }
    L'option `--fix` tente de corriger automatiquement autant de problèmes que possible.
  • Hooks de pré-commit : Utilisez des outils comme Husky et lint-staged pour exécuter automatiquement ESLint (et souvent Prettier) sur les fichiers modifiés avant chaque commit. Cela empêche le code non conforme d'entrer dans votre dépôt Git.

Conclusion : Un gardien de la qualité

ESLint, correctement configuré avec les plugins React appropriés, est un outil indispensable pour tout projet React sérieux. Il agit comme un gardien automatisé de la qualité du code, vous aidant à éviter les erreurs courantes, à respecter les bonnes pratiques de React (en particulier les Règles des Hooks), et à maintenir une base de code cohérente et lisible. Investir du temps dans sa configuration initiale est largement rentabilisé par la prévention des bugs et l'amélioration de la maintenabilité sur le long terme.