Vercel React Best Practices
Guia abrangente de otimização de desempenho para aplicações React e Next.js, mantido pela Vercel. Contém 45 regras distribuídas em 8 categorias, priorizadas por impacto para orientar refatoração automatizada e geração de código.
Quando Aplicar
Consulte estas diretrizes quando:
- Escrever novos componentes React ou páginas Next.js
- Implementar busca de dados (lado do cliente ou servidor)
- Revisar código quanto a problemas de desempenho
- Refatorar código React/Next.js existente
- Otimizar tamanho de bundle ou tempos de carregamento
Categorias de Regras por Prioridade
| Prioridade | Categoria | Impacto | Prefixo |
|---|---|---|---|
| 1 | Eliminando Waterfalls | CRÍTICO | async- |
| 2 | Otimização de Bundle | CRÍTICO | bundle- |
| 3 | Desempenho do Lado do Servidor | ALTO | server- |
| 4 | Busca de Dados do Lado do Cliente | MÉDIO-ALTO | client- |
| 5 | Otimização de Re-render | MÉDIO | rerender- |
| 6 | Desempenho de Renderização | MÉDIO | rendering- |
| 7 | Desempenho de JavaScript | BAIXO-MÉDIO | js- |
| 8 | Padrões Avançados | BAIXO | advanced- |
Referência Rápida
1. Eliminando Waterfalls (CRÍTICO)
async-defer-await- Mova await para ramificações onde realmente é usadoasync-parallel- Use Promise.all() para operações independentesasync-dependencies- Use better-all para dependências parciaisasync-api-routes- Inicie promises cedo, await tarde em rotas de APIasync-suspense-boundaries- Use Suspense para fazer stream de conteúdo
2. Otimização de Bundle (CRÍTICO)
bundle-barrel-imports- Importe diretamente, evite barrel filesbundle-dynamic-imports- Use next/dynamic para componentes pesadosbundle-defer-third-party- Carregue analytics/logging após hidrataçãobundle-conditional- Carregue módulos apenas quando o recurso é ativadobundle-preload- Pré-carregue ao passar mouse/foco para velocidade percebida
3. Desempenho do Lado do Servidor (ALTO)
server-cache-react- Use React.cache() para deduplicação por requisiçãoserver-cache-lru- Use cache LRU para cache entre requisiçõesserver-serialization- Minimize dados passados para componentes clienteserver-parallel-fetching- Reestruture componentes para paralelizar buscasserver-after-nonblocking- Use after() para operações não-bloqueantes
4. Busca de Dados do Lado do Cliente (MÉDIO-ALTO)
client-swr-dedup- Use SWR para deduplicação automática de requisiçõesclient-event-listeners- Deduplicar event listeners globais
5. Otimização de Re-render (MÉDIO)
rerender-defer-reads- Não se inscreva em estado usado apenas em callbacksrerender-memo- Extraia trabalho caro em componentes memoizadosrerender-dependencies- Use dependências primitivas em effectsrerender-derived-state- Inscreva-se em booleanos derivados, não valores brutosrerender-functional-setstate- Use setState funcional para callbacks estáveisrerender-lazy-state-init- Passe função para useState em valores carosrerender-transitions- Use startTransition para atualizações não-urgentes
6. Desempenho de Renderização (MÉDIO)
rendering-animate-svg-wrapper- Anime div wrapper, não elemento SVGrendering-content-visibility- Use content-visibility para listas longasrendering-hoist-jsx- Extraia JSX estático fora de componentesrendering-svg-precision- Reduza precisão de coordenadas SVGrendering-hydration-no-flicker- Use script inline para dados apenas do clienterendering-activity- Use componente Activity para mostrar/ocultarrendering-conditional-render- Use ternário, não && para condicionais
7. Desempenho de JavaScript (BAIXO-MÉDIO)
js-batch-dom-css- Agrupe mudanças CSS via classes ou cssTextjs-index-maps- Construa Map para buscas repetidasjs-cache-property-access- Cache propriedades de objeto em loopsjs-cache-function-results- Cache resultados de função em Map em nível de módulojs-cache-storage- Cache leituras de localStorage/sessionStoragejs-combine-iterations- Combine múltiplos filter/map em um loopjs-length-check-first- Verifique comprimento do array antes de comparação carajs-early-exit- Retorne cedo de funçõesjs-hoist-regexp- Extraia criação de RegExp fora de loopsjs-min-max-loop- Use loop para min/max em vez de sortjs-set-map-lookups- Use Set/Map para buscas O(1)js-tosorted-immutable- Use toSorted() para imutabilidade
8. Padrões Avançados (BAIXO)
advanced-event-handler-refs- Armazene event handlers em refsadvanced-use-latest- useLatest para refs de callback estáveis
Como Usar
Leia arquivos de regra individuais para explicações detalhadas e exemplos de código:
rules/async-parallel.md
rules/bundle-barrel-imports.md
rules/_sections.md
Cada arquivo de regra contém:
- Breve explicação de por que importa
- Exemplo de código incorreto com explicação
- Exemplo de código correto com explicação
- Contexto adicional e referências
Documento Compilado Completo
Para o guia completo com todas as regras expandidas: AGENTS.md