Lección 10 de 17 · Lectura y práctica
Configurar rutas con streaming dinámico
Concepto claveEl streaming dinámico en Next.js 15 es una técnica que permite enviar partes de una página web al navegador a medida que se generan, en lugar de esperar a que toda la página esté lista. Imagina que estás en un.
Del concepto a la práctica
Taller de esta lección
Una ruta dinámica puede combinar datos propios del segmento con bloques que tardan distinto. Para /informes/equipo-a, el nombre del equipo debe mostrarse de inmediato, mientras el resumen de actividad puede esperar. El límite debe estar dentro de la página, no alrededor de la identificación básica de la ruta.
Ejemplo resuelto
import { Suspense } from 'react'
async function Activity({ team }: { team: string }) { await new Promise(r => setTimeout(r, 150)); return <p>Actividad de {team}: 4 eventos</p> }
export const dynamic = 'force-dynamic'
export default async function Page({ params }: { params: Promise<{ team: string }> }) {
const { team } = await params
return <main><h1>{team}</h1><Suspense fallback={<p>Preparando actividad</p>}><Activity team={team} /></Suspense></main>
}Para equipo-a, el resultado lento conserva el mismo identificador.
Pruébalo
Crea la carpeta dinámica
[team].Espera params y renderiza el encabezado con team.
Pasa ese valor al bloque asíncrono.
Prueba dos equipos distintos.
Comprueba tu resultado
Error frecuente: usar un texto fijo dentro de Activity. Corrígelo pasando el segmento como prop. Resultado esperado: /informes/equipo-a muestra equipo-a en ambos lugares y /informes/equipo-b no reutiliza accidentalmente el nombre anterior.
Segmento dinámico y renderizado dinámico
Una carpeta [team] define el patrón de URL; no demuestra que todo el contenido se calcule en cada solicitud. En esta práctica force-dynamic hace explícita esa intención. Valida los equipos admitidos antes de consultar y devuelve notFound para uno desconocido; texto escapado del segmento no equivale a comprobar su existencia. Si migras a un proyecto con Cache Components, revisa el contrato de renderizado de esa versión en lugar de copiar configuración antigua.

