Reaccionar el perfil de rendimiento de la aplicación

Hoy hablaremos sobre la medición del rendimiento de renderizar componentes React utilizando la API React Profiler. También evaluaremos las interacciones con el componente utilizando la nueva API experimental de seguimiento de interacción. Además, utilizaremos la API de sincronización del usuario para tomar nuestras propias medidas.

Utilizaremos la aplicación React Movies Queue como plataforma para experimentos.


Aplicación React Movies Queue

React Profiler API


La API React Profiler está diseñada para medir el rendimiento de representación y ayuda a identificar los cuellos de botella en el rendimiento de la aplicación.

import React, { Fragment, unstable_Profiler as Profiler} from "react";

El componente Profileracepta una devolución de llamada onRendercomo propiedad. Se llama cada vez que un componente en el árbol perfilado confirma una actualización.

const Movies = ({ movies, addToQueue }) => (
  <Fragment>
    <Profiler id="Movies" onRender={callback}>

Intentemos, para fines de prueba, medir el tiempo requerido para procesar partes de un componente Movies. Así es como se ve.


La aplicación React Movies Queue y la investigación de Películas con las

herramientas de devolución de llamada del desarrollador ReactonRender aceptan parámetros que describen lo que se procesa y el tiempo que se tarda en procesar. Esto incluye lo siguiente:

  • id: Propiedad iddel árbol de componentes Profilerpara el que se confirmó el cambio.
  • phase: o mount(si se montó el árbol) o update(si se volvió a representar el árbol).
  • actualDuration: El tiempo necesario para procesar una actualización fija.
  • baseDuration: Tiempo estimado para renderizar todo el subárbol sin almacenamiento en caché.
  • startTime: La hora en que React comenzó a procesar esta actualización.
  • commitTime: el momento en que React confirmó esta actualización.
  • interactions: Muchas "interacciones" para esta actualización.

const callback = (id, phase, actualTime, baseTime, startTime, commitTime) => {
    console.log(`${id}'s ${phase} phase:`);
    console.log(`Actual time: ${actualTime}`);
    console.log(`Base time: ${baseTime}`);
    console.log(`Start time: ${startTime}`);
    console.log(`Commit time: ${commitTime}`);
}

Cargaremos la página e iremos a la consola de Chrome Developer Tools. Allí deberíamos ver lo siguiente.


Creación de perfiles de resultados en herramientas para desarrolladores

Además, podemos abrir las herramientas para desarrolladores React, ir al marcadorProfilery visualizar información sobre el momento de la representación de componentes. A continuación se muestra una visualización de este tiempo en forma de un gráfico de llama.


Al trabajar con resultados de perfiles en React Developer Tools

, también me gusta usar el modo de vista aquíRanked, que proporciona una vista ordenada de los datos. Como resultado, los componentes que tardan más en renderizarse se encuentran en la parte superior de la lista.


Visualización de resultados de creación de perfiles en modo Clasificación.

Además, puede usar varios componentes para tomar medidas en diferentes partes de la aplicaciónProfiler:

import React, { Fragment, unstable_Profiler as Profiler} from "react";

render(
  <App>
    <Profiler id="Header" onRender={callback}>
      <Header {...props} />
    </Profiler>
    <Profiler id="Movies" onRender={callback}>
      <Movies {...props} />
    </Profiler>
  </App>
);

¿Y cómo analizar las interacciones del usuario con los componentes?

API de seguimiento de interacción


Sería bueno poder rastrear las interacciones del usuario con la interfaz de la aplicación (como clics en elementos). Esto le permitirá encontrar respuestas a preguntas interesantes como esta: "¿Cuánto tiempo llevó actualizar el DOM después de hacer clic en este botón?". Afortunadamente, React tiene soporte experimental para analizar las interacciones del usuario con la aplicación utilizando la API de seguimiento de interacción del nuevo paquete del planificador . Puedes leer la documentación aquí .

La información sobre las interacciones entre el usuario y la aplicación se proporciona con descripciones (por ejemplo, "El usuario hizo clic en el botón Agregar al carrito") y marcas de tiempo. Además, al configurar el análisis de interacciones, se utilizan devoluciones de llamada en las que se realizan acciones correspondientes a una u otra interacción.

En nuestra aplicación hay un botón Add Movie To Queueen el que se muestra el icono +. Sirve para agregar películas a la cola de visualización.


Botón para agregar una película a la cola de visualización

Aquí hay un ejemplo de código que supervisa las actualizaciones de estado para esta interacción del usuario con la aplicación:

import { unstable_Profiler as Profiler } from "react";
import { render } from "react-dom";
import { unstable_trace as trace } from "scheduler/tracing";

class MyComponent extends Component {
  addMovieButtonClick = event => {
    trace("Add To Movies Queue click", performance.now(), () => {
      this.setState({ itemAddedToQueue: true });
    });
  };
}

Podemos registrar información sobre esta interacción y conocer su duración contactando a las herramientas para desarrolladores de React.


Análisis de la interacción del usuario con un elemento de la aplicación

Con la API de seguimiento de interacción, también puede recopilar información sobre la representación del primer componente:

import { unstable_trace as trace } from "scheduler/tracing";

trace("initial render", performance.now(), () => {
   ReactDom.render(<App />, document.getElementById("app"));
});



Análisis de la primera representación del componente

El autor de la API da otros ejemplos de su uso. Por ejemplo, ilustrando el perfil de tareas asincrónicas.

Titiritero


Para la automatización de las pruebas de interacción del usuario con los elementos de la aplicación, el uso de Puppeteer puede parecer interesante . Esta es una biblioteca Node.js que proporciona acceso a una API de alto nivel diseñada para controlar un navegador Chrome sin una interfaz de usuario que utiliza el protocolo DevTools.

Cuando se utiliza Puppeteer, el desarrollador cuenta con métodos de ayuda tracing.start()y está tracing.stop()diseñado para recopilar indicadores de rendimiento de DevTools. A continuación se muestra un ejemplo del uso de estos mecanismos para recopilar datos sobre lo que sucede cuando hace clic en el botón que nos interesa.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const navigationPromise = page.waitForNavigation();
  await page.goto('https://react-movies-queue.glitch.me/')
  await page.setViewport({ width: 1276, height: 689 });
  await navigationPromise;

  const addMovieToQueueBtn = 'li:nth-child(3) > .card > .card__info > div > .button';
  await page.waitForSelector(addMovieToQueueBtn);

  //  ...
  await page.tracing.start({ path: 'profile.json' });
  //   
  await page.click(addMovieToQueueBtn);
  //  
  await page.tracing.stop();

  await browser.close();
})()

