Arquitectura general y fases de una aplicación Next.js
Explica las fases de una aplicación Next.js desde desarrollo y build hasta request, render de servidor, streaming, hidratación y navegación cliente.
Última actualización
Actualizada
Nivel
Fundamentos
Una aplicación Next.js no se ejecuta una sola vez ni en un único entorno. Parte del trabajo ocurre durante el build, otra parte cuando llega una petición, otra durante el render de React en servidor y otra después de que el navegador recibe e hidrata la interfaz. Separar estas fases es imprescindible para comprender datos, caché, variables de entorno y errores.
Cuando escribes un componente dentro de app, su código puede participar en varios momentos:
Texto
desarrollo
↓
build
↓
prerendering opcional
↓
request o navegación
↓
render de servidor
↓
stream de respuesta
↓
hidratación cliente
↓
interacciones y futuras navegaciones
No todo componente atraviesa todas las fases. Una página completamente estática puede quedar preparada durante el build. Una ruta que lee cookies se resuelve en cada request. Un Client Component puede generar HTML inicial en servidor y después hidratarse en navegador. Un Route Handler puede devolver JSON sin renderizar una página.
El error mental frecuente consiste en reducir todo a “servidor” y “cliente”. Next.js también distingue cuándo se ejecuta y qué artefacto produce cada paso.
Sin separar fases, aparecen afirmaciones engañosas:
“Esta variable se lee en el servidor, por lo tanto cambia en cada request”. Puede haber sido incorporada durante build.
“Este componente tiene use client, por lo tanto solo se renderiza en el navegador”. También puede participar en el HTML inicial.
“La página es Server Component, por lo tanto siempre es dinámica”. Puede prerenderizarse.
“Hice router.refresh(), por lo tanto limpié toda la caché”. Refresh solicita una nueva representación, pero no invalida automáticamente todas las capas.
“El código no usa window, entonces nunca llega al cliente”. Si pertenece al grafo importado por una boundary cliente, puede terminar en el bundle.
El modelo por fases permite localizar una decisión en el momento correcto.
Dependiendo de dónde se use, el valor puede incorporarse al output durante build o leerse desde el runtime servidor. Las variables expuestas mediante prefijos públicos terminan en código cliente y deben considerarse públicas.
La decisión depende de las APIs y configuración actuales. Leer información específica de la petición, como cookies o headers, suele requerir request time. Las reglas exactas han cambiado entre versiones; no memorices una lista antigua sin revisar la documentación actual.
browser
↓
CDN / proxy de plataforma
↓
Next.js Proxy, redirects y rewrites
↓
router
↓
cache hit o ejecución
Según la URL y método, el destino puede ser:
Una página del App Router.
Una página del Pages Router.
Un Route Handler.
Un asset estático.
Una imagen optimizada.
Un redirect o rewrite.
Una respuesta cacheada.
No toda petición ejecuta React. Un archivo en public puede servirse directamente; un endpoint puede devolver JSON; una respuesta prerenderizada puede salir de caché.
Cuando el usuario utiliza <Link>, Next.js puede evitar una recarga completa:
Texto
click en Link
↓
router cliente
↓
RSC request / datos prefetched
↓
React reconcilia nuevo árbol
↓
layouts compatibles se preservan
La navegación puede reutilizar segmentos y estado cliente existente. Una carga directa de la misma URL comienza desde un documento nuevo y no tiene el historial de slots o rutas interceptadas de la navegación anterior.
Un dato calculado en servidor puede filtrarse si se pasa como prop a un Client Component o se incluye en una respuesta. El hecho de que el código fuente permanezca en servidor no protege los datos enviados.
Aporta APIs y paquetes del ecosistema Node. Es la opción general para acceso a bases de datos, filesystem permitido por la plataforma y librerías de servidor.
Una llamada de envío de correo dentro de código ejecutado al prerenderizar podría repetirse al construir. El build debe producir artefactos, no realizar acciones de negocio irreversibles.