React Compiler y memoización automática | Nicolás Garzón
No convierte código impuro en código correcto. Depende de que los componentes respeten las reglas de React.
Código que antes necesitaba useMemo, useCallback o memo manualmente puede recibir optimizaciones automáticas.
TypeScript
Copiar function ProductList ( { products, query } : Props) {
const visible = products. filter ( ( product) =>
product. name. includes ( query) ,
) ;
return visible. map ( ( product) => (
< ProductRow key= { product. id} product= { product} / >
) ) ;
} El código sigue escrito de forma directa. El Compiler decide qué valores conservar.
Todavía pueden existir integraciones, identidades contractuales o escenarios no compilados donde la memoización explícita sea necesaria.
Render puro.
Hooks usados correctamente.
No mutar props ni estado.
No depender de efectos secundarios ocultos.
Activa el Compiler siguiendo la integración de tu bundler o framework y revisa diagnósticos. No asumas que todo proyecto está compilado solo por usar una versión reciente de React.
Eliminar toda memoización sin verificar el entorno.
Creer que optimiza algoritmos lentos.
Usarlo para justificar componentes impuros.
Ignorar incompatibilidades reportadas.
El Compiler automatiza parte del trabajo mecánico, pero hace todavía más importantes la pureza y las reglas de React.
React Compiler realiza análisis estático sobre componentes y Hooks. Intenta demostrar qué valores y subárboles pueden reutilizarse sin cambiar el comportamiento.
Texto
Copiar source component
↓ análisis de dependencias y pureza
memoización generada
↓
runtime ReactNo “adivina” la intención. Cuando no puede demostrar seguridad, puede omitir optimización o reportar un diagnóstico.
El Compiler depende de reglas como:
Render puro.
Props y state inmutables.
Hooks en orden estable.
Componentes usados mediante JSX.
Sin efectos secundarios ocultos.
Estas reglas ya eran necesarias para rendering moderno. El Compiler convierte algunas en requisitos analizables y puede descubrir código que funcionaba solo por accidente.
En componentes compatibles puede reducir la necesidad de:
React.memo para omitir renders por entradas estables.
useMemo para conservar valores derivados.
useCallback para estabilizar callbacks.
Esto permite escribir primero código directo:
TypeScript
Copiar function ProductList ( { products, query, onSelect } : Props) {
const visible = products. filter ( ( product) =>
product. name. includes ( query) ,
) ;
return visible. map ( ( product) => (
< ProductRow
key= { product. id}
product= { product}
onSelect= { ( ) => onSelect ( product. id) }
/ >
) ) ;
} No significa que toda ejecución o cálculo desaparezca; el Compiler decide qué conservar según su análisis.
Elegir un algoritmo eficiente.
Reducir miles de elementos.
Virtualizar listas.
Evitar requests o waterfalls.
Diseñar Contexts estrechos.
Colocar state correctamente.
Caché de datos remotos.
Identidad exigida por una API externa.
Medición de rendimiento.
Un filtro O(n²) sigue siendo O(n²), aunque no se repita en algunos renders.
Confirma versión compatible de React.
Integra el plugin en bundler o framework según documentación oficial.
Ejecuta lint y tests.
Revisa diagnósticos.
Perfila flujos críticos.
Retira memoización manual solo cuando sea redundante.
Mantén rollback de configuración.
No asumas que actualizar react activa Compiler automáticamente.
El Compiler puede saltarse componentes incompatibles y compilar otros. Esto permite adopción incremental, pero debes observar reportes para evitar creer que toda la aplicación está optimizada.
Los lint rules relacionados ayudan a detectar patrones que impiden compilación antes del build.
Directivas como "use memo" y "use no memo" permiten control en escenarios específicos y dependen de la versión/configuración. No las agregues a cada archivo. El comportamiento predeterminado del Compiler debería cubrir código normal; las directivas necesitan una razón documentada.
Una librería puede publicarse precompilada o esperar que la aplicación compile su source según el ecosistema. Revisa:
Compatibilidad de runtime mínima.
Build output.
Source maps.
Peer dependencies.
Qué código queda fuera del análisis.
No compiles dependencias arbitrariamente sin revisar su contrato.
No elimines automáticamente:
TypeScript
Copiar const value = useMemo ( ... ) ;
Identidad semántica requerida por una API.
Compatibilidad con proyectos sin Compiler.
Integración externa.
Una medición específica.
Un escape reconocido por tooling.
Clasifica cada uso. Si solo era una microoptimización mecánica y Compiler cubre el caso, simplifícalo con tests y profiling.
Cuando el comportamiento cambia al habilitar Compiler, no desactives la optimización sin investigar. Puede revelar:
Mutación durante render.
Dependencia escondida.
Custom Hook impuro.
Objeto compartido modificado.
Uso incorrecto de una API imperativa.
El código debe ser correcto con o sin memoización.
Compiler puede reducir trabajo de React, pero añade un paso de build y genera caches runtime. Verifica:
Tiempo de compilación.
Tamaño del output.
Commits y renders.
Memoria.
Experiencia en dispositivos reales.
No prometas mejoras iguales en todo proyecto.
Aplicación pequeña sin problema medido.
Equipo todavía corrigiendo pureza y arquitectura.
Tooling incompatible.
Cuello dominante en red, servidor o imágenes.
Adoptarlo puede seguir siendo valioso por simplicidad futura, pero no reemplaza resolver el problema principal.
Compiler automatiza memoización demostrablemente segura.
Requiere integración explícita y código compatible.
No corrige impurezas ni algoritmos lentos.
La adopción puede ser gradual.
Memoización manual se evalúa por contrato, no se elimina en masa.
¿Por qué actualizar React no activa automáticamente Compiler?
¿Qué problema de rendimiento nunca arregla por sí solo?
¿Qué puede revelar un diagnóstico de incompatibilidad?
¿Cuándo conservarías useMemo manual?
Ver respuestas
Porque necesita plugin y configuración del build o framework.
Un algoritmo ineficiente, red lenta o DOM excesivo.
Mutaciones, Hooks incorrectos o dependencias ocultas.
Cuando una API externa exige identidad o el código debe funcionar sin Compiler.
lazy, Suspense y code splitting cambia el foco de evitar renders a coordinar código y recursos pendientes.