Cómo Implementar Lazy Loading en React

Jaciel AReactDesarrollo Web3 months ago279 Views

El lazy loading es una técnica de optimización que permite cargar solo los componentes o imágenes cuando son necesarios, reduciendo el tiempo de carga inicial de la aplicación y mejorando el rendimiento. En React, esta técnica es especialmente útil para dividir el código y mejorar la experiencia del usuario.

Ventajas del Lazy Loading en React

  • Mejora el rendimiento: Reduce el tiempo de carga inicial al evitar cargar componentes innecesarios.
  • Optimiza el uso de memoria: Solo se cargan los recursos cuando son requeridos.
  • Mejor experiencia de usuario: Evita bloqueos o retrasos en la interfaz.
  • Menos consumo de ancho de banda: Reduce la cantidad de datos descargados en la primera carga.

Implementación de Lazy Loading en React

Cómo Implementar Lazy Loading en React

1. Usando React.lazy y Suspense

React proporciona la función React.lazy() para cargar componentes de forma diferida. Se combina con React.Suspense para mostrar un contenido de carga mientras el componente se carga.

import React, { Suspense, lazy } from "react";

const MiComponente = lazy(() => import("./MiComponente"));

function App() {
  return (
    <Suspense fallback={<div>Cargando...</div>}>
      <MiComponente />
    </Suspense>
  );
}

export default App;

En este ejemplo:

  • React.lazy() se usa para importar el componente de manera diferida.
  • Suspense muestra un mensaje de carga hasta que el componente esté disponible.

2. Lazy Loading con React Router

Cuando se utilizan rutas en una aplicación React, es común cargar páginas de forma diferida para mejorar el rendimiento.

import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import { Suspense, lazy } from "react";

const Home = lazy(() => import("./pages/Home"));
const About = lazy(() => import("./pages/About"));

function App() {
  return (
    <Router>
      <Suspense fallback={<div>Cargando...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
        </Routes>
      </Suspense>
    </Router>
  );
}

export default App;

Este método evita que todas las páginas se carguen de inmediato, reduciendo la carga inicial.

3. Lazy Loading de Imágenes con loading="lazy"

En React, podemos usar la propiedad loading="lazy" en etiquetas <img> para cargar imágenes solo cuando entren en el viewport.

function ImagenLazy() {
  return <img src="https://via.placeholder.com/600" alt="Ejemplo" loading="lazy" />;
}

Para imágenes de fondo en CSS, se recomienda usar Intersection Observer API:

import { useEffect, useState } from "react";

function ImagenLazyBackground({ src, alt }) {
  const [loaded, setLoaded] = useState(false);

  useEffect(() => {
    const img = new Image();
    img.src = src;
    img.onload = () => setLoaded(true);
  }, [src]);

  return (
    <div
      style={{
        width: "300px",
        height: "200px",
        backgroundImage: loaded ? `url(${src})` : "none",
        backgroundSize: "cover",
        backgroundPosition: "center",
      }}
      aria-label={alt}
    ></div>
  );
}

4. Carga Diferida de Módulos con import()

Otra forma de implementar lazy loading en React es mediante la carga diferida de módulos usando import(). Esto es útil cuando una funcionalidad específica solo se necesita bajo ciertas condiciones, evitando cargar código innecesario en la carga inicial de la aplicación.

Cuándo usar carga diferida de módulos

  • Funciones que solo se usan en eventos específicos, como hacer clic en un botón.
  • Librerías pesadas que solo se necesitan en ciertas vistas o acciones.
  • Código relacionado con herramientas de administración, que no es necesario para usuarios regulares.

Ejemplo de carga diferida de una función específica

function handleClick() {
  import("./utils").then((module) => {
    module.funcionPesada();
  });
}

<button onClick={handleClick}>Cargar Módulo</button>

En este caso:

  • import("./utils") solo carga el módulo utils.js cuando el usuario hace clic en el botón.
  • Se evita cargar funcionPesada() si el usuario nunca interactúa con ese botón, reduciendo el tiempo de carga inicial.

Ejemplo con una librería pesada

import { useState } from "react";

function App() {
  const [ChartComponent, setChartComponent] = useState(null);

  const loadChart = async () => {
    const { default: Chart } = await import("chart.js");
    setChartComponent(() => Chart);
  };

  return (
    <div>
      <button onClick={loadChart}>Cargar Gráfico</button>
      {ChartComponent && <ChartComponent data={{ /* datos */ }} />}
    </div>
  );
}

Aquí:

  • import("chart.js") carga la librería solo cuando el usuario lo requiere.
  • Evita incluir chart.js en el bundle inicial, mejorando la carga de la aplicación.

Conclusión

Implementar Lazy Loading en React es una estrategia esencial para mejorar el rendimiento de una aplicación web. Mediante React.lazy, Suspense, loading="lazy", y carga diferida de módulos, podemos optimizar tiempos de carga y reducir el uso de recursos. Integrar estas técnicas adecuadamente garantiza una mejor experiencia de usuario y un mejor rendimiento general.

Leave a reply

Loading Next Post...
Tendecia
Loading

Signing-in 3 seconds...

Signing-up 3 seconds...