Mesurer le chargement avec les API Navigation et Resource Timing
Collectez des données réelles de performance avec les API Navigation Timing et Resource Timing, et diagnostiquez la vitesse vécue par vos visiteurs.
Les outils de laboratoire comme Lighthouse ou la limitation de connexion des outils pour développeurs sont précieux pour comparer des optimisations dans des conditions stables. Mais ils ne disent rien de la vitesse réellement vécue par vos visiteurs, sur leurs appareils et leurs réseaux. Pour cela, il faut des données de terrain, c’est-à-dire des mesures collectées directement chez les utilisateurs pendant qu’ils naviguent.
Les API Navigation Timing et Resource Timing donnent accès à ces durées dans le navigateur, en JavaScript. Pour le SEO, l’enjeu est direct : ces mesures alimentent vos Core Web Vitals de terrain, que vous pouvez ainsi mesurer sur le terrain, et vous aident à repérer précisément ce qui ralentit le chargement, là où les tests synthétiques restent muets. Vous passez du ressenti à la donnée chiffrée.
Lighthouse compare des optimisations dans des conditions stables, mais il ne vous dira jamais ce que vivent vos vrais utilisateurs : pour ça, il faut des données de terrain. Les API Navigation Timing et Resource Timing donnent accès à ces durées directement dans le navigateur, ce qui alimente vos Core Web Vitals avec du concret. Mon conseil, c’est de collecter ces mesures sans pour autant pénaliser la page que vous instrumentez.
Deux API complémentaires pour le terrain
Navigation Timing et Resource Timing se ressemblent beaucoup mais ne mesurent pas la même chose. La première décrit la requête du document HTML lui-même, c’est-à-dire la navigation vers la page. La seconde décrit chaque ressource dépendante : fichiers CSS, JavaScript, images, polices et autres. Les deux exposent leurs durées dans un tampon de performances que vous interrogez avec JavaScript.
// Récupérer les entrées Navigation Timing :
performance.getEntriesByType('navigation');
// Récupérer les entrées Resource Timing :
performance.getEntriesByType('resource');
Le cycle de vie d'une requête réseau
Une requête réseau passe par des phases distinctes : résolution DNS, négociation de la connexion (avec la poignée de main TLS en HTTPS), envoi de la requête puis réception de la réponse. Ce délai avant le premier octet correspond de près au TTFB, et savoir comprendre et mesurer le TTFB aide à isoler la part serveur du ralentissement. Chaque phase est exposée sous forme d’horodatage haute résolution. En soustrayant le début de la fin d’une phase, vous obtenez sa durée. Attention toutefois : certaines valeurs peuvent valoir zéro, par exemple lorsque le DNS provient d’un cache local ou pour les ressources d’autres origines qui n’autorisent pas le partage des durées.
| Propriété | Phase mesurée | Ce qu'elle révèle |
|---|---|---|
domainLookupStart / domainLookupEnd |
Résolution DNS |
Temps de traduction du domaine en adresse IP |
connectStart / connectEnd |
Négociation de connexion |
Latence d’ouverture de la connexion au serveur |
secureConnectionStart |
Poignée de main TLS |
Coût du chiffrement (vaut 0 sans HTTPS) |
requestStart / responseStart |
Requête |
Délai avant le premier octet de réponse (proche du TTFB) |
responseStart / responseEnd |
Réponse |
Durée de téléchargement de la ressource |
redirectStart / redirectEnd |
Redirections |
Latence ajoutée par les chaînes de redirection |
Collecter les durées sans pénaliser la page
Les méthodes getEntriesByType, getEntriesByName et getEntries conviennent pour une analyse ponctuelle, mais elles peuvent surcharger le thread principal si vous itérez sur de nombreuses entrées. L’approche recommandée est PerformanceObserver : il écoute les entrées au fur et à mesure et vous les transmet sans interrogation répétée. L’option buffered garantit que les entrées arrivées avant la création de l’observateur restent visibles.
const perfObserver = new PerformanceObserver((observedEntries) => {
const entries = observedEntries.getEntries();
for (let i = 0; i < entries.length; i++) {
// Traiter chaque entrée ici
}
});
perfObserver.observe({ type: 'navigation', buffered: true });
perfObserver.observe({ type: 'resource', buffered: true });
Envoyer les données pour analyse
Une fois les durées collectées, vous les transmettez à un point de terminaison pour les analyser, puis déboguer les performances sur le terrain. Privilégiez navigator.sendBeacon ou un fetch avec l’option keepalive : ces deux méthodes envoient la requête sans bloquer la page et survivent à la fermeture de l’onglet si nécessaire. Côté serveur, vous recevez une charge utile que vous pouvez décoder, traiter et stocker. Pensez à limiter le volume envoyé : transmettre l’intégralité des entrées à chaque visite serait excessif.
Les moyennes masquent l’expérience réelle et sont faussées par les valeurs extrêmes. Travaillez en centiles. Pour repérer les expériences les plus lentes (celles qui pénalisent votre SEO), concentrez-vous sur le 75e centile et au-delà : c’est cette longue traîne qui décrit vos visiteurs en difficulté, pas la valeur médiane confortable.
À faire
- collecter sur le terrain avec PerformanceObserver
- raisonner en centiles
- mesurer DNS, connexion, requête et réponse séparément
- envoyer via sendBeacon
À éviter
- se fier uniquement aux tests de laboratoire
- calculer des moyennes
- interroger le tampon en boucle sur le thread principal
- oublier l’en-tête Timing-Allow-Origin pour les ressources tierces
Points clés à retenir
- Distinguez les données de laboratoire (synthétiques) des données de terrain (utilisateurs réels)
- Utilisez Navigation Timing pour le document et Resource Timing pour les ressources
- Décomposez chaque requête en phases : DNS, connexion, requête, réponse
- Collectez avec PerformanceObserver pour préserver le thread principal
- Analysez en centiles, jamais en moyenne, et priorisez le 75e centile
Les API Timing transforment la performance ressentie en données chiffrées et exploitables.
Quiz : testez vos connaissances
Quiz : testez vos connaissances
-
Quelle différence sépare Navigation Timing et Resource Timing ?
- Navigation Timing mesure les images, Resource Timing le document HTML
- Navigation Timing décrit la requête du document HTML, Resource Timing chaque ressource dépendante
- Les deux API mesurent exactement la même chose
Navigation Timing décrit la requête du document HTML lui-même, tandis que Resource Timing décrit chaque ressource dépendante (CSS, JavaScript, images, polices).
-
Quelle approche privilégier pour collecter les durées sans surcharger le thread principal ?
- getEntries appelé en permanence sur toutes les entrées
- PerformanceObserver, qui écoute les entrées au fur et à mesure
- Une boucle qui interroge le tampon en continu
Itérer sur de nombreuses entrées avec
getEntriesByTypepeut surcharger le thread principal.PerformanceObserverécoute les entrées au fil de l’eau, ce qui est recommandé. -
Comment raisonner pour analyser la vitesse réellement vécue par vos visiteurs ?
- En se fiant uniquement aux tests de laboratoire
- En centiles, car les moyennes masquent les expériences les plus lentes
- En moyennes, plus simples et plus représentatives
Les moyennes masquent l’expérience réelle et sont faussées par les valeurs extrêmes. Travailler en centiles permet de repérer les expériences les plus lentes.
Besoin d'un accompagnement SEO ?
Vous voulez savoir ce que vivent réellement vos visiteurs en matière de vitesse ? Mettons en place une mesure terrain fiable.