Découvrez comment Trendyol a réduit l'INP de 50%, ce qui a entraîné une augmentation de 1% du taux de clics

Cette étude de cas décrit un workflow étape par étape de débogage et d'amélioration de l'INP dans React. Il est utilisé par Trendyol à l'aide d'outils Google tels que PageSpeed Insights (PSI), les Outils pour les développeurs Chrome et l'API scheduler.yield.

La page de liste de produits (PLP) et la page d'informations sur les produits (PDP) sont deux composants essentiels de tout site Web d'e-commerce. Le trafic de l'e-commerce provient souvent des pages d'offres de produits, que ce soit par le biais de campagnes par e-mail, de réseaux sociaux ou de publicités. Il est donc essentiel de s'assurer que l'expérience de la page produit est soigneusement conçue pour réduire le temps nécessaire à l'achat. Prioriser la qualité de l'expérience utilisateur est essentiel pour réussir. Des publications de recherche telles que Milliseconds Make Millions ont déjà révélé l'impact significatif des performances Web sur la volonté des consommateurs de dépenser de l'argent et d'interagir avec les marques en ligne.

Trendyol est une plate-forme d'e-commerce qui compte environ 30 millions de clients et 240 000 vendeurs. Elle nous a propulsés au rang de première entreprise turque valorisée à plus de 10 milliards de dollars et de l'une des principales plates-formes d'e-commerce au monde.

Pour atteindre son objectif d'offrir la meilleure expérience utilisateur possible à grande échelle tout en conservant la flexibilité du contenu et en travaillant avec une ancienne version de React, Trendyol s'est concentré sur l'Interaction to Next Paint (INP) comme métrique clé à améliorer. Cette étude de cas décrit le parcours de Trendyol pour améliorer l'INP sur sa page produit linéaire, ce qui a permis de réduire l'INP de 50 % et d'augmenter de 1 % la métrique commerciale des résultats de recherche.

Processus d'investigation de l'INP de Trendyol

INP mesure la réactivité d'un site Web aux entrées utilisateur. Un bon INP indique que le navigateur est capable de répondre rapidement et de manière fiable à toutes les entrées utilisateur et de repeindre la page, ce qui est un élément clé d'une bonne expérience utilisateur.

Le parcours de Trendyol visant à améliorer l'INP sur sa page produit a commencé par une analyse approfondie de l'expérience utilisateur avant toute amélioration. D'après un rapport PSI, l'expérience utilisateur réelle de la PLP a enregistré un INP de 963 millisecondes sur mobile, comme illustré dans la figure suivante.

INP de Trendyol selon la lecture CrUX dans PageSpeed Insights. Au 5 septembre 2023, l'INP de Trendyol était de 963 millisecondes, ce qui se situe dans la plage "faible".
INP de Trendyol au 5 septembre 2023, selon PSI.

Pour garantir une bonne réactivité, les propriétaires de sites doivent viser un INP inférieur ou égal à 200 millisecondes. À ce moment-là, l'INP de Trendyol était dans la catégorie "médiocre".

Heureusement, PSI fournit à la fois des données sur le terrain pour les pages incluses dans le rapport d'expérience utilisateur Chrome (CrUX) et des données de diagnostic détaillées en laboratoire. En examinant les données de l'atelier, l'audit du temps d'exécution JavaScript de Lighthouse suggère que le script search-result-v2 occupe plus de temps dans le thread principal que les autres scripts de la page.

Affichage des sources de tâches longues dans Lighthouse pour le site Web Trendyol. L'une des principales sources de longues tâches est un script qui gère les résultats de recherche sur PLP de Trendyol.
Audit du temps d'exécution JavaScript de Trendyol effectué par Lighthouse, au 5 septembre 2023 par PSI.

Pour identifier les goulots d'étranglement réels, nous avons utilisé le panneau des performances dans Chrome DevTools pour résoudre les problèmes liés à l'expérience PLP et identifier la source du problème. L'émulation des performances mobiles avec un ralentissement du processeur de 4 fois dans les outils de développement Chrome a révélé une tâche de 700 à 900 millisecondes sur le thread principal. Si le thread principal est occupé par d'autres tâches pendant plus de 50 millisecondes, il risque de ne pas pouvoir répondre à l'entrée utilisateur dans les meilleurs délais, ce qui entraînera une mauvaise expérience utilisateur.

Capture d'écran d'une session de profilage des performances dans les outils pour les développeurs Chrome pour PLP de Trendyol. La tâche longue représentée s'exécute pendant 737,6 millisecondes et fait partie d'un rappel Intersection Observer.
Profileur de performances des longues tâches sur le PLP de Trendyol dans le panneau des performances des outils pour les développeurs Chrome.

