Pendant des années, le paysage de la performance frontend a été dominé par deux géants : Largest Contentful Paint (LCP) pour la vitesse de chargement et Cumulative Layout Shift (CLS) pour la stabilité visuelle. Bien que ces métriques restent critiques, la transition de Google de First Input Delay (FID) à Interaction to Next Paint (INP) a fondamentalement déplacé l'accent vers l'interactivité. L'INP mesure la réactivité d'une page aux entrées utilisateur tout au long de la durée d'une visite, ce qui en fait un indicateur plus holistique de l'expérience utilisateur. En tant que développeurs, nous devons désormais regarder au-delà de la simple vitesse de rendu et plonger dans le monde complexe de la latence d'interaction.
Comprendre le passage à l'INP
Contrairement au FID, qui ne mesurait que la première interaction, l'INP prend en compte toutes les interactions qu'un utilisateur a avec la page, y compris les clics, les tapotements et les saisies au clavier. Il rapporte le 98e centile (p98) de toutes les latences d'interaction. Cela signifie que même si une page se charge instantanément, une modale lente ou un menu déroulant figé peut faire chuter votre score. Pour optimiser l'INP, nous devons comprendre les phases d'un événement : le délai d'entrée, le temps de traitement et le délai de présentation. L'objectif est de minimiser le temps total entre l'action de l'utilisateur et le retour visuel à l'écran.
Stratégies pour réduire le délai d'entrée
Le délai d'entrée est principalement causé par des tâches d'exécution JavaScript longues qui bloquent le thread principal. Lorsque le navigateur est occupé à analyser un gros script ou à effectuer des calculs lourds, il ne peut pas traiter les événements utilisateur. La stratégie la plus efficace ici est le fractionnement des tâches. En divisant les longues tâches en petits chunks à l'aide de techniques comme requestAnimationFrame ou setTimeout, nous permettons au navigateur de prioriser les interactions utilisateur.
// Mauvais : Bloquer le thread principal avec un calcul lourd
function processHeavyData(data) {
const results = [];
for (let i = 0; i < data.length; i++) {
// Cette boucle bloque l'interface utilisateur pendant l'exécution
results.push(computeExpensiveValue(data[i]));
}
return results;
}
// Bon : Utiliser des Web Workers pour décharger le calcul lourd
const worker = new Worker('computation-worker.js');
worker.postMessage(data);
worker.onmessage = (e) => {
updateUI(e.data);
};
Décharger le calcul lourd vers des Web Workers est l'un des changements les plus impactants que vous puissiez faire. Les workers s'exécutent dans un thread séparé, garantissant que votre thread principal reste réactif aux entrées utilisateur. Pour les tâches plus simples, reporter l'exécution du JavaScript non critique jusqu'après le premier rendu peut également réduire significativement le délai d'entrée pendant le chemin de rendu critique.
Optimisation du délai de présentation
Une fois l'événement traité, le navigateur doit peindre le résultat. Le délai de présentation devient un problème lorsque le navigateur est occupé à rendre ou lorsque les animations CSS entrent en conflit avec les interactions utilisateur. Un piège courant consiste à utiliser des propriétés CSS lourdes qui déclenchent des opérations de mise en page ou de composition coûteuses, comme l'animation de la largeur ou de la hauteur au lieu de la transformation. De plus, garantir que votre CSS critique est intégré en ligne et non bloquant aide le navigateur à peindre plus rapidement.
Un autre aspect crucial est la réduction de la taille de vos bundles JavaScript. Des bundles volumineux augmentent le temps passé à analyser et compiler le JavaScript, ce qui retarde à la fois le LCP et les interactions ultérieures. La mise en œuvre du fractionnement de code et du chargement différé pour les composants non critiques garantit que seul le code nécessaire est chargé lorsque cela est nécessaire, laissant plus de puissance de traitement disponible pour les interactions utilisateur immédiates.
Surveillance et débogage de l'INP
Tester l'INP nécessite plus que de simplement regarder les scores de Lighthouse isolément. Lighthouse fournit une capture instantanée, mais les performances réelles varient selon les appareils et les conditions réseau. Utilisez l'API PerformanceObserver dans la console du navigateur pour suivre les interactions en temps réel. Cela vous permet d'identifier les interactions spécifiques qui causent des pics de latence.
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log(`Interaction : ${entry.name}, Durée : ${entry.duration}ms`);
}
});
observer.observe({ entryTypes: ['event'] });
En analysant ces journaux, vous pouvez identifier quels événements DOM sont lents et enquêter sur les gestionnaires JavaScript associés. Les points d'arrêt des écouteurs d'événements de Chrome DevTools sont également inestimables pour diagnostiquer pourquoi une interaction particulière prend trop de temps à être traitée.
Conclusion
L'optimisation pour l'INP représente une maturation dans l'ingénierie de la performance web. Il ne suffit plus de construire des pages rapides ; nous devons construire des pages réactives. En comprenant la mécanique de la latence d'interaction et en employant des techniques comme le fractionnement des tâches, les Web Workers et l'optimisation des bundles, les développeurs peuvent offrir des expériences fluides qui ravissent les utilisateurs et satisfont les algorithmes des moteurs de recherche. À mesure que les applications web deviennent plus complexes, la gestion proactive du thread principal restera un différenciateur clé entre les expériences web moyennes et exceptionnelles.