Déboguer du JS minifié : source maps et DevTools

Déboguer du JS minifié : source maps et DevTools

Code de production illisible : pretty-print Chrome, source maps, et déminifier en local seulement si les maps manquent. Les noms mangled restent.

22.12.2025
7 min de lecture
Partager cet article:
JavaScript
Déminification
Débogage
Développement
Code
Outils
Tutoriel

Le problème du code minifié en production

Un TypeError de production sur `main.js:1:245` n’est pas le même travail que « coller ça dans un déminificateur en ligne ». La minification retire espaces et commentaires ; le mangling renomme les fonctions en `a`, `b`, `c`. Le pretty-print restaure la forme. Seule une source map restaure les noms d’origine. Si les maps manquent et qu’il vous faut une copie locale, utilisez le déminificateur JavaScript — en sachant que les identifiants restent mangled.

Utiliser les source maps quand elles existent — noms d’origine et stack traces lisibles
Pretty-print dans Chrome DevTools (ou VS Code) sans quitter la session
Savoir ce que la déminification ne fait pas : les noms mangled ne reviennent pas
Ne sortir une copie formatée en local que si les maps manquent
Déboguer une bibliothèque tierce minifiée en s’appuyant sur les chaînes littérales

Quand le JavaScript de production est illisible

Situations de debug que vous rencontrerez vraiment

Ce sont des problèmes de débogage. Déminifier est une tactique — pas le réflexe par défaut.

Développeur analysant du code JavaScript minifié sur écran
La stack trace de production pointe la colonne 12 000 d’une seule ligne
Un bundle vendeur n’a pas de source map et il faut voir le flux de contrôle
Un problème de perf ne se reproduit que sur le build minifié
Vous inspectez un script tiers que vous avez le droit d’analyser
Vous avez enregistré un `.min.js` et devez le lire dans un éditeur
Ce que la déminification ne peut pas restaurer

Formater n’est pas décompiler. Tenez ces limites pour définitives :

Espace de travail développeur avec Chrome DevTools montrant les techniques de débogage JavaScript

Limitations :

Les identifiants mangled restent mangled : `a`, `b`, `c` ne redeviendront pas `getUserProfile`
Les commentaires supprimés sont perdus
Le code mort retiré par le minifier ne peut pas être récupéré
Indentation et retours à la ligne reviennent ; les noms d’origine non
Certaines transformations agressives (inlining, folding) restent difficiles à suivre même après pretty-print

Ce qui fonctionne :

Restaurer l’indentation et le wrapping
Espaces autour des opérateurs et mots-clés
Une instruction par ligne pour poser des breakpoints lisibles
Repérer plus vite les `if` / `for` / `return`
Pretty-print dans DevTools sur le fichier live, sans le copier ailleurs

Quand déminifier vs pretty-print

Maps d’abord, puis pretty-print, puis une copie locale

Ne commencez pas par coller dans un outil. Suivez cet ordre — la page déminifier JavaScript est l’étape 3, quand les maps manquent.

Interface d'outil de déminification JavaScript montrant le code minifié et formaté

1
Chercher une source map

Dans DevTools → Sources, vérifiez les fichiers d’origine à côté du bundle, un voisin `.map`, ou un commentaire `//# sourceMappingURL=`. Si une map se charge, déboguez là et arrêtez-vous.

2
Pretty-print dans le navigateur ou l’éditeur

Chrome Sources : le contrôle `{}` Pretty Print formate le fichier sur place. VS Code : Format Document (formateur JS intégré ou Prettier) sur un `.min.js` enregistré. Même limite : les noms restent mangled.

3
Déminifier en local seulement si vous avez besoin d’un fichier

Pas de map, et vous voulez du source indenté sur disque : collez dans déminifier JavaScript. Le traitement reste dans le navigateur. Taille et caractère d’indentation sont les réglages de format — pas un désobfuscateur.

4
Naviguer avec les littéraux, pas les noms

Cherchez des chaînes, URLs et messages d’erreur uniques. Suivez les motifs `if` / `return` / `.then(`. N’attendez pas que `a` redevienne un identifiant réel.

Exemple :

Avant (minifié) :

function a(b,c){return b+c}const d=a(5,3);console.log(d);

Après (déminifié) :

function a(b, c) { return b + c } const d = a(5, 3); console.log(d);
Un TypeError de production, sans deviner

Le pretty-print (ou une source map) doit précéder le copier-coller d’un bundle d’un mégaoctet dans un éditeur.

Visualisation du débogage de code JavaScript minifié avec loupe révélant les erreurs

Code minifié :

!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return ...

Code déminifié (aperçu) :

