Uso de Chrome para optimizar el rendimiento de proyectos React

La optimización del rendimiento es un aspecto crucial en el desarrollo frontend, ya que afecta directamente la experiencia del usuario. En este artículo, explicaré cómo optimizar el rendimiento de proyectos React utilizando las herramientas de desarrollo de Chrome. Detallaremos el uso de estas herramientas y cómo aprovechar los indicadores proporcionados por Chrome para la optimización, con ejemplos específicos y explicaciones de código.

Introducción a las herramientas de desarrollo de Chrome

Las herramientas de desarrollo de Chrome (DevTools) son un conjunto poderoso de herramientas utilizadas por los desarrolladores web para depurar y analizar páginas web. Incluyen las siguientes secciones importantes:

  1. Elements: Ver y editar HTML y CSS.
  2. Console: Ver registros y ejecutar código JavaScript.
  3. Sources: Depurar código JavaScript.
  4. Network: Analizar solicitudes de red y carga de recursos.
  5. Performance: Registrar y analizar el rendimiento de la página.
  6. Memory: Analizar el uso de memoria y las fugas de memoria.
  7. Application: Ver almacenamiento y Service Worker.
  8. Lighthouse: Generar informes de rendimiento de la página web.

Indicadores de rendimiento importantes

Al optimizar el rendimiento, hay varios indicadores importantes a tener en cuenta:

  1. First Contentful Paint (FCP): Tiempo de la primera pintura con contenido.
  2. Largest Contentful Paint (LCP): Tiempo de la pintura con el contenido más grande.
  3. Time to Interactive (TTI): Tiempo hasta que la página es interactiva.
  4. Total Blocking Time (TBT): Tiempo total de bloqueo.
  5. Cumulative Layout Shift (CLS): Cambio acumulativo de diseño.

Utilización de Chrome para análisis y optimización del rendimiento

Uso del panel Performance

El panel Performance puede registrar y analizar el rendimiento de la página, incluyendo tiempos de carga, tiempos de renderizado, tiempos de ejecución de JavaScript, etc. Los pasos para usarlo son los siguientes:

  1. Abrir las herramientas de desarrollo de Chrome (F12 o clic derecho y seleccionar “Inspeccionar”).
  2. Cambiar al panel Performance.
  3. Hacer clic en el botón “Record” para empezar a grabar.
  4. Realizar operaciones en la página o cargar la página.
  5. Detener la grabación y analizar los resultados.

Optimización del First Contentful Paint (FCP)

FCP es el tiempo desde la navegación hasta la primera pintura de contenido en la página. Aquí hay algunas maneras de optimizar FCP:

División de código

Mediante la división de código, se puede reducir el tamaño del paquete de carga inicial y disminuir el tiempo de carga. Usar React.lazy y Suspense en React para implementar la división de código.

1
import React, { Suspense, lazy } from "react";
2
3
const OtherComponent = lazy(() => import("./OtherComponent"));
4
5
function MyComponent() {
6
return (
7
<Suspense fallback={<div>Loading...</div>}>
8
<OtherComponent />
9
</Suspense>
10
);
11
}

Compresión y optimización de recursos

Comprimir archivos JavaScript, CSS y de imagen para reducir su tamaño. Se pueden utilizar complementos de Webpack para la compresión.

Terminal window
1
npm install --save-dev terser-webpack-plugin
1
const TerserPlugin = require("terser-webpack-plugin");
2
3
module.exports = {
4
optimization: {
5
minimize: true,
6
minimizer: [new TerserPlugin()],
7
},
8
};

Optimización del Largest Contentful Paint (LCP)

LCP es el tiempo en que el usuario ve el contenido principal de la página. Aquí hay algunas maneras de optimizar LCP:

Optimización de carga de imágenes

Usar formatos de imagen modernos (como WebP) y realizar carga diferida mediante el atributo loading="lazy" en la etiqueta <img>.

1
<img src="image.webp" alt="description" loading="lazy" />

Reducción de solicitudes críticas

Reducir y optimizar la cantidad y el tamaño de las solicitudes críticas. Colocar CSS en el encabezado y JavaScript en el pie de página, usar atributos async y defer.

1
<link rel="stylesheet" href="styles.css" />
2
<script src="script.js" async></script>

Optimización del Time to Interactive (TTI)

TTI es el tiempo en que la página es completamente interactiva. Aquí hay algunas maneras de optimizar TTI:

Reducción del bloqueo del hilo principal

Optimizar y reducir el tiempo de ejecución de JavaScript, evitando tareas largas. Usar requestIdleCallback para ejecutar tareas no críticas en tiempo ocioso.

