- Publié le
Qu’est-ce qu’un linter ? Comprendre ESLint et son importance pour le Clean Code
- Auteurs
Qu’est-ce qu’un linter ? Comprendre ESLint et son importance pour le Clean Code
Lorsque plusieurs développeurs travaillent sur le même code, les incohérences de style et les erreurs cachées peuvent vite s’accumuler. C’est là qu’interviennent les linters. Ils vérifient automatiquement les problèmes potentiels du code et imposent un style cohérent dans le projet.
Cet article explore ce qu’est un linter, les raisons d’en utiliser un et pourquoi ESLint est devenu l’outil de référence dans l’écosystème JavaScript et TypeScript.
Ce que les linters détectent
Un linter analyse votre code et détecte plusieurs catégories de problèmes avant qu’ils provoquent des bogues ou des incohérences.
Erreurs de syntaxe → Problèmes qui rendent le code invalide ou inexécutable. Exemples :
- Parenthèses ou crochets manquants →
if (user.isLoggedIn { - Chaînes non terminées →
console.log("Hello) - Instructions
returnmal placées ou manquantes.
- Parenthèses ou crochets manquants →
Problèmes de qualité du code → Motifs qui respectent la syntaxe mais peuvent provoquer des erreurs à l’exécution ou de la confusion. Exemples :
- Variables inutilisées → Déclarer
const result = computeValue();sans jamais utiliserresult. - Code inaccessible → Placer des instructions après un
return. - Variables masquées → Réutiliser un nom de variable provenant d’une portée extérieure.
- Variables inutilisées → Déclarer
Incohérences de style → Différences de mise en forme et de style qui compliquent la lecture. Exemples :
- Points-virgules manquants ou indentation incohérente.
- Utilisation de
"double quotes"dans un fichier et de'single quotes'dans un autre. - Mélange de tabulations et d’espaces pour l’indentation.
Non-respect des bonnes pratiques → Code techniquement fonctionnel, mais contraire aux approches recommandées. Exemples :
- Utilisation d’API dépréciées, comme
ReactDOM.render()dans React 18. - Utilisation de
varplutôt que deletouconst. - Appel de fonctions asynchrones sans
await. - Utilisation de
==plutôt que de===, ce qui peut entraîner des bogues subtils de conversion implicite des types.
- Utilisation d’API dépréciées, comme
Les linters comme ESLint ne se limitent pas à détecter les erreurs. Ils imposent des conventions et empêchent les mauvaises habitudes d’entrer dans le dépôt.
Pourquoi utiliser un linter ?
1. Détecter les erreurs tôt
Les linters détectent les problèmes avant même l’exécution de l’application. ESLint peut par exemple signaler une variable non définie ou un await manquant dans une fonction asynchrone, ce qui économise du temps de débogage.
2. Assurer la cohérence
Un linter impose un style de code unifié dans l’équipe et évite les débats inutiles sur les tabulations, les espaces ou l’emplacement des virgules.
3. Améliorer la qualité du code
Les linters encouragent un code plus propre et maintenable en signalant des motifs complexes ou risqués, comme les callbacks profondément imbriqués ou les imports inutilisés.
4. S’intégrer au processus de travail
Ils s’exécutent automatiquement dans l’IDE, lors des commits via des hooks de pré-commit comme Husky, ou dans les pipelines CI/CD. Le code reste ainsi propre à chaque étape.
Focus sur ESLint : la référence pour JavaScript et TypeScript
ESLint est le linter le plus populaire de l’écosystème JavaScript, largement utilisé pour les projets React, Node.js et TypeScript.
🔧 Fonctionnalités clés
- Configuration très poussée → Adaptez chaque règle à votre style.
- Écosystème de plugins → Ajoutez les plugins de la communauté, notamment pour React, Jest, la sécurité ou l’accessibilité.
- Prise en charge de TypeScript → Intégration complète via
@typescript-eslint. - Règles avec correction automatique → De nombreux problèmes peuvent être corrigés automatiquement avec :
npx eslint . --fix - Intégrations → Fonctionne avec VS Code, WebStorm, GitHub Actions et presque tous les systèmes de CI.
Configurer ESLint
Vous pouvez installer et configurer ESLint dans votre projet avec :
npx eslint --init
Si vous utilisez ESLint v8.23 ou une version ultérieure, cette commande crée un fichier Flat Config nommé eslint.config.mjs, à la place de l’ancien format .eslintrc.json. Ce format moderne utilise les modules JavaScript et améliore les performances ainsi que la clarté.
Voici un exemple simple de configuration pour un projet Next.js et TypeScript :
// eslint.config.mjs
import js from '@eslint/js'
import tseslint from 'typescript-eslint'
import prettier from 'eslint-config-prettier'
import { FlatCompat } from '@eslint/eslintrc'
const compat = new FlatCompat({ baseDirectory: import.meta.dirname })
export default [
js.configs.recommended, // Core JavaScript best practices
...tseslint.configs.recommended, // TypeScript-specific linting
...compat.extends('next/core-web-vitals'), // Next.js and React recommendations
prettier, // Avoid rule conflicts with Prettier
{
files: ['**/*.{js,jsx,ts,tsx}'],
rules: {
'no-console': ['warn', { allow: ['warn', 'error'] }],
'@typescript-eslint/no-unused-vars': [
'warn',
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
],
semi: ['error', 'always'],
},
},
]
Explication
Détaillons ce qui se passe :
js.configs.recommended
Charge les règles fondamentales recommandées d’ESLint, qui couvrent les problèmes JavaScript courants comme :
- Les variables inutilisées
- Le code inaccessible
- Les instructions de retour manquantes
- Les erreurs de syntaxe
tseslint.configs.recommended
Ajoute des règles adaptées à TypeScript, qui détectent par exemple :
- Les imports inutilisés
- L’utilisation incorrecte des types
- Les variables déclarées mais jamais utilisées dans les fichiers
.ts/.tsx
compat.extends('next/core-web-vitals')
Applique les règles Next.js et React, notamment :
- Les bonnes pratiques d’accessibilité (a11y)
- La vérification de l’utilisation des React Hooks
- Les avertissements de performances, comme l’utilisation de
<img>au lieu de<Image>
prettier
Désactive les règles de linting liées à la mise en forme qui entreraient en conflit avec Prettier.
rules
Personnalisations propres au projet :
'no-console': ['warn']→ Autoriseconsole.warnetconsole.error, mais signale les autres appels à la console.'@typescript-eslint/no-unused-vars'→ Signale les variables ou paramètres déclarés mais inutilisés, en ignorant ceux dont le nom commence par_.'semi': ['error', 'always']→ Impose l’utilisation des points-virgules.
Cette configuration fournit :
- Un linting JavaScript et TypeScript fiable
- Les bonnes pratiques Next.js intégrées
- Une compatibilité automatique avec Prettier
- Des règles simples et claires qui rendent le code cohérent, lisible et sans bogues
Une fois ce fichier en place, vous pouvez analyser votre projet avec :
npm run lint
Ou corriger automatiquement les problèmes qui le permettent :
npm run lint -- --fix
ESLint et les autres linters
| Fonctionnalité | ESLint | TSlint, déprécié | JSHint | StandardJS |
|---|---|---|---|---|
| Langages pris en charge | JavaScript, TypeScript | TypeScript | JavaScript | JavaScript |
| Configurable | ✅ Oui | ⚠️ Limité | ⚠️ Limité | ❌ Non, style fixe |
| Écosystème de plugins | 🟢 Vaste | 🔴 Petit | 🔴 Petit | 🔴 Minimal |
| Correction automatique | ✅ Oui | ⚠️ Partielle | ⚠️ Partielle | ✅ Oui |
| Maintenance active | 🟢 Oui | 🔴 Non | 🟡 Rare | 🟢 Oui |
Depuis la dépréciation officielle de TSlint au profit d’ESLint, presque tous les projets JavaScript et TypeScript modernes utilisent ESLint.
Bonnes pratiques avec ESLint
- Associez ESLint à Prettier pour la mise en forme automatique du code.
- Ajoutez les vérifications ESLint aux hooks de pré-commit Git avec Husky ou lint-staged.
- Exécutez-le dans votre pipeline CI pour imposer la qualité du code dans les demandes de fusion.
- Vous pouvez utiliser des paquets recommandés comme eslint-config-airbnb ou eslint-plugin-react
Conclusion
Les linters sont essentiels pour conserver un code propre, cohérent et sans erreurs, particulièrement dans les projets collaboratifs. Parmi eux, ESLint se distingue comme l’outil le plus flexible et puissant pour les développeurs JavaScript et TypeScript.
Que vous travailliez seul ou dans une grande équipe, intégrer ESLint à votre processus garantit un code professionnel, lisible et maintenable à long terme.
Vous voulez voir ESLint en action ? Consultez sa documentation officielle ou ajoutez-le à votre projet avec npx eslint --init.