Mapa de prácticaEl servidor puede obtener datos y producir el HTML inicial. El navegador muestra el resultado y ejecuta las interacciones que necesitan estado local. Mantén las claves sensibles en el servidor y define qué parte se ejecuta en cada entorno.
Ver la infografía en tamaño completo ↗Fuentes para profundizar
Concepto clave
El streaming dinámico en Next.js 15 es una técnica que permite enviar partes de una página web al navegador a medida que se generan, en lugar de esperar a que toda la página esté lista. Imagina que estás en un restaurante: en lugar de esperar a que todos los platos de tu mesa estén listos para servirte, el camarero te trae la ensalada primero, luego la sopa y finalmente el plato principal. Cada componente se "sirve" cuando está listo, mejorando la percepción de velocidad.
Esto es especialmente útil cuando tienes componentes que dependen de datos que se cargan a diferentes velocidades. Por ejemplo, en un dashboard de analítica, el gráfico de ventas podría cargarse rápido desde una caché, mientras que los datos de usuarios activos tardan más en consultarse desde una base de datos lenta. Con streaming dinámico, el gráfico aparece inmediatamente, y los datos de usuarios se muestran después sin bloquear la página.
La clave técnica es que Next.js 15 usa Server Components junto con Suspense para delimitar qué partes de la página pueden cargarse de forma independiente. Cuando un componente está envuelto en Suspense, Next.js puede enviar un placeholder (como un spinner) al cliente mientras el componente se renderiza en el servidor, y luego enviar el HTML real cuando esté listo.
Cómo funciona en la práctica
Para configurar rutas con streaming dinámico, sigue estos pasos en tu aplicación Next.js 15:
- Crea una ruta en el App Router, por ejemplo
/app/dashboard/page.tsx. - Importa
Suspensedesde'react'. - Envuelve los componentes que tienen carga de datos lenta dentro de
<Suspense fallback={...}>. - Usa funciones asíncronas en Server Components para cargar datos, como
fetch()con caché configurada. - Next.js automáticamente manejará el streaming, enviando primero los componentes fuera de Suspense, luego los placeholders, y finalmente los componentes cargados.
Ejemplo básico:
import { Suspense } from 'react';
export default function DashboardPage() {
return (
<div>
<h1>Dashboard</h1>
<!-- Componente rápido -->
<UserGreeting />
<!-- Componente lento con streaming -->
<Suspense fallback={<div>Cargando ventas...</div>}>
<SalesChart />
</Suspense>
<!-- Otro componente lento -->
<Suspense fallback={<div>Cargando analítica...</div>}>
<AnalyticsData />
</Suspense>
</div>
);
}
async function SalesChart() {
const sales = await fetchSalesData(); // Datos lentos
return <Chart data={sales} />;
}Caso de estudio
Imagina que estás construyendo una aplicación de e-commerce con Next.js 15. La página de producto (/app/product/[id]/page.tsx) necesita mostrar:
- Información básica del producto (nombre, precio) - carga rápida desde una base de datos en memoria.
- Reseñas de usuarios - carga lenta desde un API externo con alta latencia.
- Productos relacionados - carga media desde una caché Redis.
Configuras el streaming dinámico así:
export default async function ProductPage({ params }: { params: { id: string } }) {
const productId = params.id;
return (
<div>
<ProductHeader productId={productId} /> // Fuera de Suspense, carga rápido
<Suspense fallback={<div>Cargando reseñas...</div>}>
<ProductReviews productId={productId} /> // Lento
</Suspense>
<Suspense fallback={<div>Cargando productos relacionados...</div>}>
<RelatedProducts productId={productId} /> // Medio
</Suspense>
</div>
);
}Resultado: el usuario ve el encabezado del producto inmediatamente, luego un placeholder para reseñas, y poco después los productos relacionados aparecen. Las reseñas se muestran al final, pero la página ya es interactiva. Esto mejora el First Contentful Paint (FCP) y la percepción de rendimiento.
En pruebas reales, el streaming dinámico puede reducir el Time to Interactive hasta un 40% en páginas con múltiples fuentes de datos lentas.
Errores comunes
- No usar Suspense para componentes asíncronos: Si tienes un Server Component que hace
awaitdirectamente en el cuerpo, sin Suspense, la página entera esperará a que se resuelva. Solución: siempre envuelve componentes con carga de datos en Suspense. - Placeholders muy pesados: Usar un fallback complejo (como un gráfico animado grande) puede ralentizar el streaming. Solución: mantén los placeholders simples, como un texto o un spinner básico.
- Streaming en componentes que no lo necesitan: Aplicar Suspense a componentes que cargan datos rápidos (ej., desde una caché local) añade overhead innecesario. Solución: analiza los tiempos de carga y usa streaming solo para componentes con latencia >100ms.
- Olvidar manejar errores: Si un componente dentro de Suspense falla, puede romper el streaming. Solución: usa
error.jsen Next.js o envuelve en try-catch dentro del componente. - No optimizar el orden de streaming: Colocar componentes críticos (como un botón de compra) dentro de Suspense puede retrasar la interactividad. Solución: prioriza componentes fuera de Suspense para lo esencial.
Checklist de dominio
- Identifiqué al menos un componente en mi app que se beneficia de streaming dinámico por su carga lenta.
- Envuelvo componentes asíncronos en Suspense con un fallback apropiado.
- Uso Server Components para la carga de datos, no Client Components.
- Mido el impacto del streaming en métricas como FCP y LCP usando herramientas como Lighthouse.
- Configuro manejo de errores para componentes en streaming (ej., con error boundaries).
- Optimizo el orden de los componentes para que lo crítico cargue primero.
- Evito over-streaming: solo aplico a componentes con latencia significativa.
Implementar streaming dinámico en una página de blog
En este ejercicio, mejorarás una página de blog existente en Next.js 15 usando streaming dinámico para cargar comentarios y datos de autor por separado.
- Crea un nuevo proyecto Next.js 15 o usa uno existente con el App Router habilitado.
- En
/app/blog/[slug]/page.tsx, define una estructura básica que muestre: título del post, contenido, autor y comentarios. - Simula datos lentos: crea una función
fetchComments(slug: string)que devuelva una promesa con un retraso de 2 segundos (usasetTimeout). - Envuelve la sección de comentarios en
Suspensecon un fallback que diga "Cargando comentarios...". - Haz lo mismo para los datos del autor, pero con un retraso de 1 segundo.
- Ejecuta la app en desarrollo (
npm run dev) y navega a un post. Verifica que el título y contenido aparezcan primero, luego el autor, y finalmente los comentarios. - Opcional: usa la pestaña Network en DevTools para observar cómo se transmiten los chunks de HTML.
Pistas
- Recuerda que los Server Components en Next.js 15 pueden ser asíncronos por defecto, no necesitas useEffect.
- Usa
async/awaitdentro de los componentes para simular la carga de datos. - Asegúrate de que el fallback en Suspense sea un elemento React válido, como un div con texto.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Next.js 15: Aplicaciones Full-Stack con Server Components y Streaming SSR
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.