Quête de l'Economic Times pour résoudre l'INP

En réduisant le TBT de 30 fois et en migrant vers Next.js, The Ecomomic Times a pu réduire l'INP de près de quatre fois, ce qui a entraîné une diminution de 50% du taux de rebond et une augmentation de 43% du nombre de pages vues.

Daya Ram Yadav
Daya Ram Yadav
Saurabh Rajpal
Saurabh Rajpal

La métrique Interaction to Next Paint (INP) évalue la réactivité d'un site Web aux entrées utilisateur. Une bonne réactivité signifie qu'une page répond rapidement aux interactions des utilisateurs. Plus l'INP d'une page est faible, plus elle est capable de répondre aux interactions des utilisateurs.

Une valeur INP de 200 millisecondes ou moins est considérée comme bonne, une valeur supérieure à 500 millisecondes comme mauvaise, et une valeur comprise entre ces deux valeurs doit être améliorée.

Le début flou

Lorsque Google a initialement lancé l'INP en tant que métrique expérimentale pouvant évoluer vers l'une des métriques Core Web Vitals, l'équipe de l'Economic Times s'est lancée dans le défi de la corriger avant qu'elle ne devienne une métrique Core Web Vitals, car offrir une expérience utilisateur de classe mondiale est essentiel à nos valeurs fondamentales.

L'INP est l'une des métriques les plus difficiles à résoudre à ce jour. Au début, il n'était pas clair comment mesurer efficacement l'INP. Le manque d'assistance de la part de la communauté a rendu la tâche plus difficile, y compris pour la plupart des fournisseurs de surveillance des utilisateurs réels (RUM, Real User Monitoring). Toutefois, nous disposions d'outils Google RUM tels que le rapport sur l'expérience utilisateur de Chrome (CrUX), la bibliothèque JavaScript web-vitals et d'autres outils qui nous ont permis de nous faire une idée de notre situation pendant que nous évaluions la voie à suivre. Au début,notre INP était proche de 1 000 millisecondes au niveau de l'origine.

Une chose est ressortie lors de la correction de l'INP dans le champ : l'une des métriques de laboratoire à cibler pourrait être le temps de blocage total (TBT). TBT était déjà bien documenté et pris en charge par la communauté. Bien que nous ayons déjà atteint les seuils des métriques Core Web Vitals, nous n'étions pas aussi performants en termes de TBT, qui était supérieur à trois secondes au début.

Qu'est-ce que le TBT et quelles mesures avons-nous prises pour l'améliorer ?

La métrique TBT est une métrique de laboratoire qui mesure la réactivité d'une page Web aux entrées utilisateur pendant le chargement de la page. Toute tâche qui prend plus de 50 millisecondes à s'exécuter est considérée comme une tâche longue. Le temps qui suit le seuil de 50 millisecondes est appelé temps de blocage.

Le TBT est calculé en additionnant le temps de blocage de toutes les tâches longues pendant le chargement de la page. Par exemple, si deux tâches longues sont exécutées pendant le chargement, le temps de blocage est déterminé comme suit:

  • La tâche A prend 80 millisecondes (30 millisecondes de plus que 50 millisecondes).
  • La tâche B prend 100 millisecondes (50 millisecondes de plus que la tâche A).

Le TBT de la page sera de 80 millisecondes (30 + 50). Plus le TBT est faible, mieux c'est. Il correle également bien avec l'INP.

Voici une comparaison rapide de notre TBT avant et après avoir pris des mesures pour l'améliorer:

Image composite des tâches longues au démarrage, comme indiqué dans le panneau "Performances" de Chrome DevTools, et rapport sur les métriques de page. Le thread principal est bloqué pendant 3 260 millisecondes lors du chargement de la page.
Le thread principal au démarrage avant l'optimisation du TBT. La valeur TBT est de 3 260 millisecondes.
Image composite des tâches longues au démarrage, comme indiqué dans le panneau "Performances" de Chrome DevTools, et rapport sur les métriques de page. Le thread principal est bloqué pendant 120 millisecondes lors du chargement de la page.
Le thread principal au démarrage après avoir optimisé le TBT. La valeur TBT est de 120 millisecondes.

Réduire le travail du thread principal

Le thread principal du navigateur gère tout, de l'analyse du code HTML, à la création du DOM, en passant par l'analyse du CSS et l'application des styles, ainsi que l'évaluation et l'exécution du code JavaScript. Le thread principal gère également les interactions des utilisateurs, c'est-à-dire les clics, les pressions et les frappes. Si le thread principal est occupé à effectuer d'autres tâches, il risque de ne pas répondre efficacement aux entrées utilisateur et de donner lieu à une expérience utilisateur saccadée.

Il s'agissait de la tâche la plus difficile pour nous, car nous utilisons nos propres algorithmes pour détecter l'identité des utilisateurs afin de diffuser des annonces en fonction de l'état de leur abonnement et de scripts tiers pour les tests A/B, les analyses, etc.

Nous avons commencé par de petits pas, comme la dépriorisation du chargement des éléments métier les moins critiques. Deuxièmement, nous avons utilisé requestIdleCallback pour les tâches non critiques, ce qui peut contribuer à réduire le temps de réponse.

if ('requestIdleCallback' in window) {
 
this.requestIdleCallbackId = requestIdleCallback(fetchMarketsData.bind(this), {timeout: 3000});
} else {
  fetchMarketsData
(); // Fallback in case requestIdleCallback is not supported
}

