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.
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.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.
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>
);
}
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.
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.funcionPesada()
si el usuario nunca interactúa con ese botón, reduciendo el tiempo de carga inicial.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.chart.js
en el bundle inicial, mejorando la carga de la aplicació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.