!function(e, t) { "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function(e) { if (!e.document) throw new Error("jQuery requires a window with a document"); return t(e) } : t(e) }("undefined" != typeof window ? window : this, function(e, t) { var n = [], r = e.document, i = n.slice, o = n.concat, s = n.push, a = n.indexOf, u = {}, c = u.toString, l = u.hasOwnProperty, f = {}, p = "2.3.1", d = function(e, t) { return new d.fn.init(e, t) }, h = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; // ... reste du code formaté });

Source maps : la meilleure voie de debug en production

Ce qu’une source map fait vraiment

Un fichier `.map` relie les positions minifiées aux sources d’origine. DevTools peut alors afficher vrais chemins, identifiants originaux et breakpoints dans le code que vous avez écrit — ce qu’aucun déminificateur ne peut reconstruire.

Diagramme de workflow montrant comment les Source Maps JavaScript connectent le code minifié au code source original
Noms de variables et de fonctions d’origine
Breakpoints dans vos fichiers source, pas sur une ligne de 400 Ko
Stack traces qui nomment les fonctions que vous reconnaissez
Déboguer la production sans livrer un bundle non minifié aux utilisateurs
Émettre des maps dans le build

Webpack 5 : réglez `devtool` (ne passez plus `sourceMap: true` à TerserPlugin — option retirée). Vite : `build.sourcemap: true` ou `'hidden'`. Terser en CLI peut toujours attacher un objet map comme ci-dessous.

Terser

const terser = require('terser'); const result = await terser.minify(code, { sourceMap: { filename: 'app.min.js', url: 'app.min.js.map' } });

Webpack

module.exports = { mode: 'production', devtool: 'hidden-source-map', };

Déboguer avec les DevTools du navigateur

Pretty Print dans Chrome DevTools

Chrome (et les autres DevTools Chromium) peuvent formater le fichier que vous inspectez déjà. C’est plus rapide qu’exporter le bundle si vous voulez seulement lire la ligne qui casse. Format Document dans VS Code sur un `.min.js` enregistré est l’équivalent éditeur — toujours pas une source map.

Panneau Sources de Chrome DevTools avec le bouton Pretty Print mis en évidence
1
Ouvrez DevTools (F12 ou Cmd+Option+I)
2
Ouvrez le panneau Sources et sélectionnez le fichier minifié
3
Cliquez sur le contrôle `{}` Pretty Print (barre d’état de l’éditeur)
4
Sautez à la colonne indiquée par la stack trace sur la vue formatée
5
Si une source map est présente, passez au fichier d’origine à la place
Breakpoints une fois le code lisible

Une fois que DevTools (ou un éditeur) a formaté le fichier, les numéros de ligne se rapportent à la vue pretty-printée, sauf si une map est active :

Conseils :

Posez des breakpoints sur les lignes formatées, puis rechargez pour le prochain hit
Inspectez les valeurs même si le binding s’appelle `a` — la valeur runtime est réelle
Utilisez la console sur la pile en pause pour évaluer des expressions
Avancez ligne à ligne : le pretty-print rend le step-over utilisable
Lisez la stack : les frames pointent encore le fichier minifié si aucune map n’est chargée

Quand il vous faut encore une copie locale formatée

Formateurs vs l’URL dédiée déminifier

Ces options ré-indentent le JavaScript. Aucune ne restaure les noms mangled. Le job « étendre du JS minifié » est sur déminifier JavaScript. La page sœur beautifier JavaScript est l’URL formateur ; minifier JavaScript est l’opération inverse.

FastMinify — Déminifier JS

Déminificateur local au navigateur : collez un snippet minifié, récupérez une sortie indentée. Taille d’indentation et espaces vs tabulations seulement. Rien n’est envoyé au serveur.

Avantages :
S’exécute dans le navigateur
Aucune installation
URL dédiée déminifier
Contrôles d’indentation
Inconvénients :
Formatage uniquement — pas un décompilateur

VS Code + Prettier

Enregistrez le fichier et lancez Format Document. C’est le chemin habituel « déminifier dans VS Code » : même gain de lisibilité que le pretty-print, toujours pas d’identifiants d’origine.

Avantages :
Reste dans l’éditeur
Prettier est un défaut d’équipe courant
Fonctionne hors ligne
Inconvénients :
Il faut le fichier sur disque
Pas de récupération des noms

JS Beautifier

Formateur open-source (js-beautify) en bibliothèque, CLI et diverses UI web. Même famille d’outil : espaces et structure, pas les symboles d’origine.

Avantages :
Open-source
CLI pour les scripts
Règles de wrap configurables
Inconvénients :
Toujours pas une source map

La suite à faire

Déboguez le JavaScript minifié dans cet ordre : source maps si elles existent, pretty-print dans DevTools ou VS Code si vous voulez seulement lire la ligne qui casse, et un déminificateur local seulement quand vous avez besoin d’une copie formatée et que les maps manquent. L’outil n’annule pas le mangling. Corrigez le build pour que le prochain incident ait des maps.

Pas de maps et besoin d’une source indentée en local ? Utilisez le déminificateur navigateur — puis revenez dans DevTools.

Émettre des source maps en production (`hidden-source-map` / Vite `'hidden'` sauf si vous exposez volontairement les sources)
Pretty-print dans DevTools avant de copier un bundle hors du navigateur
Utiliser la déminification pour une copie locale lisible, pas comme premier clic de debug
Traiter les noms mangled comme perdus sans maps
Garder un build de développement non minifié pour le debug quotidien
Partager cet article
Partager cet article: