Next.js 16.3: el 90% menos de memoria es real, pero no es tuyo
El portátil empezó a hacer ese ruido. El del ventilador que ya no refrigera, solo pide ayuda.
Dos horas con next dev abierto, saltando entre rutas de un checkout. 14 GB de RAM. Un servidor de desarrollo comiéndose catorce gigas.
Maté el proceso. Lo levanté. A los diez minutos iba otra vez por seis y subiendo.
Ese ha sido el peaje de trabajar en local durante años: cuanto más rato llevas, peor va todo, y el arreglo es reiniciar.
Next.js 16.3 llegó estable el 3 de agosto de 2026 apuntando justo ahí. El titular que circula desde entonces: «90% menos memoria y builds 5,5× más rápidos».
Las dos cifras son ciertas. Y las dos son el mejor caso medido por Vercel en sus propias aplicaciones.
La release es buena de verdad y no necesita ese titular. Lo mejor de 16.3 no es el número grande: es cuánto llega activado por defecto, sin que toques una línea de tu código.
Qué trae Next.js 16.3 de un vistazo
| Novedad | ¿Por defecto? | Qué aporta |
|---|---|---|
| Memory eviction en Turbopack | Sí | Hasta 90% menos RAM en next dev (mejor caso medido) |
Caché en disco en next build |
Sí | Compilación de Turbopack 1,4× a 5,5× más rápida |
| SSR con streams nativos de Node | Sí | Hasta 22% más peticiones bajo carga |
| Agrupado de prefetches pequeños | Sí | Menos peticiones por navegación |
| Type checking con TypeScript 7 | Solo subir la dependencia | Compilador nativo en next build |
Docs versionadas en AGENTS.md |
Sí | El agente lee la doc de tu versión instalada |
| React Compiler en Rust | No — experimental | 34% más rápido en frío, 46% en caliente |
| Cache Components y Partial Prefetching | No — opt-in | Navegación instantánea |
De dónde sale el 90% menos de memoria en Turbopack
El memory eviction es la capacidad de Turbopack de liberar de la RAM las partes del grafo de módulos que no está usando y recuperarlas del disco cuando vuelven a hacer falta. Eso es lo nuevo de 16.3.
Funciona junto con la caché en disco para desarrollo, que llegó en 16.1. Por eso las dos van de la mano: sin caché en disco, evictar sería volver a compilar desde cero.
Estas son las mediciones oficiales, tomadas después de compilar 50 rutas:
| Aplicación | Antes | Con 16.3 | Reducción |
|---|---|---|---|
| vercel.com (dashboard) | 21,5 GB | 2 GB | ~90% |
| nextjs.org | 4.600 MB | 840 MB | ~82% |
Fíjate en la aplicación grande: partir de 21,5 GB solo es posible en una máquina de 32 o 64 GB. La mayoría de proyectos no llegan ahí ni queriendo.
Y esto es lo que dice el propio equipo de Turbopack en su post de la release, y que casi nunca sobrevive al resumen:
No existe un único porcentaje de reducción aplicable a todas las aplicaciones. Los resultados individuales dependen del tamaño del grafo de rutas, de cuánto se haya recorrido durante la sesión de desarrollo y de cuánto tiempo llevara la sesión ejecutándose.
Traducido a tu día a día: si tu proyecto tiene 12 rutas y reinicias el servidor cada media hora, no vas a ver un 90%. Vas a ver una mejora modesta, porque nunca llegaste a acumular la basura que el eviction limpia.
El 90% lo notan los monorepos con cientos de rutas y las sesiones de ocho horas sin reiniciar. Que, siendo justos, es exactamente donde dolía.
Si algo se rompe raro, tienes la salida:
// next.config.ts
import type { NextConfig } from 39;next39;
const nextConfig: NextConfig = {
experimental: {
// el valor por defecto es 'full'
turbopackMemoryEviction: false,
},
}
export default nextConfig
Por qué el next build 5,5× más rápido es el mejor de tres casos medidos
El 5,5× no es la mejora media de la release: es la mejor de las tres aplicaciones que Vercel midió.
La caché en disco que aceleraba next dev desde 16.1 ahora funciona también en next build. Y en la versión estable viene activada por defecto — ojo si leíste el post del preview de junio, donde todavía era el flag opt-in turbopackFileSystemCacheForBuild. Cambió al estabilizar.
Estos son los tiempos de compilación de Turbopack dentro de next build, de frío a con caché:
| Aplicación | Build en frío | Con caché | Mejora |
|---|---|---|---|
| nextjs.org | 21 s | 9,2 s | ~2,3× |
| vercel.com/home | 66 s | 46 s | ~1,4× |
| vercel.com/geist | 30 s | 5,5 s | ~5,5× |
El 5,5× existe. Es la última fila. También existe el 1,4×, que es la aplicación más parecida a un proyecto real con integraciones, y es la que menos se cita.
El rango honesto de esta release es 1,4× a 5,5×, y dónde caigas tú depende de cuánto de tu grafo cambie entre build y build. Si tocas un archivo compartido que arrastra media aplicación, la caché te sirve de poco. Si tocas una página hoja, te sirve muchísimo.
Dos detalles antes de que alguien te enseñe la tabla en una reunión.
La cifra es el tiempo de compilación de Turbopack, no el next build completo: sigues teniendo type checking, generación de páginas estáticas y el resto del pipeline por delante.
Y la caché no existe en el primer build. Necesitas una ejecución previa. En local eso pasa solo. En CI, no.
En CI la caché no aparece por arte de magia
Cada job arranca en un contenedor limpio. Si no persistes nada, siempre estás midiendo el build en frío y esta mejora no la ves jamás.
Lo que hay que persistir es .next/cache, que es donde Turbopack escribe su caché de build. Esta es la configuración que da la documentación oficial de CI build caching para GitHub Actions:
- uses: actions/cache@v4
with:
path: |
~/.npm
${{ github.workspace }}/.next/cache
# Genera caché nueva cuando cambian dependencias o fuentes
key: ${{ runner.os }}-nextjs-${{ hashFiles(39;**/package-lock.json39;) }}-${{ hashFiles(39;**/*.js', '**/*.jsx39;, 39;**/*.ts', '**/*.tsx39;) }}
# Si cambió el código pero no las dependencias, reconstruye desde una caché previa
restore-keys: |
${{ runner.os }}-nextjs-${{ hashFiles(39;**/package-lock.json39;) }}-
restore-keys es la línea que casi todo el mundo se deja. Sin ella solo recuperas la caché cuando la clave coincide exacta, y como la clave incluye el hash de tus fuentes, eso no pasa nunca en un commit nuevo: siempre medirías builds en frío.
Y no caches .next entero. Ahí vive también la salida del build, que next build regenera igualmente, así que solo consigues subir y bajar cientos de megas por job y comerte antes la cuota de caché del repositorio — que expulsa entradas viejas cuando se llena. Acabas perdiendo justo la caché que querías conservar.
El React Compiler en Rust es experimental, y la letra pequeña importa
Han reescrito el React Compiler en Rust y lo han integrado en Turbopack. Va detrás de dos flags:
// next.config.ts
const nextConfig: NextConfig = {
reactCompiler: true,
experimental: {
turbopackRustReactCompiler: true,
},
}
Contra la aplicación de v0 midieron un 34% más rápido en frío y un 46% en caliente. Dos precisiones antes de que lo actives.
La métrica es el tiempo desde que lanzas next dev hasta que la página está lista, no «tiempos de build de página». Es arranque de desarrollo, no producción.
Y el post oficial avisa: esas ganancias asumen que has abandonado Babel por completo. Si sigues ejecutando Babel para otras transformaciones, el compilador en Rust ayuda, pero la ganancia es menor.
Si todavía arrastras un .babelrc para i18n o para decoradores, el 46% no es tuyo. La ganancia real no es Rust: es salir de Babel. Rust solo hace que salir de Babel merezca todavía más la pena.
Es experimental. Yo lo activaría en una rama, mediría y decidiría. No en el pipeline del viernes.
Lo que mejora en Next.js 16.3 sin que hagas absolutamente nada
Tres mejoras no piden ni un flag ni una línea de código. Es la parte que más me gusta de la release, y la menos vistosa.
Type checking con TypeScript 7. next build ya soporta el compilador nativo y solo tienes que subir la dependencia con pnpm add -D typescript@^7. Sobre por qué esto cambia tanto los tiempos escribí en TypeScript 7 y el compilador en Go.
SSR más rápido. Han sustituido las web streams por streams nativos de Node en la capa de render del App Router. Resultado: hasta un 22% más de peticiones bajo carga, cero cambios en tu código, menos overhead por request en la capa que ya usas si trabajas con React Server Components en producción.
Documentación versionada para agentes de IA. next dev escribe y mantiene un bloque en tu AGENTS.md que apunta a los docs del node_modules del propio proyecto. Tu agente deja de inventarse APIs de la versión equivocada porque lee la documentación de la versión que tienes instalada. Vercel ha retirado sus Skills anteriores: para esto ya no hacen falta.
Y esto importa más de lo que parece. Cuando un agente te genera código Next.js que no compila, muchas veces no es el modelo: es que aprendió de tutoriales de tres versiones atrás. Anclar el contexto a la versión instalada es la misma disciplina que aplico en Construye con IA: el agente no necesita más inteligencia, necesita mejor contexto.
Y una cuarta que también llega sola: los prefetch por debajo de cierto tamaño se agrupan, así que tu app hace menos peticiones sin que cambies nada.
Lo demás que trae 16.3 son APIs nuevas que sí tienes que escribir tú: catchError para error boundaries que ya no interfieren con notFound ni redirect, import.meta.glob al estilo Vite (solo con Turbopack) y root params con import { lang } from 'next/root-params' para dejar de pasar el idioma por props. Reutilizar assets estáticos inmutables entre despliegues también es opt-in, no automático.
La otra mitad de la release
Todo lo de arriba llega solo con actualizar. La otra mitad de 16.3 no: hay que activarla a mano y decidir dónde.
Hablo de Cache Components, Partial Prefetching, el Navigation Inspector y el helper instant() de Playwright. Se activa con dos flags:
// next.config.ts
const nextConfig: NextConfig = {
cacheComponents: true,
partialPrefetching: true,
}
Lo cubrí cuando la versión estaba en preview, en cómo conseguir navegaciones instantáneas con Cache Components. Ese es el siguiente paso.
Qué hacer hoy
Actualizar es un minor sin cambios de API:
npm install next@latest
Pero antes, haz lo que casi nadie hace: mide.
Anota cuánta RAM consume tu next dev tras una hora de trabajo normal y cuánto tarda tu next build en CI. Dos números en una nota. Actualiza, trabaja una semana y vuelve a mirarlos.
El debate no es si el 90% es real — lo es, en el dashboard de Vercel. El debate es cuánto es en tu proyecto. Y esa cifra no la tiene el blog oficial: la tienes tú, y solo si la mediste antes.
Escribir lo que esperas antes de ejecutarlo y contrastarlo después es lo mismo que defiendo en el libro de Spec-Driven Development: sirve igual para una feature que para actualizar un framework. Y si quieres contrastar números con gente que está actualizando esta misma semana, esas conversaciones están en Dominicode Labs.
Preguntas frecuentes
¿De verdad Next.js 16.3 usa un 90% menos de memoria?
En el mejor caso medido, sí: el dashboard de vercel.com pasó de 21,5 GB a 2 GB tras compilar 50 rutas. En nextjs.org la reducción fue del 82%, de 4.600 MB a 840 MB. El equipo de Turbopack advierte de que no existe un porcentaje único aplicable a todas las aplicaciones, porque depende del tamaño del grafo de rutas, de cuánto se recorra durante la sesión y de cuánto tiempo lleve el servidor levantado. Proyectos pequeños con reinicios frecuentes verán mejoras mucho menores.
¿Tengo que cambiar código para aprovechar Next.js 16.3?
No para la mayor parte. El memory eviction, la caché en disco en next build, los streams nativos de Node en SSR y el agrupado de prefetches vienen activados por defecto. TypeScript 7 requiere únicamente subir la dependencia. Solo son opt-in el React Compiler en Rust, que además es experimental, y las features de navegación instantánea como Cache Components.
¿Actualizar a Next.js 16.3 rompe algo?
Es una versión minor y no trae cambios de API que obliguen a tocar tu código. Lo que sí cambia es el comportamiento en tiempo de ejecución, porque el memory eviction y la caché de build llegan activados por defecto. Si tras actualizar ves recompilaciones inesperadas o rarezas en el HMR, el escape es experimental.turbopackMemoryEviction: false, y luego reportarlo.
¿El build 5,5× más rápido aplica también al primer build?
No. La cifra compara un build en frío contra uno posterior que reutiliza la caché en disco, así que necesitas una ejecución previa. El rango real medido por Vercel va de 1,4× en vercel.com/home a 5,5× en vercel.com/geist, y corresponde al tiempo de compilación de Turbopack, no al next build completo con type checking y generación de páginas.
¿Cómo aprovecho la caché de build en CI?
Persistiendo .next/cache entre ejecuciones, que es donde Turbopack guarda su caché de build. En GitHub Actions se hace con actions/cache apuntando a ~/.npm y a ${{ github.workspace }}/.next/cache, con una key que incluya el hash del lockfile y de tus fuentes, y restore-keys con el prefijo del lockfile para poder reconstruir desde una caché previa. No caches .next entero: el resto del directorio lo regenera next build de todas formas y solo te come cuota.
¿Y si mi proyecto sigue compilando con webpack?
Las dos mejoras del titular son de Turbopack: el memory eviction y la caché en disco para next build no existen fuera de él. Lo que sí obtienes sin depender del bundler son los streams nativos de Node en SSR y el type checking con TypeScript 7, porque ocurren en la capa de render y en el paso de tipos, no en el empaquetado. import.meta.glob tampoco funciona fuera de Turbopack.
¿Merece la pena activar el React Compiler en Rust?
Depende de si sigues usando Babel. Medido contra la aplicación de v0 es un 34% más rápido en frío y un 46% en caliente —la métrica es el tiempo desde next dev hasta tener la página lista, no un build de producción—, pero el post oficial aclara que esas ganancias asumen haber abandonado Babel por completo; si lo mantienes para otras transformaciones, la ganancia es menor. Sigue siendo experimental: actívalo en una rama y mide antes de meterlo en tu pipeline principal.
Por Bezael Pérez — Developer senior con más de 15 años de experiencia y fundador de Dominicode.
