Melhores Práticas de Performance
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de cada página desta seção.
Busque em todas as páginas da documentação
Um resumo condensado das 25 melhores práticas mais importantes, extraídas de cada página desta seção.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
ANALYZE=true; lembre-se que o treemap mostra bytes não comprimidos, então cruze com o tamanho de transferência gzip/brotli no painel Network antes de comemorar vitórias.index.ts com export * derrotam silenciosamente o tree-shaking mesmo em módulos ES, a menos que você defina "sideEffects": false em package.json; prefira importações profundas ou marque pacotes como sem efeitos colaterais para que o bundler possa podar código não utilizado.LCP < 2.5s, INP < 200ms, CLS < 0.1) contra um build de produção.Suspense com seu próprio Server Component assíncrono busca em paralelo automaticamente, então dividir irmãos em limites separados oferece paralelismo sem escrever um Promise.all - um limite de nível superior colapsa isso de volta em um waterfall..map(async row => prisma.x.findUnique(...)) emite uma consulta por linha; colapse para um único JOIN via include/select, e prefira Promise.allSettled quando uma rejeição parcial não deve descartar todos os outros resultados.sizes, o navegador assume 100vw e baixa a maior variante srcset (geralmente 3840px) para uma miniatura; passe uma string sensível a breakpoints que corresponda ao seu layout e adicione priority apenas à imagem LCP para que a largura de banda seja gasta onde importa.<link> do Google Fonts por next/font/google (ou next/font/local) para que as fontes sejam enviadas da mesma origem com cabeçalhos de cache imutáveis e métricas de fallback geradas automaticamente que eliminam FOUT e CLS; fontes variáveis economizam cerca de 100 KB em comparação com o carregamento de múltiplos arquivos de peso.useMemo, useCallback e React.memo apenas após o profiler mostrar um custo real; memoizar prematuramente componentes baratos adiciona sobrecarga de comparação que frequentemente excede o trabalho que economiza.children (ou uma prop de objeto/função inline) reconstrói esse valor a cada renderização pai, então React.memo nunca encurta o caminho - eleve os children, use o padrão children-wrapper de estado, ou aceite que memo não ajudará ali.useEffect que inicia um fetch, adiciona um listener, define um timer, abre um WebSocket ou inicializa uma biblioteca de gráficos deve retornar uma limpeza; Strict Mode's double-mount expõe limpeza ausente em vez de causá-la, e intervalos/listeners vazados retêm todo o estado do componente via closure.AbortController e chame abort() na limpeza, para que mudanças de dependência ou desmontagens não deixem respostas antigas sobrescrevendo estados mais recentes ou bloqueando a GC de grandes payloads JSON.cookies()/headers() ou cache: "no-store" desabilita o Cache de Rota Completa para toda a rota, então isole esse código em seu próprio filho Suspense.unstable_cache(fn, keyParts, { tags, revalidate }) com partes de chave descritivas únicas, e lembre-se que revalidatePath("/x") não afeta rotas filhas a menos que você passe "layout".numberOfRuns: 3) e compare a mediana; defina limites de CI mais baixos do que seus números de produção local para evitar falhas instáveis.NODE_ENV=production, use react-dom/profiling, feche a aba Components durante a gravação, e compare actualDuration vs baseDuration para ver se a memoização está realmente valendo a pena.children para um wrapper que possui o estado; children são criados no escopo do pai, então o wrapper com estado pode re-renderizar sem re-renderizar a árvore estática - nenhum memo é necessário.useSyncExternalStore para que assinantes de granularidade fina re-renderizem apenas quando sua fatia específica mudar.experimental.reactCompiler: true (mais babel-plugin-react-compiler) insere memoização mais granular do que useMemo/useCallback/memo escritos manualmente - adote o compilador antes de remover a memoização manual para que você nunca deixe uma lacuna onde nada está memoizado.Date.now()/Math.random() durante o render, ou leituras de globais mutáveis param de disparar ou cacheiam valores antigos - use useSyncExternalStore para fontes mutáveis externas."use client" em um layout contamina toda a subárvore e adiciona 100+ KB de JS de hidratação; mantenha a diretiva no menor leaf interativo e passe Server Components através de children para wrappers de Client Component como <ThemeProvider>.fs, prisma ou outros módulos somente de servidor dentro de um arquivo "use client".useStore(s => s) se inscreve em toda a store, e useStore(s => ({ a: s.a, b: s.b })) cria um novo objeto a cada atualização causando re-renderizações espúrias; envolva com useShallow de zustand/react/shallow para comparar propriedades em vez de identidade.performance.hints: "error", size-limit, ou diff do output de analyze do Next.js contra main) para que regressões falhem a construção em vez de serem enviadas silenciosamente; emparelhe isso com uma verificação Lighthouse CI para que tanto bytes quanto métricas percebidas pelo usuário restrinjam merges.Revisado por Chris St. John·Última atualização: 16 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