Ahora, después de cargar el archivo profile.jsonen la Performancebarra de herramientas del desarrollador, podemos ver qué llamadas de función se activaron al hacer clic en un botón.


Análisis de las consecuencias de hacer clic en el botón

Si está interesado en el tema del análisis del rendimiento de los componentes, eche un vistazo a este material.

API de sincronización del usuario


La API de sincronización del usuario permite al desarrollador crear métricas de rendimiento personalizadas utilizando marcas de tiempo altamente precisas. El método window.performance.mark()crea una marca de tiempo a la que se asigna el nombre. El método le window.performance.measure()permite averiguar el tiempo transcurrido entre dos mediciones.

//     
performance.mark('Movies:updateStart');
//  

//     
performance.mark('Movies:updateEnd');

//        
performance.measure('moviesRender', 'Movies:updateStart', 'Movies:updateEnd');

Al crear un perfil de una aplicación React con la pestaña PerformanceHerramientas para desarrolladores de Chrome, puede encontrar una sección Timingllena de métricas temporales con respecto a los componentes React. React, durante el renderizado, puede publicar esta información utilizando la API de sincronización del usuario.


Pestaña de rendimiento de las herramientas de desarrollador de Chrome

Tenga en cuenta que las API de temporizaciones de usuario se eliminan de los ensamblajes React DEV, reemplazándolo con la API React Profiler, que proporciona marcas de tiempo más precisas. Quizás en el futuro se devolverá el soporte para esta API haciéndolo para aquellos navegadores que admitan la especificación de Nivel de sincronización de usuario 3. 

En Internet, puede encontrar sitios de React que usan la API de sincronización de usuario para determinar sus propias métricas. Esto incluye, por ejemplo, laTime to first post title visiblemétricaReddity la métrica SpotifyTime to playback ready.


Las métricas especiales utilizadas en los sitios de React Las

métricas creadas por la API de sincronización del usuario se muestran convenientementeen el panel Lighthouse de lasherramientas para desarrolladores de Chrome.


Métricas en el panel de Lighthouse

Por ejemplo, las últimas versiones de Next.js incluyen métricas personalizadas y mecanismos para medir muchos eventos diferentes. Incluyendo lo siguiente:

  • Next.js-hydration: tiempo requerido para llevar el marcado pre-renderizado a las condiciones de trabajo.
  • Next.js-nav-to-render: El tiempo desde el inicio de la navegación hasta el inicio de la representación.

Todas estas medidas se muestran en el área Timings.


Análisis de las métricas de Next.js

Herramientas para desarrolladores y faro


Le recuerdo que Lighthouse y la PerformanceBarra de herramientas para desarrolladores de Chrome se pueden usar para analizar en profundidad el proceso de carga y el rendimiento de las aplicaciones React. Aquí puede encontrar métricas que afectan particularmente la percepción de las páginas por parte de los usuarios.


Análisis del rendimiento de la página

A quienes trabajan con React les puede gustar el hecho de que tendrán nuevas métricas a su disposición, como la métrica Tiempo total de bloqueo (TBT), que brinda información sobre cuánto tiempo la página está en modo no interactivo hasta el momento en que puede funcionar de manera confiable en modo interactivo ( Tiempo de interactividad ). Estos son los indicadores TBT (“antes” y “después”) para una aplicación que emplea el modo competitivo experimental, cuyo uso ayuda a la aplicación a adaptarse a las características del entorno en el que se está ejecutando.


Modificar TBT

Estas herramientas son útiles para analizar los cuellos de botella del rendimiento de la aplicación, como las tareas que requieren mucho tiempo para completarse, lo que retrasa la transición en línea de la aplicación. Por ejemplo, esto puede estar relacionado con un análisis de la velocidad de reacción de la aplicación al presionar botones.


El análisis de la aplicación

Lighthouse, además, brinda a los desarrolladores de React muchos consejos específicos sobre muchos problemas. A continuación se muestra el resultado del análisis en Lighthouse 6.0 . Aquí, se abre la sección Eliminar JavaScript no utilizado , que informa sobre el código JavaScript no utilizado que se carga en una aplicación que se puede importar usandoReact.lazy().


Analizar una aplicación en Lighthouse

Las aplicaciones siempre son útiles para probar en hardware, que probablemente esté disponible para sus usuarios finales. A menudo confío en Webpagetest y los datos de RUM y CrUX en estos asuntos, lo que me permite obtener información más completa sobre el rendimiento de la aplicación.

¡Queridos lectores! ¿Cómo investiga el rendimiento de sus aplicaciones React?


All Articles