React Compiler vs. memoización manual
Durante años, optimizar el rendimiento de React significaba una sola cosa: salpicar useMemo, useCallback y React.memo por todo el código base y cruzar los dedos para que los arrays de dependencias estuvieran bien. React Compiler cambia esa ecuación. Pero ¿en qué medida? ¿Y sigue teniendo cabida la memoización manual en las aplicaciones React modernas?
Esto es lo que realmente necesitas saber.
Puntos clave
- React Compiler es una herramienta en tiempo de compilación que aplica automáticamente el equivalente a
React.memo,useMemoyuseCallbackbasándose en análisis estático. - Destaca al manejar patrones comunes como props de callback, children como props y valores de retorno de hooks personalizados.
- La memoización manual sigue siendo importante para hooks de terceros que devuelven objetos inestables, dependencias de efectos y cuellos de botella detectados al perfilar.
- La nueva mentalidad: escribe componentes limpios por defecto y memoiza de forma deliberada cuando tengas una razón medible.
Qué hace React Compiler
React Compiler es una herramienta en tiempo de compilación que memoiza automáticamente tus componentes, sus props y los valores de retorno de los hooks. Analiza tu código en tiempo de compilación y aplica optimizaciones equivalentes a envolver elementos en React.memo, useMemo y useCallback, sin que tengas que escribir nada de ese código.
Ya es estable y está listo para producción, se usa en producción en Meta y cuenta con soporte en Babel, Vite, Metro y Rsbuild. Next.js 15.3.1+ admite la ruta de React Compiler invocada por SWC para mejorar el rendimiento de la compilación.
La palabra clave es tiempo de compilación. React Compiler no es una caché en tiempo de ejecución para valores arbitrarios. Se enfoca específicamente en la optimización de re-renderizado de componentes a partir del análisis estático de la estructura de tu código.
Dónde React Compiler maneja la memoización automáticamente
El compilador resuelve los casos comunes de forma limpia:
- Cambios de estado simples: un componente hermano que no dependa del estado modificado no se volverá a renderizar.
- Props con callbacks: las funciones flecha inline pasadas como props se memoizan correctamente, incluso cuando están anidadas.
- Children como props: el famoso y complicado patrón
useMemo(() => <Child />, [])se vuelve innecesario. - Hooks personalizados: los valores de retorno se memoizan según sus dependencias reales.
Vale la pena detenerse en el tercer caso. La mayoría de los desarrolladores lo hace mal manualmente. El compilador lo hace bien automáticamente.
Dónde la memoización manual en React sigue siendo importante
Las pruebas en el mundo real, sobre múltiples bases de código, cuentan una historia más matizada. El compilador maneja bien los componentes aislados y autocontenidos. Tiene dificultades cuando las bibliotecas de terceros devuelven objetos no memoizados.
El ejemplo más claro: el useMutation de React Query devuelve un nuevo objeto en cada renderizado. Si tu callback onDelete depende de deleteCountryMutation en lugar de la función mutate desestructurada directamente, el compilador no puede estabilizarlo. La solución es sencilla una vez que la conoces: desestructura mutate directamente. Pero el compilador no puede tomar esa decisión por ti.
// Compiler-friendly: stable reference
const { mutate: deleteCountry } = useMutation(...)
// Compiler-unfriendly: new object every render
const deleteCountryMutation = useMutation(...)
const onDelete = () => deleteCountryMutation.mutate(name)
Otros casos donde el control manual sigue ganando:
- Dependencias de efectos: cuando necesitas un valor memoizado específicamente para evitar que
useEffectse dispare repetidamente. - Listas dinámicas: las filas renderizadas dentro de
.map()se benefician de extraerse a componentes con nombre con propskeyestables. El compilador optimiza mejor dentro de los componentes que a través de salidas de renderizado inline. - Ajuste de rendimiento tras perfilar: si has medido un cuello de botella concreto, un
useMemoexplícito te da un control preciso que las heurísticas del compilador no pueden igualar.
Discover how at OpenReplay.com.
Cómo deberían cambiar tus hábitos al programar en React
El cambio de modelo mental es directo: deja de memoizar a la defensiva y empieza a memoizar deliberadamente.
Antes del compilador, lo habitual era envolver todo por si acaso. Eso añadía ruido, carga de mantenimiento y, en ocasiones, introducía bugs sutiles (como la trampa de useCallback con funciones flecha inline que la documentación oficial ahora destaca).
Con React Compiler habilitado, el nuevo punto de partida es escribir componentes limpios y simples y dejar que el compilador se encargue de la optimización. Recurre a useMemo o useCallback cuando tengas una razón concreta y medible, no como acto reflejo.
Dos hábitos prácticos que conviene adoptar desde ya:
- Extrae elementos de listas a componentes con nombre:
<CountryRow />en lugar de JSX inline dentro de.map(). - Desestructura valores estables de los hooks de terceros: usa
mutatedirectamente, no el objeto de mutación completo.
La conclusión práctica
React Compiler es una mejora real para la optimización del rendimiento en React. Elimina la mayor parte de la memoización defensiva que abarrotaba las bases de código y maneja el complicado patrón de children como props mejor que la mayoría de los desarrolladores lo hacen manualmente.
Pero no sustituye a entender cómo funcionan los re-renderizados en React. Los desarrolladores que más le sacarán partido al compilador serán los que sigan comprendiendo los compromisos entre useMemo y React Compiler, y sepan cuándo recurrir a cada uno.
Conclusión
React Compiler marca un verdadero punto de inflexión en cómo pensamos el rendimiento en React. El hábito reflejo de envolver cada valor y función en un helper de memoización ya no es el comportamiento por defecto correcto. Escribe código más simple, deja que el compilador haga su trabajo y perfila antes de optimizar manualmente. Mantén la memoización manual en tu caja de herramientas para los casos que el compilador no puede ver, en particular alrededor de hooks de terceros y cuellos de botella medidos. Ese es el enfoque que se sostiene en 2026 y más allá.
Preguntas frecuentes
Sí. El compilador maneja la mayor parte de la memoización defensiva, pero aún necesitas entender estos hooks para los casos que no puede optimizar, como objetos inestables devueltos por bibliotecas de terceros, dependencias de efectos y cuellos de botella de rendimiento medidos. Entender cómo funcionan los re-renderizados también te ayuda a escribir código que el compilador pueda optimizar de forma más efectiva.
No. React Compiler está diseñado para coexistir con las llamadas existentes a useMemo, useCallback y React.memo. Puedes adoptarlo de forma incremental sin eliminar tu memoización actual. Con el tiempo puedes limpiar la memoización manual redundante, pero no hay urgencia por quitarla antes de habilitar el compilador en tu proyecto.
El objeto de mutación que devuelve useMutation tiene una referencia nueva en cada renderizado. El compilador no puede determinar que sus métodos internos son estables, por lo que cualquier callback que dependa del objeto completo se recrea. Desestructurar la función mutate estable directamente desde useMutation resuelve esto y permite que el compilador memoice correctamente los callbacks dependientes.
Soporta Babel, Vite, Metro y Rsbuild, y Next.js 15.3.1 y posteriores lo habilitan a través de SWC. La mayoría de las configuraciones modernas de React pueden adoptarlo con una configuración mínima. Consulta la documentación oficial de React Compiler para la lista actualizada de cadenas de herramientas soportadas y los pasos de configuración específicos de cada framework antes de integrarlo en código de producción.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.