Il est recommandé de spécifier un délai avant expiration lorsque vous utilisez requestIdleCallback, car il s'assure que si le délai donné est écoulé et que le rappel n'a pas encore été appelé, il exécute le rappel immédiatement après le délai avant expiration.

Réduire le temps d'évaluation du script

Nous avons également chargé de manière paresseuse des bibliothèques tierces à l'aide de composants chargeables. Nous avons également supprimé le JavaScript et le CSS inutilisés en profilant la page avec l'outil de couverture dans les outils pour les développeurs Chrome. Cela nous a aidés à identifier les zones où le tree shaking était nécessaire pour expédier moins de code lors du chargement de la page et donc réduire la taille du bundle initial de l'application.

Capture d'écran de l'outil de couverture dans Chrome DevTools. Ici, l'outil affiche les parties inutilisées des fichiers JavaScript et CSS lors du chargement de la page.

Réduire la taille du DOM

D'après Lighthouse, les DOM de grande taille augmentent l'utilisation de la mémoire, entraînent des nouveaux calculs de style plus longs et génèrent des ajustements de la mise en page coûteux.

Capture d'écran de l'audit de la taille du DOM dans Lighthouse. Le nombre d'éléments DOM indiqué est de 2 706.

Nous avons réduit le nombre de nœuds DOM de deux manières:

  • Tout d'abord, nous avons affiché nos éléments de menu à la demande de l'utilisateur (lors d'un clic). La taille du DOM a été réduite d'environ 1 200 nœuds.
  • Deuxièmement, nous avons chargé de manière différée les widgets moins importants.

Grâce à tous ces efforts, nous avons considérablement réduit le temps de traitement des demandes et notre INP a diminué de près de 50%:

Capture d'écran de l'audit INP dans CrUX. L'INP de la page est de 539 millisecondes, ce qui dépasse le seuil "médiocre".

À ce stade, nous n'avions presque plus de solutions simples pour réduire davantage le TBT (et l'INP par proxy), mais nous savions que nous avions beaucoup de marge de progression. C'est alors que nous avons décidé de passer à la dernière version de React avec Next.js pour mieux utiliser les hooks et éviter le rendu inutile des composants.

En raison de mises à jour plus fréquentes et d'un trafic relativement moins important que les autres parties du site Web, nous avons commencé à migrer nos pages thématiques vers Next.js. Nous avons également utilisé PartyTown pour décharger des tâches lourdes supplémentaires du thread principal vers des workers Web, ainsi que des techniques telles que requestIdleCallBack pour différer les tâches non critiques.

En quoi l'amélioration de l'INP a-t-elle aidé The Economic Times ?

TBT et INP actuels sur l'origine

Au moment de la publication de cet article, le TBT de notre origine était de 120 millisecondes, contre 3 260 millisecondes lorsque nous avons commencé nos efforts d'optimisation. De même, l'INP de notre origine était de 257 millisecondes après nos efforts d'optimisation, contre plus de 1 000 millisecondes auparavant.

Capture d'écran de l'audit INP dans CrUX. L 'INP de la page est de 257 millisecondes, ce qui correspond au seuil d'amélioration.

Tendance INP CrUX

Le trafic reçu sur les pages de thèmes représente une part nettement plus faible du trafic global. C'est pourquoi il était idéal pour les tests. Les résultats du rapport CrUX et les résultats commerciaux ont été très encourageants. Nous avons donc étendu nos efforts à l'ensemble du site Web pour en tirer d'autres avantages.

Capture d'écran des distributions de l'INP telles que visualisées dans CrUX sur une période de quatre mois, de juillet 2022 à octobre 2022. Les valeurs des seuils "Médiocre" et "Amélioration nécessaire" ont légèrement diminué, tandis que celles du seuil "Satisfaisant" ont augmenté.

Analyse de la durée de chargement de la page avec mPulse d'Akamai

Nous utilisons Akamai mPulse comme solution RUM, qui mesure le TBT sur le terrain. Nous avons constaté une diminution constante du TBT, qui correspond clairement aux résultats de nos efforts visant à réduire l'INP. Comme le montre la capture d'écran ci-dessous, les valeurs de TBT sont finalement passées d'environ cinq secondes à environ 200 millisecondes sur le terrain.

Capture d'écran d'un graphique dans Akamai mPulse, montrant une baisse du TBT sur une période d'environ un mois.

Résultat commercial

Globalement, nos efforts pour réduire le TBT de 30 fois et notre migration vers Next.js nous ont permis de réduire l'INP de près de quatre fois, ce qui a finalement entraîné une baisse de 50% du taux de rebond et une augmentation de 43% du nombre de pages vues sur les pages de sujets.

Capture d'écran de Google Analytics comparant les pages vues au taux de rebond. Grâce aux optimisations apportées à l'INP sur le site Web de The Economic Times, le taux de rebond a diminué de 50% et le nombre de pages vues a augmenté de 43 %.

Conclusion

Pour résumer, INP a largement contribué à identifier les problèmes de performances d'exécution sur certaines parties du site Web de l'Economic Times. Elle s'est avérée être l'une des métriques les plus efficaces pour avoir un impact positif sur les résultats commerciaux. Compte tenu des chiffres très encourageants que nous avons observés grâce à ces efforts, nous sommes motivés à étendre nos efforts d'optimisation à d'autres sections de notre site Web et à en tirer des avantages supplémentaires.