Chrome DevTools est intégré au navigateur et fonctionne sur n’importe quel site, y compris les applications publiées. Il vous montre le DOM, les requêtes, ce qui est stocké dans le navigateur, ce que consomme la page et ce qui reste en mémoire. Angular DevTools est une extension à part, qui ajoute un onglet « Angular » avec l’arbre des composants, le profiler, les injecteurs et les routes.
Les étapes ci-dessous utilisent les noms exacts des boutons de Chrome DevTools, tirés de son code source. Chaque section propose un exercice à faire directement sur cette page.
- Sur un site publié (build de production), les noms de classes sont minifiés,
window.ngn’existe pas et Angular DevTools refuse de démarrer. Pour cela, il vous faut votre propre application, lancée avecng serve. - Elements, Network, Application, Performance monitor et les heap snapshots fonctionnent partout. Cherchez par balises et types natifs, pas par vos noms de classes.
- Une fuite se voit comme un nombre qui augmente à chaque répétition et ne redescend jamais : JS event listeners dans Performance monitor, un
# Deltapositif dans Comparison. - DevTools lui-même peut garder des objets en vie : ce que vous avez sélectionné dans Elements ou affiché dans la Console. Videz la console avant le dernier snapshot.
- Les noms de classes sont minifiés. Un heap snapshot ne montre pas
LeakyWidgetmaise,Geoudc. Les balises HTML (<app-leaky-widget>) et les types natifs du navigateur (DOMTimer,EventListener) restent en revanche lisibles. - Les utilitaires
ng.*de la console n’existent qu’en développement. Sur le site publié,ngvautundefined. - Angular DevTools ne fonctionne pas sur les builds de production. Il affiche « We detected an application built with production configuration. Angular DevTools only supports development builds. »
- Les exemples HTTP de ce site utilisent un backend simulé dans le navigateur. Leurs requêtes n’arrivent jamais dans Network. Le laboratoire ci-dessous envoie une vraie requête, pour que vous ayez quelque chose à suivre.
Ouvrir DevTools et trouver n’importe quel panneau
- Ouvrez DevTools avec F12 ou Ctrl+Shift+I (Windows, Linux), ou Cmd+Option+I (Mac). Ou clic droit sur la page → Inspect (Inspecter).
- Les panneaux sont des onglets en haut : Elements, Console, Sources, Network, Performance, Memory, Application. Ceux qui ne tiennent pas sont sous ».
- Le chemin le plus rapide vers tout : le menu de commandes, avec Ctrl+Shift+P ou Cmd+Shift+P. Tapez « memory » et choisissez Show Memory, ou « performance monitor » et choisissez Show Performance monitor.
- Esc ouvre et ferme le drawer du bas, avec la Console. Vous voyez ainsi la console à côté de n’importe quel autre panneau.
S’exercer sur cette page
Gardez DevTools ouvert à côté de la page. Chaque carte dit ce que vous appuyez ici et ce que vous cherchez là-bas.
Elements
Cliquez sur l’icône d’inspection dans le coin de DevTools (ou Ctrl+Shift+C / Cmd+Shift+C) puis sur le texte gris à côté du bouton. Appuyez ensuite plusieurs fois sur +1 : dans Elements, l’attribut data-clicks clignote à chaque changement.
Console
Appuyez sur le bouton, puis tapez atlas dans le champ Filter de la Console. Cliquez sur la flèche devant l’objet pour le déplier.
Network
Dans Network, choisissez le filtre Fetch/XHR et appuyez sur le bouton. Une ligne robots.txt?atlas-lab=1 apparaît. Cliquez dessus et parcourez Headers, Response et Timing.
Réglez le throttling sur Slow 4G et envoyez de nouveau : le temps augmente, et Timing montre où il passe.
Application
Enregistrez un texte, puis ouvrez Application → Storage → Local storage → l’adresse du site. Double-cliquez sur la valeur de la clé atlas-devtools-lab, modifiez-la, puis appuyez sur Relire.
Ce qu’il y a maintenant dans localStorage : null
La clé atlas-progress s’y trouve aussi : votre progression dans les leçons, gardée uniquement dans votre navigateur.
Elements : ce qu’Angular a rendu
Elements montre le DOM tel qu’il est maintenant, pas le HTML envoyé par le serveur. Quelques traces qu’Angular y laisse :
- L’élément racine (
<app-root>) porte un attributng-versionavec la version exacte d’Angular. Sur ce site :22.2.2. - Les attributs
_nghost-ng-c…et_ngcontent-ng-c…viennent de l’encapsulation des styles (mode Emulated). Dans le volet Styles à droite, les sélecteurs ressemblent à.btn[_ngcontent-ng-c…]. - Les commentaires vides
<!---->sont les ancres d’Angular pour@if,@foret@defer: l’endroit où il insère ou retire du contenu. - L’élément sélectionné est disponible dans la Console sous le nom
$0. Les attributs et le texte qui changent clignotent un instant dans Elements : c’est ainsi que vous voyez ce qu’Angular met à jour.
Console : les utilitaires ng (développement uniquement)
Dans votre application lancée avec ng serve, Angular place un objet global ng dans la page. Sélectionnez un élément dans Elements, puis dans la Console :
// Elements : sélectionnez un élément ; dans la Console c’est $0 (développement uniquement)
ng.getComponent($0) // le composant dont $0 est l’hôte
ng.getOwningComponent($0) // le composant dont le template contient $0
ng.getDirectives($0) // les directives sur $0
ng.getInjector($0) // l’injecteur de l’élément : .get(UnService)
ng.getListeners($0) // les listeners posés par Angular sur $0
ng.getRootComponents() // les composants racines
const c = ng.getComponent($0);
c.count.set(42); // un signal s’écrit directement ; Angular rend tout seul
c.title = 'Test'; // une propriété simple a besoin d’applyChanges
ng.applyChanges(c);Sur un build de production, ces fonctions n’existent pas. Ce n’est pas un bug : elles sont retirées exprès pour ne pas alourdir l’application.
Network : ce que l’application demande
Network n’enregistre que tant qu’il est ouvert. Si vous l’ouvrez après le chargement de la page, rechargez-la.
- Les filtres en haut (Fetch/XHR, JS, CSS, Img…) et le champ texte ne laissent que les requêtes qui vous intéressent.
- Cliquez sur une requête : Headers (URL, statut, en-têtes), Payload (ce que vous avez envoyé), Preview et Response (ce qui est revenu), Initiator (le code qui l’a lancée), Timing (où le temps est passé).
- Keep log (dans les anciennes versions : Preserve log) garde la liste à la navigation et au rechargement. Disable cache contourne le cache tant que DevTools est ouvert.
- Le menu Throttling simule un réseau plus lent : Fast 4G, Slow 4G, 3G ou Offline. Vous voyez ainsi les skeletons, les états de chargement et ce qui se passe sans réseau.
Application : ce que l’application garde dans le navigateur
- Storage → Local storage / Session storage → l’adresse du site : les clés et valeurs, que vous pouvez modifier ou supprimer.
- Cookies, IndexedDB et Cache storage sont au même endroit. Cache storage est l’endroit où un Service Worker garde les fichiers pour le hors-ligne.
- La section Service workers montre le worker actif. Update on reload force la nouvelle version à chaque rechargement, et Bypass for network le contourne. Les deux sont pratiques pendant que vous travaillez dessus.
- Storage → Clear site data efface tout ce que le site a enregistré. C’est le moyen le plus sûr de tester une « première visite ».
Performance monitor : la vérification rapide
Avant tout snapshot, regardez les chiffres en direct :
- Menu de commandes (Ctrl/Cmd+Shift+P) → « performance monitor » → Show Performance monitor. Il s’ouvre en bas, dans le drawer.
- Surveillez JS heap size, DOM nodes et JS event listeners. Un clic sur un nom affiche ou masque sa courbe.
- Dans le laboratoire ci-dessous, correctifs décochés, appuyez sur Ouvrir et fermer 10 fois. JS event listeners augmente de 10 et y reste. Appuyez sur Nettoyer les zombies : il redescend. Avec tous les correctifs cochés, il n’augmente pas du tout.
Memory : une fuite trouvée pas à pas
Le laboratoire de la leçon sur les fuites mémoire, ici, pour que vous ayez quelque chose à mesurer. Chaque widget fermé avec les correctifs décochés laisse derrière lui un timer, un listener et un abonnement qui gardent le composant en mémoire.
Aucun widget sur la page.
- détruits, encore en vie
- 0
- mémoire retenue
- 0.00 MB
- travail des zombies
- 0/s
- abonnements
- 0
- timers
- 0
- listeners
- 0
- widgets créés
- 0
Heap snapshot et Comparison
- Ouvrez le panneau Memory. Sous Select profiling type, choisissez Heap snapshot.
- Cliquez sur l’icône de corbeille, Collect garbage, puis sur Take snapshot. Snapshot 1 apparaît à gauche.
- Sur la page, correctifs décochés, appuyez sur Ouvrir et fermer 10 fois et attendez la fin.
- De nouveau Collect garbage et Take snapshot : Snapshot 2 apparaît.
- Snapshot 2 sélectionné, passez le premier menu de la barre du haut de Summary à Comparison. Le menu voisin indique avec quoi vous comparez : Snapshot 1.
- Tapez un nom du tableau ci-dessous dans Filter by class et regardez les colonnes # New et # Delta.
- Appuyez sur Nettoyer les zombies, prenez Snapshot 3 et comparez-le à Snapshot 2 : les mêmes lignes apparaissent maintenant sous # Deleted.
| Filter by class | # Delta | Ce que cela signifie |
|---|---|---|
app-leaky-widget | +10 | Les éléments hôtes des 10 widgets, retirés de la page mais toujours gardés en mémoire. Visible aussi sur le site publié. |
DOMTimer | +10 | Les 10 setInterval qui tournent encore. C’est un type natif du navigateur, donc le nom reste lisible en production aussi. |
EventListener | +10 | Les listeners ajoutés sur document et jamais retirés. |
LeakyWidget | +10 | La classe du composant. N’apparaît qu’en développement (en général sous la forme _LeakyWidget). En production le nom est minifié : là, cherchez par balise. |
Qui garde l’objet : Retainers
Dépliez une ligne et cliquez sur une instance. Le volet Retainers en bas montre qui la garde en vie : les lignes du haut sont les références directes, et en les dépliant vous remontez la chaîne vers quelque chose qui vit longtemps (Window, un listener, un timer). La colonne Distance indique à combien d’étapes se trouve window. La fuite, c’est le maillon que votre code aurait dû rompre à la destruction.
Plus direct : Detached elements
- Dans Memory → Select profiling type, choisissez Detached elements.
- Répétez l’action sur la page, puis appuyez sur Get detached elements.
- La liste montre les éléments retirés de la page mais encore référencés depuis JavaScript. Ici : un
<app-leaky-widget>par widget fermé.
console.log ou un résultat dans la Console restent en mémoire tant que DevTools en a besoin. Si un snapshot montre encore des objets après le nettoyage, videz la console (l’icône de cercle barré, ou Ctrl+L, sur Mac Cmd+K), sélectionnez un autre élément et recommencez. Dans Summary, le filtre Objects retained by DevTools Console montre exactement ces objets.Performance : ce qui se passe dans le temps
- Record enregistre pendant que vous faites quelque chose sur la page. Record and reload recharge la page et enregistre le démarrage.
- Cochez Show memory timeline pour voir le heap JS, les documents, les nœuds et les listeners sur le même axe. Une fuite ressemble à un escalier qui monte et ne redescend jamais.
- En développement, Angular peut ajouter sa propre piste Angular, avec composants, change detection et hooks. Activez-la avec
ng.enableProfiling()dans la Console, avant Record.
// dans la Console, dans votre application lancée avec ng serve :
ng.enableProfiling();
// ou dans main.ts, pour capter aussi le démarrage :
import { enableProfiling } from '@angular/core';
enableProfiling();
bootstrapApplication(App, appConfig);Angular DevTools
L’extension voit l’application comme Angular la voit : composants, inputs, signals, injecteurs, routes.
- Installez Angular DevTools depuis le Chrome Web Store (il existe aussi pour Firefox).
- Lancez votre application avec
ng serve, ouvrez DevTools et cherchez l’onglet Angular, éventuellement sous ». Les extensions ne tournent pas sur la page « Nouvel onglet » du navigateur. - Sur un build de production, ce site compris, vous verrez seulement le message « We detected an application built with production configuration ». C’est normal.
| Onglet | Ce que vous voyez |
|---|---|
| Components | L’arbre des composants et directives, y compris les blocs @defer. Cliquez sur un composant : inputs, outputs et propriétés à droite. Clic droit sur une valeur pour la modifier. |
| Profiler | Chaque cycle de change detection sous forme de barre ; plus elle est haute, plus il a duré. On démarre avec le cercle en haut à gauche (Start recording). La case Change detection montre quels composants ont réellement été vérifiés. |
| Injector Tree | La hiérarchie des injecteurs d’environnement et d’élément et le chemin que suit la recherche d’une dépendance (Angular 17+). |
| Router Tree | L’arbre des routes : path, composant, guards, resolvers, lazy ou non, laquelle est active. |
$ng0dans la Console est le composant sélectionné dans Angular DevTools,$ng1le précédent.- L’icône d’inspection dans le coin de l’extension : survolez la page et voyez quel composant s’y trouve.
- Un double-clic sur un composant vous mène à son élément dans Elements ; l’icône en haut à droite, à sa source dans Sources.
- Show Signal Graph, en tête du volet des propriétés, dessine les signals, computeds et effects du composant et qui lit qui (Angular 19+). Donnez-leur un
debugNamepour qu’ils aient des noms lisibles.
Les sources habituelles de fuites et comment fermer chacune sont dans Fuites mémoire. Que faire une fois trouvé ce qui est lent : Performance et Change detection.
Pièges fréquents
- Chercher le nom de votre classe sur un build de production. Il n’y est pas : cherchez par balise ou type natif, ou lancez l’application avec
ng serve. - Comparer des snapshots sans Collect garbage avant : le heap monte et descend tout seul, et les petites différences ne veulent rien dire.
- Répéter l’action une seule fois. Une fuite est un nombre qui augmente du même pas à chaque répétition. Répétez 10 fois et cherchez +10.
- Ouvrir Network après le chargement de la page et croire que rien n’a été demandé. Network n’enregistre que tant qu’il est ouvert : rechargez la page.
Aide-mémoire
F12 · Ctrl+Shift+I · Cmd+Option+I ouvrir DevTools
Ctrl+Shift+C · Cmd+Shift+C choisir un élément dans la page
Ctrl+Shift+P · Cmd+Shift+P le menu de commandes
Esc le drawer avec la Console
Network Fetch/XHR · Keep log · Disable cache · Throttling
Application Storage → Local storage · Service workers · Clear site data
Perf monitor JS heap size · DOM nodes · JS event listeners
Memory Heap snapshot → Take snapshot → Comparison → Filter by class
Memory Detached elements → Get detached elements
Performance Record · Record and reload · Show memory timeline
développement uniquement :
ng.getComponent($0) · ng.applyChanges(c) · ng.enableProfiling()
Angular DevTools: Components · Profiler · Injector Tree · Router Tree · $ng0