Prácticas recomendadas de Vercel para React
Guía completa de optimización de rendimiento para aplicaciones React y Next.js, mantenida por Vercel. Contiene 70 reglas en 8 categorías, priorizadas por impacto para guiar la refactorización y generación de código automatizadas.
Cuándo aplicar
Consulte estas pautas cuando:
- Escriba nuevos componentes React o páginas Next.js
- Implemente fetching de datos (del lado del cliente o del servidor)
- Revise código en busca de problemas de rendimiento
- Refactorice código React/Next.js existente
- Optimice el tamaño del bundle o los tiempos de carga
Categorías de reglas por prioridad
| Prioridad | Categoría | Impacto | Prefijo |
|---|---|---|---|
| 1 | Eliminación de cascadas | CRÍTICO | async- |
| 2 | Optimización del tamaño del bundle | CRÍTICO | bundle- |
| 3 | Rendimiento del lado del servidor | ALTO | server- |
| 4 | Fetching de datos del lado del cliente | MEDIO-ALTO | client- |
| 5 | Optimización de re-renderizados | MEDIO | rerender- |
| 6 | Rendimiento de renderizado | MEDIO | rendering- |
| 7 | Rendimiento de JavaScript | BAJO-MEDIO | js- |
| 8 | Patrones avanzados | BAJO | advanced- |
Referencia rápida
1. Eliminación de cascadas (CRÍTICO)
async-cheap-condition-before-await- Verificar condiciones síncronas baratas antes de esperar flags o valores remotosasync-defer-await- Mover await a las ramas donde realmente se usaasync-parallel- Usar Promise.all() para operaciones independientesasync-dependencies- Usar better-all para dependencias parcialesasync-api-routes- Iniciar promesas temprano, esperar tarde en rutas APIasync-suspense-boundaries- Usar Suspense para transmitir contenido
2. Optimización del tamaño del bundle (CRÍTICO)
bundle-barrel-imports- Importar directamente, evitar archivos barrelbundle-analyzable-paths- Preferir rutas de importación y sistema de archivos analizables estáticamente para evitar bundles y trazas ampliasbundle-dynamic-imports- Usar next/dynamic para componentes pesadosbundle-defer-third-party- Cargar análisis/registro después de la hidrataciónbundle-conditional- Cargar módulos solo cuando la característica está activadabundle-preload- Precargar al pasar el ratón/enfocar para velocidad percibida
3. Rendimiento del lado del servidor (ALTO)
server-auth-actions- Autenticar acciones del servidor como rutas APIserver-cache-react- Usar React.cache() para deduplicación por solicitudserver-cache-lru- Usar caché LRU para almacenamiento en caché entre solicitudesserver-dedup-props- Evitar serialización duplicada en props de RSCserver-hoist-static-io- Elevar E/S estática (fuentes, logotipos) al nivel del móduloserver-no-shared-module-state- Evitar estado mutable a nivel de módulo en RSC/SSRserver-serialization- Minimizar datos pasados a componentes del clienteserver-parallel-fetching- Reestructurar componentes para paralelizar fetchserver-parallel-nested-fetching- Encadenar fetch anidados por elemento en Promise.allserver-after-nonblocking- Usar after() para operaciones no bloqueantes
4. Fetching de datos del lado del cliente (MEDIO-ALTO)
client-swr-dedup- Usar SWR para deduplicación automática de solicitudesclient-event-listeners- Desduplicar listeners de eventos globalesclient-passive-event-listeners- Usar listeners pasivos para scrollclient-localstorage-schema- Versionar y minimizar datos de localStorage
5. Optimización de re-renderizados (MEDIO)
rerender-defer-reads- No suscribirse a estado solo usado en callbacksrerender-memo- Extraer trabajo costoso en componentes memorizadosrerender-memo-with-default-value- Elevar props no primitivos predeterminadosrerender-dependencies- Usar dependencias primitivas en efectosrerender-derived-state- Suscribirse a booleanos derivados, no a valores crudosrerender-derived-state-no-effect- Derivar estado durante el renderizado, no en efectosrerender-functional-setstate- Usar setState funcional para callbacks establesrerender-lazy-state-init- Pasar función a useState para valores costososrerender-simple-expression-in-memo- Evitar memo para primitivos simplesrerender-split-combined-hooks- Dividir hooks con dependencias independientesrerender-move-effect-to-event- Poner lógica de interacción en manejadores de eventosrerender-transitions- Usar startTransition para actualizaciones no urgentesrerender-use-deferred-value- Diferir renderizados costosos para mantener la entrada receptivarerender-use-ref-transient-values- Usar refs para valores transitorios frecuentesrerender-no-inline-components- No definir componentes dentro de componentes
6. Rendimiento de renderizado (MEDIO)
rendering-animate-svg-wrapper- Animar envoltorio div, no elemento SVGrendering-content-visibility- Usar content-visibility para listas largasrendering-hoist-jsx- Extraer JSX estático fuera de componentesrendering-svg-precision- Reducir precisión de coordenadas SVGrendering-hydration-no-flicker- Usar script en línea para datos solo del clienterendering-hydration-suppress-warning- Suprimir discrepancias esperadasrendering-activity- Usar componente Activity para mostrar/ocultarrendering-conditional-render- Usar ternario, no && para condicionalesrendering-usetransition-loading- Preferir useTransition para estado de cargarendering-resource-hints- Usar sugerencias de recursos de React DOM para precargarendering-script-defer-async- Usar defer o async en etiquetas script
7. Rendimiento de JavaScript (BAJO-MEDIO)
js-batch-dom-css- Agrupar cambios CSS mediante clases o cssTextjs-index-maps- Construir Map para búsquedas repetidasjs-cache-property-access- Almacenar en caché propiedades de objetos en buclesjs-cache-function-results- Almacenar en caché resultados de funciones en Map a nivel de módulojs-cache-storage- Almacenar en caché lecturas de localStorage/sessionStoragejs-combine-iterations- Combinar múltiples filter/map en un solo buclejs-length-check-first- Verificar longitud de array antes de comparación costosajs-early-exit- Retornar temprano de funcionesjs-hoist-regexp- Elevar creación de RegExp fuera de buclesjs-min-max-loop- Usar bucle para min/max en lugar de sortjs-set-map-lookups- Usar Set/Map para búsquedas O(1)js-tosorted-immutable- Usar toSorted() para inmutabilidadjs-flatmap-filter- Usar flatMap para mapear y filtrar en un solo pasojs-request-idle-callback- Diferir trabajo no crítico al tiempo de inactividad del navegador
8. Patrones avanzados (BAJO)
advanced-effect-event-deps- No poner resultados deuseEffectEventen dependencias de efectoadvanced-event-handler-refs- Almacenar manejadores de eventos en refsadvanced-init-once- Inicializar la aplicación una vez por cargaadvanced-use-latest- useLatest para refs de callback estables
Cómo usar
Lea los archivos de reglas individuales para explicaciones detalladas y ejemplos de código:
rules/async-parallel.md
rules/bundle-barrel-imports.md
Cada archivo de regla contiene:
- Breve explicación de por qué es importante
- Ejemplo de código incorrecto con explicación
- Ejemplo de código correcto con explicación
- Contexto adicional y referencias
Documento completo compilado
Para la guía completa con todas las reglas expandidas: AGENTS.md