CodeForge

React 19 de Cero a Experto / React 19 moderno

El compilador de React: adiós al useMemo manual

Teoría22 min20 XP

Durante años, escribir React rápido significaba optimizar los re-renders A MANO con tres herramientas: memo, useMemo y useCallback. Era tedioso, fácil de equivocar, y llenaba el código de ruido. El COMPILADOR de React (React Compiler) cambia eso: analiza tu código y aplica esas optimizaciones automáticamente, para que las escribas… nunca. Hoy entiendes primero POR QUÉ existían esas herramientas (para saber qué te quita de encima el compilador) y luego cómo funciona la nueva era.

El problema: re-renders en cascada

Las tres herramientas manuales (el mundo de antes)

Por qué era un dolor

memoizacion-manual.tsx
// El "impuesto" de la memoización manual: ruido por todas partes
const Lista = memo(function Lista({ items, alBorrar }: Props) {
// useMemo para no recalcular en cada render
const ordenados = useMemo(() => [...items].sort((a, b) => b.valor - a.valor), [items]);
return <ul>{ordenados.map((i) => <li key={i.id} onClick={() => alBorrar(i.id)}>{i.nombre}</li>)}</ul>;
});

function App() {
const [items, setItems] = useState<Item[]>([]);
// useCallback para que 'borrar' no cambie de referencia y rompa el memo de <Lista>
const borrar = useCallback((id: number) => {
  setItems((prev) => prev.filter((i) => i.id !== id));
}, []);
return <Lista items={items} alBorrar={borrar} />;
}

Mira cuánta ceremonia: memo envolviendo el componente, useMemo para el orden, useCallback para la función, cada uno con su array de dependencias que hay que mantener correcto. Olvidar una dependencia introduce bugs sutiles; poner memoización de más gasta esfuerzo sin beneficio. Decidir QUÉ memoizar y CÓMO era una carga constante para el desarrollador —un impuesto sobre cada componente que quisieras rápido—.

El compilador: lo hace por ti

Honestidad sobre el estado actual

¿Qué problema resuelven memo/useMemo/useCallback, y qué cambia con el compilador de React?

Mini-reto

Razona (en papel): tienes un <Padre> con un contador en useState y un <HijoPesado> que recibe una prop datos que NO cambia cuando el contador sube. 1) ¿Por qué <HijoPesado> re-renderiza al subir el contador aunque sus datos no cambien? 2) ¿Cómo lo evitarías a mano con memo (y qué pasa si datos fuera un objeto creado en el render del padre)? 3) ¿Qué haría el compilador de React aquí sin que escribas nada? Explica el papel de la igualdad referencial en las tres respuestas.

Qué sigue

Cierras el módulo con un reto que junta las ideas de React 19 en una "Mi Bolsillo" con envío OPTIMISTA: el gasto aparece al instante y se confirma o revierte. Lo construyes con las herramientas que ya corren en tu entorno, y la solución te muestra cómo lo expresarían useActionState y useOptimistic en un proyecto React 19 real —el puente entre lo que practicaste y el React del futuro—.