La tâche la plus longue a été causée par un rappel de l'API Intersection Observer sur le script des résultats de recherche dans un composant React. À ce stade, nous avons commencé à diviser cette longue tâche en petits blocs pour donner au navigateur plus d'occasions de répondre à des tâches de priorité plus élevée, y compris les interactions utilisateur.

Il s'avère que l'utilisation de l'opération setState qui déclenche le rerendu React dans le rappel de l'observateur d'intersection est coûteuse, ce qui peut poser problème pour les appareils bas de gamme en occupant le thread principal trop longtemps.

Une méthode utilisée par les développeurs pour décomposer des tâches en tâches plus petites implique setTimeout. Nous avons utilisé cette technique pour différer l'exécution de l'appel setState dans une tâche distincte. Bien que setTimeout permette de différer l'exécution JavaScript, il ne permet pas de contrôler la priorité. Cela nous a amenés à participer à la phase d'évaluation de scheduler.yield afin de garantir la poursuite de l'exécution de notre script après avoir cédé au thread principal:

/*
* Yielding method using scheduler.yield, falling back to setTimeout:
*/
async function yieldToMain() {
  if('scheduler' in window && 'yield' in scheduler) {
    return await scheduler.yield();
  }

  return new Promise(resolve => {
    setTimeout(resolve, 0);
  });
}

/*
* Yielding to the main thread before changing the state of the component:
*/
const observer = new IntersectionObserver((entries) => {
  entries.forEach(handleIntersection);
  const maxNumberOfEntries = Math.max(...this.intersectingEntries);

  if (Number.isFinite(maxNumberOfEntries)) {
    await this.yieldToMain();

    this.setState({ count: maxNumberOfEntries });
  }
}, { threshold: 0.5 });

L'ajout de cette méthode de rendement au code PLP a permis d'améliorer l'INP, car la tâche longue principale a été divisée en une série de tâches plus petites, ce qui permet d'effectuer des tâches plus prioritaires, telles que les interactions des utilisateurs et les tâches d'affichage ultérieures, plus tôt qu'elles ne l'auraient fait autrement.

Capture d'écran d'une session de profilage des performances dans Chrome DevTools pour la page produit détaillée de Trendyol. La tâche longue qui s'exécutait auparavant pendant 737,6 millisecondes est désormais divisée en plusieurs tâches plus petites.
La tâche est divisée en tâches plus petites.

Notez que Trendyol utilise le framework PuzzleJs pour implémenter une architecture de micro-interface à l'aide de React v16.9.0. Avec React 18, les mêmes performances pourraient être obtenues, mais pour un certain nombre de raisons, Trendyol ne peut pas effectuer la mise à niveau pour le moment.

Résultats commerciaux

Pour mesurer l'impact de l'amélioration de l'INP mise en œuvre, nous avons effectué un test A/B afin de voir comment les métriques commerciales étaient affectées. Globalement, nos modifications de la page produit ont entraîné une amélioration significative, avec une réduction de 50 % du taux d'inactivité et une augmentation de 1 % du taux de clics de la page de fiches vers la page d'informations détaillées sur le produit par session utilisateur. La figure suivante montre comment INP s'est amélioré sur le PLP au fil du temps:

Capture d'écran de l'INP au 75e centile de Trendyol sur six mois. À la fin de la période de six mois, l'INP de Trendyol est passé de près de 1 400 millisecondes à près de 650 millisecondes.
Améliorations de l'INP au 75e centile au fil du temps.

Conclusion

L'optimisation de l'INP est un processus complexe et itératif, mais elle peut être facilitée par un workflow clair. Une approche simple pour déboguer et améliorer l'INP de votre site Web dépend de la collecte de vos propres données sur le terrain. Si ce n'est pas le cas, PSI et Lighthouse sont un bon point de départ. Une fois que vous avez identifié les pages présentant des problèmes, vous pouvez utiliser les outils de développement pour aller plus loin et tenter de les reproduire.

En cédant de temps en temps au thread principal pour permettre au navigateur d'effectuer des tâches urgentes, vous améliorerez la réactivité de votre site Web et vous offrirez une meilleure expérience utilisateur à vos clients. Les API de planification plus récentes, comme scheduler.yield(), facilitent cette tâche.

Nous remercions tout particulièrement Jeremy Wagner, Barry Pollard et Houssein Djirdeh de Google, ainsi que l'équipe d'ingénierie de Trendyol pour leur contribution à ce travail.