Next.js es un potente framework de React que proporciona optimizaciones de rendimiento integradas. Sin embargo, los desarrolladores a menudo encuentran cuellos de botella debido a una obtención de datos ineficiente, renderizados excesivos o una gestión inadecuada de los recursos. En este artículo, exploraremos los errores de rendimiento más comunes en Next.js y soluciones prácticas para optimizar tus aplicaciones.
Obtener datos en cada solicitud utilizando getServerSideProps
(SSR) puede ralentizar la aplicación, especialmente si los datos no cambian con frecuencia.
getStaticProps
) Cuando Sea Posible
Para datos que no cambian con frecuencia, es preferible la generación estática para reducir la carga del servidor y mejorar la velocidad de la página.
export async function getStaticProps() {
const res = await fetch("https://api.example.com/data");
const data = await res.json();
return {
props: { data },
revalidate: 60, // Regenera la página cada 60 segundos
};
}
Usa revalidate
para habilitar la Regeneración Estática Incremental (ISR) y actualizar contenido estático sin reconstruir toda la aplicación.
Incluir dependencias grandes en el paquete del cliente aumenta los tiempos de carga.
Usa next/dynamic
para cargar componentes pesados solo cuando se necesiten.
import dynamic from "next/dynamic";
const HeavyComponent = dynamic(() => import("../components/HeavyComponent"), { ssr: false });
Analiza el tamaño de tu paquete con next build && next analyze
usando @next/bundle-analyzer
.
<img>
en Lugar de la Optimización de Imágenes de Next.js
Los elementos estándar <img>
no soportan optimizaciones automáticas.
Image
de Next.js
import Image from "next/image";
<Image src="/image.jpg" width={500} height={300} quality={80} alt="Imagen optimizada" />
Esto garantiza imágenes responsivas con carga diferida automática y optimización de formatos.
Las operaciones pesadas dentro de los componentes ralentizan el renderizado.
Para cálculos costosos, usa useMemo
para evitar ejecuciones redundantes.
import { useMemo } from "react";
const ExpensiveComponent = ({ data }) => {
const processedData = useMemo(() => computeHeavyData(data), [data]);
return <div>{processedData}</div>;
};
Actualizar el estado con demasiada frecuencia provoca renderizados innecesarios.
useState
y useEffect
con moderación.
useRef
para valores que no desencadenan re-renderizados.
const Component = () => {
const countRef = useRef(0);
const increment = () => countRef.current++;
return <button onClick={increment}>Incrementar</button>;
};
Obtener datos de APIs lentas retrasa la renderización de la página.
Usa la biblioteca SWR para obtener datos en el cliente con caché y revalidación.
import useSWR from "swr";
const fetcher = (url) => fetch(url).then((res) => res.json());
const MyComponent = () => {
const { data, error } = useSWR("/api/data", fetcher);
if (error) return <div>Error al cargar</div>;
if (!data) return <div>Cargando...</div>;
return <div>{data.message}</div>;
};
Al abordar estos errores comunes, puedes mejorar significativamente el rendimiento de tu aplicación Next.js. Una obtención de datos eficiente, optimización adecuada de imágenes, reducción de JavaScript innecesario y una gestión optimizada del estado contribuyen a una experiencia de usuario más rápida y fluida.
Jorge García
Fullstack developer