Cómo Trendyol redujo el INP en un 50%, lo que generó un aumento del 1% en la tasa de clics

Este caso de éxito describe un flujo de trabajo paso a paso de depuración y mejora de INP en React, utilizado por Trendyol aprovechando herramientas de Google como PageSpeed Insights (PSI), Herramientas para desarrolladores de Chrome y la API de scheduler.yield.

Dos componentes fundamentales de cualquier sitio web de comercio electrónico son la página de ficha de producto (PLP) y la página de detalles del producto (PDP). El tráfico de comercio electrónico suele provenir de las páginas de fichas de productos, ya sea a través de campañas por correo electrónico, redes sociales publicidad. Por eso, es fundamental garantizar que la experiencia de PLP diseñados cuidadosamente para reducir el tiempo que lleva realizar una compra. Priorización la calidad de la experiencia del usuario es esencial para lograr el éxito. Publicaciones de investigación como Milliseconds Make Millions ya revelaron la importancia del rendimiento web en las redes voluntad de gastar dinero e interactuar con marcas en línea.

Trendyol es una plataforma de comercio electrónico con alrededor de 30 millones de clientes y 240,000 vendedores, lo que nos impulsó a convertirnos en la primera empresa en Türkiye con una valoración de más de $10, 000 millones y es una de las principales plataformas de comercio electrónico de del mundo.

Para lograr su objetivo de proporcionar la mejor experiencia del usuario posible a gran escala sin perder la flexibilidad del contenido y trabajar con una versión anterior de en React, Trendyol se centró en Interaction to Next Paint (INP) como métrica clave para que puedes mejorar. Este caso de éxito describe el recorrido de Trendyol para mejorar INP en su PLP, lo que generó una reducción del 50% del INP y un aumento del 1% en la búsqueda métrica comercial del resultado.

Proceso de investigación de INP de Trendyol

INP mide la capacidad de respuesta de un sitio web a la entrada del usuario. Un buen INP indica que el navegador pueda responder de forma rápida y confiable a todas las entradas del usuario y volver a pintar la página, lo que es un componente clave para una buena experiencia del usuario.

El recorrido de Trendyol para mejorar el INP en su PLP comenzó con un análisis exhaustivo la experiencia del usuario antes de realizar cualquier mejora. Según un informe de PSI, la experiencia real del usuario del PLP tuvo un INP de 963 milisegundos móvil, como se muestra en la siguiente figura.

INP de Trendyol según la lectura de CrUX en PageSpeed Insights El INP de Trendyol al 5 de septiembre de 2023 era de 963 milisegundos, que se encuentra del rango de destino de la ruta.
INP de Trendyol al 5 de septiembre de 2023 de PSI.

Para garantizar una buena capacidad de respuesta, los propietarios de los sitios deben tener como objetivo un INP menor o con 200 milisegundos, lo que significa que, en ese momento, el INP de Trendyol estaba “deficiente” del rango de destino de la ruta.

Afortunadamente, PSI proporciona datos de ambos campos para las páginas incluidas en la página de usuarios de Chrome Experience Report (CrUX) y datos de diagnóstico de laboratorio detallados Revisar el lab datos, la auditoría de tiempo de ejecución de JavaScript de Lighthouse sugirió que La secuencia de comandos search-result-v2 estuvo ocupando el subproceso principal durante más tiempo que otro secuencias de comandos en la página.

Lectura de fuentes de tareas largas en Lighthouse para el sitio web de Trendyol. Una de las principales fuentes de tareas largas es una secuencia de comandos que controla los resultados de la búsqueda en el PLP de Trendyol.
Auditoría de tiempo de ejecución de JavaScript de Trendyol de Lighthouse en septiembre de PSI el 5 de enero de 2023.

Para identificar los cuellos de botella del mundo real, usamos el panel de rendimiento de Chrome. Herramientas para desarrolladores para solucionar problemas relacionados con la experiencia de PLP e identificar el origen del error problema. Emulación del rendimiento en dispositivos móviles con una demora de CPU 4 veces mayor en las Herramientas para desarrolladores de Chrome reveló una tarea de 700 a 900 milisegundos de duración en el subproceso principal. Si el código principal subproceso esté ocupado con otras tareas durante más de 50 milisegundos, puede no podremos responder a la entrada del usuario de manera oportuna, lo que resulta en un la experiencia del usuario.

