Next.js é um poderoso framework React que fornece otimizações de desempenho integradas. No entanto, os desenvolvedores frequentemente encontram gargalos de desempenho devido à busca ineficiente de dados, renderizações excessivas ou gerenciamento inadequado de recursos. Neste artigo, exploraremos os erros de desempenho mais comuns no Next.js e soluções práticas para otimizar suas aplicações.
Buscar dados em cada requisição usando getServerSideProps
(SSR) pode tornar a aplicação mais lenta, especialmente se os dados não mudam com frequência.
getStaticProps
) Sempre Que Possível
Para dados que não mudam frequentemente, é preferível a geração estática para reduzir a carga do servidor e melhorar a velocidade da 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 a página a cada 60 segundos
};
}
Use revalidate
para habilitar a Regeneração Estática Incremental (ISR) e atualizar o conteúdo estático sem precisar reconstruir toda a aplicação.
Incluir dependências grandes no pacote do cliente aumenta os tempos de carregamento.
Use next/dynamic
para carregar componentes pesados apenas quando necessário.
import dynamic from "next/dynamic";
const HeavyComponent = dynamic(() => import("../components/HeavyComponent"), { ssr: false });
Analise o tamanho do seu pacote com next build && next analyze
usando @next/bundle-analyzer
.
<img>
em Vez do Otimizador de Imagens do Next.js
Elementos padrão <img>
não suportam otimizações automáticas.
Image
do Next.js
import Image from "next/image";
<Image src="/image.jpg" width={500} height={300} quality={80} alt="Imagem otimizada" />
Isso garante imagens responsivas com carregamento lento automático e otimização de formato.
Operações pesadas dentro dos componentes podem tornar o processo de renderização mais lento.
Para cálculos pesados, use useMemo
para evitar reexecuções desnecessárias.
import { useMemo } from "react";
const ExpensiveComponent = ({ data }) => {
const processedData = useMemo(() => computeHeavyData(data), [data]);
return <div>{processedData}</div>;
};
Atualizar o estado com muita frequência pode causar re-renderizações excessivas.
useState
e useEffect
com moderação.
useRef
para valores que não disparam re-renderizações.
const Component = () => {
const countRef = useRef(0);
const increment = () => countRef.current++;
return <button onClick={increment}>Incrementar</button>;
};
Buscar dados de APIs lentas pode atrasar a renderização da página.
Use a biblioteca SWR para busca de dados no cliente com cache e revalidação.
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>Erro ao carregar</div>;
if (!data) return <div>Carregando...</div>;
return <div>{data.message}</div>;
};
Ao resolver esses erros comuns, você pode melhorar significativamente o desempenho da sua aplicação Next.js. Uma busca de dados eficiente, otimização adequada de imagens, redução de JavaScript desnecessário e gerenciamento otimizado do estado contribuem para uma experiência de usuário mais rápida e fluida.
Jorge García
Fullstack developer