1
requestIdleCallback(() => {
2
// Ejecutar tareas no críticas
3
});

Uso de Web Workers

Mover tareas que consumen mucho tiempo a Web Workers para evitar bloquear el hilo principal.

main.js
1
const worker = new Worker("worker.js");
2
worker.postMessage("start");
3
worker.onmessage = (event) => {
4
console.log(event.data);
5
};
6
7
// worker.js
8
onmessage = (event) => {
9
if (event.data === "start") {
10
// Tarea que consume mucho tiempo
11
postMessage("done");
12
}
13
};

Optimización del Total Blocking Time (TBT)

TBT es el tiempo que las tareas largas bloquean el hilo principal. Aquí hay algunas maneras de optimizar TBT:

División de código

Dividir grandes bloques de código en partes más pequeñas para evitar tareas largas.

1
// antes
2
function longTask() {
3
// Tarea larga
4
}
5
6
// después
7
function smallTask() {
8
// Tarea pequeña
9
}

Evitar tareas largas

Usar requestAnimationFrame, setTimeout y otros métodos para dividir tareas largas en tareas más pequeñas.

1
function doChunk() {
2
// Tarea pequeña
3
if (moreChunks) {
4
requestAnimationFrame(doChunk);
5
}
6
}
7
8
doChunk();

Optimización del Cumulative Layout Shift (CLS)

CLS es la puntuación acumulativa de cambios en el diseño de la página. Aquí hay algunas maneras de optimizar CLS:

Reservar espacio

Reservar espacio para elementos como imágenes y videos para evitar cambios de diseño al cargar.

1
img {
2
width: 100%;
3
height: auto;
4
}
1
<img src="image.jpg" width="600" height="400" alt="description" />

Evitar la inserción dinámica de contenido

Evitar insertar contenido dinámicamente en la parte superior de la página, lo que causa cambios de diseño. Usar position: absolute o position: fixed para evitar afectar el diseño.

Ejemplo: Optimización del rendimiento de un proyecto React

Supongamos que tenemos un proyecto React que incluye un componente complejo ComplexComponent, cuyo tiempo de carga inicial es largo. Usamos las herramientas de desarrollo de Chrome para analizar y optimizar.

1. Análisis de cuellos de botella de rendimiento

Abrir el panel Performance, registrar el rendimiento de la carga de la página. Descubrimos que el tiempo de carga de ComplexComponent es largo, afectando FCP y LCP.

2. Optimización del tiempo de carga

División de código

Dividir el código de ComplexComponent para reducir el tamaño del paquete de carga inicial.

1
import React, { Suspense, lazy } from "react";
2
3
const ComplexComponent = lazy(() => import("./ComplexComponent"));
4
5
function App() {
6
return (
7
<Suspense fallback={<div>Loading...</div>}>
8
<ComplexComponent />
9
</Suspense>
10
);
11
}
12
13
export default App;

Compresión de recursos

Usar complementos de Webpack para comprimir archivos JavaScript y CSS.

1
const TerserPlugin = require("terser-webpack-plugin");
2
3
module.exports = {
4
optimization: {
5
minimize: true,
6
minimizer: [new TerserPlugin()],
7
},
8
};

3. Optimización del tiempo de renderizado e interactividad

Carga diferida de imágenes

Cargar imágenes de manera diferida para reducir el tiempo de carga inicial.

1
function ImageComponent() {
2
return <img src="image.jpg" alt="description" loading="lazy" />;
3
}

Uso de Web Workers

Mover cálculos complejos a Web Workers para evitar bloquear el hilo principal.

main.js
1
const worker = new Worker("worker.js");
2
worker.postMessage("start");
3
worker.onmessage = (event) => {
4
console.log(event.data);
5
};
6
7
// worker.js
8
onmessage = (event) => {
9
if (event.data === "start") {
10
// Tarea que consume mucho tiempo
11
postMessage("done");
12
}
13
};

4. Optimización del cambio de diseño

Reservar espacio para imágenes para evitar cambios de diseño al cargar.

1
function ImageComponent() {
2
return <img src="image.jpg" width="600" height="400" alt="description" />;
3
}

Conclusión

Al combinar el análisis y la optimización utilizando las herramientas de desarrollo de Chrome, se puede mejorar significativamente el rendimiento de los proyectos React. La clave es identificar los cuellos de botella de rendimiento y optimizar según el problema específico. Espero que este artículo te ayude a comprender y aplicar mejor las técnicas de optimización de rendimiento.