Back to News & Insights
Web Development September 16, 2026 · 5 min read

React 19.3, el compilador y un CVSS 10: lo que cambió mientras no mirabas

Esta semana saqué Create React App de un proyecto y dejé escrito el plan para sacarlo de otro. Los...

React 19.3, el compilador y un CVSS 10: lo que cambió mientras no mirabas

Esta semana saqué Create React App de un proyecto y dejé escrito el plan para sacarlo de otro. Los dos eran de 2022 y 2023, y los dos seguían funcionando. Eso es lo engañoso: seguir funcionando y seguir siendo la forma correcta de hacerlo son cosas distintas, y entre una y otra pasaron cuatro cambios grandes en React que no se enteran solos.

Ninguno es un rumor. Los cuatro están publicados en el blog oficial, con fecha. El compilador ya borra tu useMemo

React Compiler llegó a la versión 1.0 el 7 de octubre de 2025. No es beta, no es experimento: memoriza automáticamente componentes y hooks, funciona en React y en React Native, y se instala con Babel, Vite o Rsbuild.

Lo que eso significa en la práctica es que la mayoría de tus useMemo y useCallback dejaron de ser trabajo tuyo. Los escribías para evitar renders; el compilador hace esa optimización en tiempo de compilación, sin reescribir nada.

Hay un detalle de instalación que se come a mucha gente: si tenías eslint-plugin-react-compiler, ya no va. Se elimina y se usa eslint-plugin-react-hooks@latest, porque las reglas del compilador ahora viajan dentro de sus presets recommended y recommended-latest.

El compilador se apoya en las Reglas de React. Si tu componente las rompe, el compilador lo detecta y se salta ese componente en lugar de optimizarlo mal. Por eso las advertencias del linter dejaron de ser cosmética: ahora determinan si tu código se optimiza o no. Si sirves Server Components, ahora tienes calendario de parches

El 3 de diciembre de 2025, React publicó una vulnerabilidad crítica en React Server Components: CVE-2025-55182, con CVSS 10.0, la puntuación máxima. Un atacante sin autenticar podía mandar una petición HTTP a cualquier endpoint de Server Function que, al deserializarse, lograba ejecución remota de código en el servidor.

Afectaba a react-server-dom-webpack, react-server-dom-parcel y react-server-dom-turbopack en las versiones 19.0, 19.1.0, 19.1.1 y 19.2.0. Se arregló en 19.0.1, 19.1.2 y 19.2.1.

Y la lista de frameworks afectados es la lista de lo que la gente usa: next, react-router, waku, @parcel/rsc, @vitejs/plugin-rsc y rwsdk.

Ocho días después llegó la segunda tanda. El 11 de diciembre se publicaron dos más: Denegación de servicio (CVE-2025-55184, CVE-2025-67779 y CVE-2026-23864, CVSS 7.5): peticiones maliciosas a endpoints de Server Function provocaban bucles infinitos que cuelgan el proceso, se comen el CPU y terminan en caídas o en falta de memoria. Exposición de código fuente (CVE-2025-55183, CVSS 5.3): una petición podía devolver el código de tus Server Functions.

Solo se exponen los secretos escritos a mano en el código. Los que vienen de process.env no. O sea: si alguna vez pegaste una llave directo en un archivo con 'use server' para probar, ese es el archivo.

La conclusión operativa es sencilla y no es sobre React: si tu aplicación sirve Server Components, dejó de ser una dependencia que se actualiza cuando hay tiempo. Y si no usas RSC ni servidor, ninguna de estas te toca. React 19.3 trajo cosas que antes se resolvían fuera de React

Salió el 9 de septiembre de 2026, hace días. te deja animar elementos cuando entran, salen, se mueven o cambian de tamaño, usando la View Transition API del navegador:

React decide qué animación correr según cómo cambió el árbol: entrada, salida, actualización o compartida. Y si necesitas que la misma actualización de estado se anime distinto según por qué ocurrió, addTransitionType marca la causa:

Los refs en Fragment resuelven el problema de querer tocar el DOM de un grupo de elementos sin envolverlo en un div que no necesitabas:

El FragmentInstance trae un conjunto acotado de métodos: addEventListener, removeEventListener, dispatchEvent, focus, focusLast, blur, observeUsing, unobserveUsing, getClientRects, getRootNode, compareDocumentPosition y scrollIntoView.

Ese observeUsing es el que a mí me importa: conectar un IntersectionObserver a una lista sin fabricar un contenedor solo para tener dónde agarrarse.

Durante el renderizado en servidor se muestra el fallback del Suspense más cercano. Cuando el componente hidrata en el cliente, use(browser()) ya no suspende y todo sigue normal. Es la versión oficial del truco del useEffect con isClient que todos hemos escrito.

Want to discuss this further?

Book a free strategy call with our team to see how these insights apply to your specific business goals.

Book a consultation