Captura de pantalla de una sesión de generación de perfiles de rendimiento en las Herramientas para desarrolladores de Chrome para el PLP de Trendyol. La tarea larga representada se ejecuta durante 737.6 milisegundos y forma parte de una devolución de llamada de Intersection Observer.
Un generador de perfiles de rendimiento de tareas largas en el PLP de Trendyol en relación con el rendimiento en Herramientas para desarrolladores de Chrome.

La tarea más larga fue causada por una devolución de llamada de la API de Intersection Observer en el secuencia de comandos de resultados de la búsqueda dentro de un componente de React. En este punto, empezamos dividir esa tarea larga en fragmentos pequeños para darle al navegador más oportunidades para responder al trabajo de mayor prioridad, incluidas las interacciones de los usuarios.

Resulta que usar la operación setState, que activa React la renderización en la devolución de llamada Intersection Observer tiene un costo alto lo que puede causar problemas para los dispositivos de gama baja, ya que ocupa el subproceso principal demasiado extenso.

Un método que los desarrolladores han usado para dividir las tareas en otras más pequeñas incluye setTimeout. Utilizamos esta técnica para posponer la ejecución de la setState en una tarea separada. Si bien setTimeout permite diferir la ejecución de JavaScript, no proporciona ningún control sobre la prioridad. Esto llevó a unirnos a la prueba de origen de scheduler.yield con el fin de garantizar la continuación de la ejecución de nuestra secuencia de comandos después de ceder al subproceso 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 });

Agregar este método de rendimiento al código PLP dio como resultado un INP mejorado, ya que el la tarea larga principal se dividió en una serie de otras más pequeñas, lo que permite trabajo de mayor prioridad, como las interacciones del usuario y el trabajo de renderización posterior, para se lleven a cabo antes de lo que hubieran ocurrido en otras circunstancias.

Captura de pantalla de una sesión de generación de perfiles de rendimiento en las Herramientas para desarrolladores de Chrome para el PLP de Trendyol. La tarea larga que antes se ejecutaba durante 737.6 milisegundos ahora se divide en varias tareas más pequeñas.
Se dividió la tarea en otras más pequeñas.

Ten en cuenta que Trendyol usa el framework PuzzleJs para implementar un microfrontend de Terraform con React v16.9.0. Con React 18, el mismo rendimiento podría verse conseguido, pero por varias razones, Trendyol no puede actualizarse con esta tiempo.

Resultados empresariales

Para medir el impacto de la mejora de INP implementada, ejecutamos una prueba A/B para ver cómo se vieron afectadas las métricas empresariales. En general, los cambios en el PLP dieron lugar a en una mejora significativa, incluida una reducción del 50% en el INP y una reducción del 1% de aumento en las tasas de clics de la página de fichas a la página de detalles del producto por sesión de usuario. En la siguiente imagen, se puede ver cómo INP mejoró la PLP a lo largo del tiempo:

Captura de pantalla del INP del percentil 75 de Trendyol en el transcurso de seis meses. A finales de los seis meses, el INP de Trendyol disminuyó a casi 650 milisegundos, de casi 1,400 milisegundos.
Mejoras en el percentil 75 de INP con el tiempo.

Conclusión

La optimización del INP es un proceso iterativo y complejo, pero se puede facilitar con un flujo de trabajo claro. Un enfoque simple para depurar y mejorar tu del INP de tu sitio web depende de si recopilas tus propios datos de campo. Si PSI y Lighthouse son un buen punto de partida. Una vez que hayas identificado páginas con problemas, puedes usar Herramientas para desarrolladores para profundizar en el intento de reproducir problemas.

ceder al subproceso principal de vez en cuando para darle al navegador más las oportunidades para hacer trabajos urgentes harán que tu sitio web sea más responsivo, lo que garantizará para que tus clientes tengan una mejor experiencia del usuario. APIs de programación más nuevas como scheduler.yield() facilitan esta tarea.

Agradecimientos especiales a Jeremy Wagner, Barry Pollard y Houssein Djirdeh del Google y el equipo de Ingeniería de Trendyol por su contribución a este trabajo.