Les erreurs JavaScript se répartissent en trois catégories distinctes - syntaxe, runtime et logique - et l’outil adéquat pour chacune est différent. Un vérificateur de syntaxe repère les problèmes structurels avant même que le moteur n’exécute votre code ; un décodeur d’erreurs runtime explique les messages obscurs après leur apparition ; un analyseur statique trouve des bugs potentiels qu’aucune de ces approches ne touche. Ce guide associe chaque catégorie d’erreur JavaScript au meilleur outil pour la détecter, avec des flux pour le navigateur, Node.js et les pipelines CI/CD.
Types d’erreurs JavaScript
Chaque erreur JavaScript que vous rencontrez appartient à l’une des trois catégories, et les confondre conduit à utiliser le mauvais outil. Comprendre d’abord les catégories fait gagner un temps de débogage considérable car cela indique exactement où chercher et quel type de vérificateur aidera.
Erreurs de syntaxe
Les erreurs de syntaxe sont détectées par le parseur JavaScript avant l’exécution de la moindre ligne de code. Elles signifient que le moteur ne peut pas interpréter la structure du fichier - une accolade fermante manquante, un jeton inattendu, un mot réservé utilisé comme nom de variable ou une chaîne non fermée. L’erreur est levée à l’analyse avec un numéro de ligne et une brève description. Un vérificateur ou validateur de syntaxe les détecte sans exécuter le code.
Erreurs runtime
Les erreurs runtime surviennent pendant l’exécution, quand un code syntaxiquement valide tente une opération illégale. Les plus courantes : accéder à une propriété sur `null` ou `undefined` (`TypeError`), appeler quelque chose qui n’est pas une fonction (`TypeError`), référencer une variable inexistante (`ReferenceError`), ou diviser par une valeur non numérique (`NaN` - qui échoue silencieusement). Ces erreurs exigent un environnement en exécution, un décodeur de stack trace ou une analyse statique soignée pour être détectées.
Erreurs de logique
Les erreurs de logique produisent un résultat erroné sans lever la moindre erreur - une boucle décalée d’un cran, une condition incorrecte, une mutation là où une copie était prévue. Aucun validateur ni vérificateur de syntaxe ne les détecte ; elles exigent des tests unitaires, une revue de code ou une session de débogage. L’ensemble de règles d’ESLint chevauche certains schémas d’erreurs logiques (p. ex. signaler `==` au lieu de `===`), mais la plupart des bugs logiques ne se trouvent qu’en exécutant le code avec de vraies données.
- SyntaxError : Détecté à l’analyse - crochet manquant, mauvais jeton, chaîne non fermée.
- TypeError : Accéder à `.propriété` sur null/undefined, appeler autre chose qu’une fonction.
- ReferenceError : Utiliser une variable jamais déclarée dans la portée courante.
- RangeError : Passer une valeur hors de la plage autorisée - p. ex. `new Array(-1)`.
- URIError : URI mal formée passée à `decodeURIComponent` ou `encodeURIComponent`.
- Bug logique : Résultat erroné, aucune erreur levée - exige des tests ou un débogueur.
Note
Vérificateurs de syntaxe JavaScript
Un vérificateur de syntaxe JavaScript (aussi appelé validateur de syntaxe) analyse votre code sans l’exécuter et signale chaque endroit où la structure viole la grammaire JavaScript. C’est le premier contrôle le plus rapide et le plus sûr - il attrape les erreurs qui empêcheraient votre code de fonctionner du tout, et cela en millisecondes sans effet de bord.
Quand utiliser un vérificateur de syntaxe
Les vérificateurs de syntaxe sont utiles dans quatre situations : quand vous recevez du JavaScript d’un tiers (fichier généré, extrait de documentation ou code collé par un collègue), quand vous déboguez un script qui échoue silencieusement dans un build minifié, quand vous écrivez du JavaScript dans un éditeur sans support de language server, et quand vous voulez une vérification rapide avant de committer un fichier que vous avez beaucoup édité.
Ce qu’un vérificateur de syntaxe détecte ou non
| Contrôle | Validateur de syntaxe | ESLint | Compilateur TypeScript |
|---|---|---|---|
| Crochet/accolade fermante manquante | ✓ Oui | ✓ Oui | ✓ Oui |
| Jeton inattendu / syntaxe invalide | ✓ Oui | ✓ Oui | ✓ Oui |
| Référence à variable non définie | ✗ Non | ✓ Avec la règle no-undef | ✓ Oui (strict) |
| Incompatibilité de types | ✗ Non | ✗ Non | ✓ Oui |
| Avertissement de variable inutilisée | ✗ Non | ✓ no-unused-vars | ✓ noUnusedLocals |
| Await manquant sur appel async | ✗ Non | ✓ no-floating-promises | ✓ Oui |
| Logique / résultat erroné | ✗ Non | ✗ Non | ✗ Non |
Le Validateur de syntaxe JavaScript d’Aback Tools s’exécute entièrement dans votre navigateur - collez votre code, cliquez sur valider, et chaque erreur de syntaxe est surlignée avec numéro de ligne et message du parseur en moins d’une seconde. Votre code n’est jamais envoyé à un serveur, ce qui le rend sûr pour les scripts propriétaires, les outils internes et le code applicatif confidentiel.
Validateur de syntaxe JavaScript
Vérifiez du code JavaScript pour des erreurs de syntaxe instantanément - parseur local au navigateur, diagnostics par ligne, aucun envoi requis.
Erreurs runtime et stack traces
Les erreurs runtime se présentent comme une exception levée avec un type, un message et une stack trace. Les lire efficacement est une compétence qui distingue les débogueurs rapides des lents. Le type d’erreur resserre immédiatement la cause ; la stack trace pointe le chemin d’exécution exact qui y a mené.
Comment lire une stack trace JavaScript
Une stack trace est une liste d’appels de fonctions en ordre inverse - l’appel le plus récent en haut, le point d’entrée en bas. Chaque ligne montre un nom de fonction, un chemin de fichier et un numéro `line:column`. Partez du haut de la trace et descendez jusqu’à trouver la première ligne qui référence votre propre code (pas une librairie comme React, Express ou lodash). C’est l’appel qui a déclenché l’erreur. Les lignes au-dessus montrent comment vous y êtes arrivé.
TypeError: Cannot read properties of undefined (reading 'name')
at formatUser (app.js:24:18) // ← votre code - commencez ici
at renderCard (components.js:51:5) // ← votre code - chaîne d’appels
at Array.map (<anonymous>)
at buildList (components.js:44:20)
at App (app.js:12:15)
at React.createElement ...La première ligne nomme le type d’erreur (`TypeError`) et la propriété précise en échec (`name`). La ligne `app.js:24:18` est l’endroit où l’accès à la propriété a eu lieu. Allez à cette ligne - `user.name` où `user` est undefined - et ajoutez la garde appropriée : chaînage optionnel (`user?.name`), test de nullité ou valeur par défaut. L’Explicateur de stack trace JavaScript analyse n’importe quelle stack trace et produit automatiquement un décompte structuré de l’origine, de la chaîne d’appels et du correctif le plus probable.
Décoder des messages d’erreur runtime obscurs
Certains messages d’erreur runtime sont limpides ; d’autres sont célèbres pour leur inutilité. `"Maximum call stack size exceeded"` signifie récursion infinie. `"Cannot set properties of null"` signifie que vous avez appelé `.setAttribute()` ou similaire sur un élément DOM qui n’existe pas encore. `"$ is not defined"` dans un contexte navigateur signifie que jQuery n’a pas été chargé avant le script qui l’utilise. Le Décodeur d’erreurs runtime JavaScript accepte tout message d’erreur et renvoie une explication en langage clair avec des étapes de correction pour les schémas les plus courants.
Tip
Décodeur d’erreurs runtime JavaScript
Collez n’importe quel message d’erreur JavaScript et obtenez une explication en langage clair avec des recommandations de correction ciblées - aucune configuration d’environnement requise.
ESLint et analyse statique
ESLint est l’outil d’analyse statique de référence pour JavaScript et TypeScript. Il lit votre code source sans l’exécuter et applique un ensemble de règles configurable qui détecte des problèmes allant des erreurs de syntaxe aux anti-patterns de sécurité. Contrairement à un vérificateur de syntaxe, ESLint comprend la portée, les cycles de vie des variables et les graphes d’imports - ce qui lui permet de trouver des bugs invisibles pour un parseur pur.
Ce qu’ESLint détecte et que les vérificateurs de syntaxe manquent
- Variables non définies : La règle `no-undef` signale toute variable utilisée sans déclaration dans la portée.
- Variables inutilisées : `no-unused-vars` empêche l’accumulation de code mort qui masque la vraie logique.
- Égalité non sûre : `eqeqeq` impose `===` plutôt que `==`, éliminant les bugs de coercition de types.
- Await manquant : `no-floating-promises` (via TypeScript ESLint) attrape les appels async non gérés.
- Code inaccessible : `no-unreachable` signale les instructions après un `return` ou `throw`.
- Pas de console en production : `no-console` empêche les logs de débogage de partir en production.
- Règles de sécurité : `eslint-plugin-security` signale les vulnérabilités d’injection potentielles et les regex non sûrs.
Essentiels de la configuration ESLint
Le comportement d’ESLint est entièrement piloté par son fichier de configuration - `.eslintrc.json`, `.eslintrc.js` ou le nouveau format flat config `eslint.config.js`. La config déclare quels ensembles de règles étendre (`eslint:recommended`, `plugin:@typescript-eslint/recommended`, `plugin:react/recommended`) et quelles règles individuelles activer, désactiver ou ajuster. Un fichier ESLint mal configuré peut désactiver silencieusement des règles importantes, voilà pourquoi valider la config elle-même compte. Le Validateur de configuration ESLint vérifie votre fichier de configuration pour erreurs structurelles et conflits de règles avant une passe de lint.
La valeur d’ESLint ne réside pas dans les règles que vous activez - elle réside dans les règles que votre équipe accepte d’appliquer de façon cohérente. Une config partagée dans le contrôle de versions garantit que chaque développeur voit le même retour.
Exécuter ESLint pour la première fois
# Installer ESLint dans un projet
npm install --save-dev eslint
# Initialiser un fichier de configuration de façon interactive
npx eslint --init
# Linter un seul fichier
npx eslint src/app.js
# Linter un répertoire et auto-corriger les problèmes sûrs
npx eslint src/ --fix
# Sortie JSON pour les outils CI
npx eslint src/ --format json > eslint-report.jsonNote
Débogage avec les DevTools du navigateur
Chrome DevTools, Firefox Developer Tools et Safari Web Inspector offrent l’expérience de débogage JavaScript la plus poussée disponible - exécution en direct, points d’arrêt, inspection des variables et traçage des requêtes réseau. Pour les erreurs runtime difficiles à reproduire en local, les DevTools sont l’environnement d’investigation principal.
Le panneau Console
L’onglet Console affiche chaque message journalisé, avertissement et erreur levée en temps réel. Les erreurs apparaissent en rouge avec une stack trace dépliable. Cliquer sur la référence fichier:ligne à droite saute directement au panneau Sources à cet endroit. Le Classificateur d’erreurs de console navigateur complète les DevTools en catégorisant les erreurs de console par type et gravité - utile quand la sortie console est longue et qu’il faut trier vite.
Points d’arrêt et panneau Sources
Le panneau Sources permet de poser des points d’arrêt - mettre l’exécution en pause à une ligne précise et inspecter chaque variable dans la portée à cet instant. Cliquez dans la gouttière des numéros de ligne du panneau Sources pour ajouter un point d’arrêt, puis rechargez la page ou déclenchez l’action qui provoque l’erreur. Quand l’exécution se met en pause, survolez toute variable pour voir sa valeur actuelle, utilisez le panneau Call Stack pour voir comment vous y êtes arrivé, et avancez dans le code ligne par ligne avec F10 (pas à pas) ou F11 (entrer).
Points d’arrêt conditionnels et logpoints
Faites un clic droit sur n’importe quel numéro de ligne dans Sources pour ajouter un point d’arrêt conditionnel (pause seulement quand une condition est vraie, p. ex. `user.id === 42`) ou un logpoint (journalise une valeur sans mettre en pause, comme un `console.log` non intrusif). Les deux sont extrêmement utiles pour déboguer des boucles et des gestionnaires d’événements où s’arrêter à chaque itération serait impraticable.
| Approche de débogage | Idéal pour | Attrape erreurs runtime | Attrape erreurs de syntaxe |
|---|---|---|---|
| Validateur de syntaxe JavaScript | Contrôle statique pré-exécution | ✗ Non | ✓ Oui |
| ESLint | Analyse statique, CI/CD | ⚠ Partiellement | ✓ Oui |
| Console des DevTools navigateur | Erreurs navigateur en direct | ✓ Oui | ✓ Oui |
| Points d’arrêt DevTools | Débogage interactif | ✓ Oui | ✗ Non |
| Décodeur d’erreurs runtime | Expliquer les messages d’erreur | ✓ Oui | ✗ Non |
| Explicateur de stack trace | Retracer l’origine de l’appel | ✓ Oui | ✗ Non |
| Node.js --inspect + Chrome | Débogage côté serveur | ✓ Oui | ✓ Oui |
Vérification des erreurs en CI/CD
La vérification manuelle des erreurs pendant le développement est une bonne pratique mais pas une garantie. Automatiser la vérification des erreurs JavaScript dans votre pipeline CI/CD garantit qu’aucune erreur de syntaxe, violation ESLint ou erreur de type ne puisse fusionner dans la branche principale - quel que soit le développeur ayant soumis la pull request ou s’il a exécuté les contrôles localement.
Un garde-fou qualité CI minimal
name: JavaScript Quality
on:
pull_request:
paths: ['src/**/*.js', 'src/**/*.ts']
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: ESLint
run: npx eslint src/ --max-warnings 0
- name: TypeScript check
run: npx tsc --noEmitLe drapeau `--max-warnings 0` traite les avertissements ESLint comme des erreurs, bloquant la fusion. Associez-y `tsc --noEmit` pour les projets TypeScript afin d’attraper les erreurs de types que les règles d’ESLint ne voient pas. Les deux étapes quittent avec un code non nul en cas d’échec, ce qui fait échouer le workflow GitHub Actions et empêche la fusion de la pull request jusqu’à résolution des problèmes.
Source maps pour le suivi des erreurs en production
Quand une erreur JavaScript atteint la production dans un bundle minifié, la stack trace affiche des noms de fichiers compressés et des numéros de colonne inutilisables sans source map. Les source maps relient la sortie minifiée aux fichiers sources d’origine. Avant le déploiement, validez que vos fichiers de source map sont correctement structurés avec le Validateur de source map - une source map cassée produit des stack traces de production illisibles qui ralentissent nettement le diagnostic des incidents.
Warning
Bonnes pratiques de débogage
De bonnes habitudes de vérification d’erreurs réduisent le temps de débogage de plusieurs ordres de grandeur. Ces pratiques s’appliquent que vous travailliez dans un navigateur, un service Node.js ou une fonction serverless.
Corrigez la première erreur, pas toutes les erreurs
Les erreurs de syntaxe JavaScript se mettent en cascade - un crochet manquant à la ligne 10 peut produire cinq erreurs signalées en dessous à mesure que le parseur perd la trace de la structure du document. Corrigez toujours d’abord l’erreur signalée la plus haute, puis relancez le validateur. Ce qui semblait être cinq bugs n’en est souvent qu’un. Cela vaut autant pour les rapports ESLint que pour la sortie du compilateur TypeScript.
Utilisez le mode strict et les fonctionnalités modernes
Ajouter `"use strict"` à un fichier (ou utiliser les modules ES, toujours stricts) transforme les échecs silencieux en erreurs levées. Affecter une variable non déclarée crée silencieusement une globale en mode laxiste ; en mode strict, cela lève immédiatement un `ReferenceError`. Le chaînage optionnel (`?.`), la coalescence nulle (`??`) et les valeurs par défaut de déstructuration de tableaux (`const [a = 0] = arr`) réduisent significativement la surface des erreurs `TypeError: Cannot read properties of undefined`.
Validez les données externes à la frontière
La majorité des exceptions `TypeError` runtime en production proviennent de données externes - réponses d’API, saisies utilisateur ou valeurs localStorage - qui ne correspondent pas à la forme attendue. Validez les données entrantes à la frontière : utilisez un validateur de schéma comme Zod ou Joi sur les réponses d’API, vérifiez les valeurs `localStorage` avant de les parser en JSON, et ne présumez jamais qu’un champ existe simplement parce qu’il était présent dans vos données de test. La Calculatrice de taille de heap JavaScript est utile quand des erreurs mémoire apparaissent - elle aide à estimer si une grande structure de données ou un processus long dépasse l’allocation de heap de V8.
- Corrigez d’abord la première erreur : Les erreurs de syntaxe se mettent en cascade - un vrai problème en produit plusieurs signalés.
- Activez ESLint dans votre éditeur : Le retour en ligne en temps réel attrape les erreurs pendant la frappe, pas après le commit.
- Utilisez TypeScript : Les erreurs de types attrapées à la compilation ne peuvent pas devenir des erreurs runtime en production.
- Validez les données externes : Réponses d’API et saisies utilisateur doivent être vérifiées avant usage, pas présumées correctes.
- Écrivez des tests ciblés : Les tests unitaires des chemins critiques révèlent des erreurs logiques qu’aucun outil statique ne peut détecter.
- Utilisez les source maps : Des stack traces de production lisibles réduisent drastiquement le temps de réponse aux incidents.
Tip
Key takeaways
- Les erreurs de syntaxe sont attrapées avant l’exécution - utilisez le Validateur de syntaxe JavaScript pour une vérification instantanée, locale au navigateur, sans envoi de code.
- Les erreurs runtime produisent un type et une stack trace - le Décodeur d’erreurs runtime JavaScript explique tout message d’erreur en langage clair avec étapes de correction.
- ESLint attrape des problèmes que les vérificateurs de syntaxe manquent : variables non définies, égalité non sûre, imports inutilisés et `await` manquants - validez votre config ESLint avec le Validateur de configuration ESLint.
- Corrigez toujours d’abord l’erreur signalée la plus haute - les erreurs de syntaxe se mettent en cascade et un vrai problème en produit plusieurs signalés.
- Ajoutez ESLint et `tsc --noEmit` à votre pipeline CI/CD pour qu’aucune erreur ne fusionne sans être attrapée, quelle que soit la configuration locale.
- Les source maps sont essentielles pour des stack traces de production lisibles - validez-les avec le Validateur de source map avant le déploiement.
- Validez les données externes (réponses d’API, saisies utilisateur) à la frontière pour éliminer la première cause de `TypeError: Cannot read properties of undefined` en production.