Lección 11 de 17 · Lectura y práctica
Práctica: Implementar streaming en una app de blog
Tipo de lección: VideoConcepto claveEl streaming SSR en Next.js 15 es como un restaurante que sirve la comida por partes mientras se cocina, en lugar de esperar a que todo esté listo. Tradicionalmente, el servidor renderizaba.
Del concepto a la práctica
Taller de esta lección
En un blog, el contenido editorial debe tener prioridad sobre los comentarios. Diseñaremos una página que entrega título y cuerpo desde un registro rápido, y deja las reseñas en un bloque separado. Así el lector puede empezar a leer aunque la segunda consulta no haya terminado.
Ejemplo resuelto
import { Suspense } from 'react'
const post = { title: 'Rutas claras', body: 'El servidor prepara el artículo.' }
async function Reviews() { await new Promise(r => setTimeout(r, 180)); return <p>3 reseñas</p> }
export default function Blog() { return <article><h1>{post.title}</h1><p>{post.body}</p><Suspense fallback={<p>Reseñas pendientes</p>}><Reviews /></Suspense></article> }El contenido principal no depende de la espera artificial.
Pruébalo
Sustituye
postpor tres registros seleccionables.Mantén las reseñas en un componente asíncrono.
Usa un fallback que nombre la sección.
Registra el orden visual observado.
Comprueba tu resultado
Error frecuente: hacer que el artículo espere a las reseñas antes de renderizar. Corrígelo colocando Suspense solo alrededor de Reviews. Resultado esperado: título y cuerpo aparecen primero; durante la espera aparece Reseñas pendientes; después se muestra 3 reseñas.
Observación en tiempo de solicitud
Para observar reseñas en cada visita del blog de práctica, usa force-dynamic en la página del ejemplo Next.js 15. Sin esa decisión, la generación previa puede resolver la espera durante la compilación y entregar contenido ya completo. Mide la versión de producción con el mismo artículo y red: el fallback puede quedar oculto por buffering y no implica que la sección haya tardado exactamente 180 ms en pantalla.

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
Tipo de lección: Video
Concepto clave
El streaming SSR en Next.js 15 es como un restaurante que sirve la comida por partes mientras se cocina, en lugar de esperar a que todo esté listo. Tradicionalmente, el servidor renderizaba toda la página antes de enviarla al cliente, lo que causaba tiempos de carga largos. Con streaming, el servidor envía partes de la página a medida que están disponibles, mejorando la percepción de rendimiento y la experiencia del usuario.
Imagina que estás construyendo una app de blog: la cabecera y el menú pueden cargarse inmediatamente, mientras que los posts más pesados o los comentarios se envían después. Esto se logra usando Suspense y componentes asíncronos en Server Components. El flujo es: el servidor genera un stream de HTML, el cliente lo recibe progresivamente y React hidrata los componentes cuando llegan. Esto es crucial para páginas con datos dinámicos o APIs lentas, donde no quieres que el usuario espere inactivo.
Cómo funciona en la práctica
Para implementar streaming en Next.js 15, sigue estos pasos en tu app de blog:
- Crea un componente de servidor asíncrono que obtenga datos, por ejemplo, para listar posts. Usa
async function BlogPosts()confetcho una librería como Prisma. - Envuelve este componente en
<Suspense fallback={...}>en tu página. El fallback muestra un indicador de carga (como un esqueleto) mientras se cargan los datos. - Configura tu ruta en el App Router (por ejemplo,
app/blog/page.tsx) para usar Server Components por defecto. Next.js 15 optimiza automáticamente el streaming cuando detecta componentes asíncronos. - Prueba con datos simulados lentos: usa
await new Promise(resolve => setTimeout(resolve, 2000))para simular una API que tarda 2 segundos, y observa cómo el fallback aparece inmediatamente.
Ejemplo de código básico:
// app/blog/page.tsx
export default function BlogPage() {
return (
<div>
<h1>Mi Blog</h1>
<Suspense fallback={<p>Cargando posts...</p>}>
<BlogPosts />
</Suspense>
</div>
);
}
async function BlogPosts() {
const posts = await fetchPosts(); // Función asíncrona
return (
<ul>
{posts.map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}Caso de estudio
En una app de blog real, como Medium o Dev.to, el streaming SSR se aplica para secciones críticas. Supongamos que tienes una página de blog con estos elementos:
| Sección | Tipo de dato | Tiempo estimado de carga | Uso de streaming |
|---|---|---|---|
| Cabecera y navegación | Estático | 0.1s | Carga inmediata sin Suspense |
| Lista de posts | Dinámico (API) | 1.5s | Envuelta en Suspense con fallback |
| Comentarios | Dinámico (base de datos) | 2s | Otro Suspense separado |
| Sidebar de tendencias | Dinámico (cache) | 0.5s | Streaming opcional para prioridad baja |
Al implementar esto, la página empieza a renderizar en menos de 0.5s, mostrando la cabecera y un esqueleto para los posts. Luego, los posts aparecen a los 1.5s, y los comentarios a los 2s. Esto mejora el First Contentful Paint y mantiene al usuario comprometido. En producción, combínalo con Server Actions para manejar formularios de comentarios sin recargar la página.
Dato importante: Según benchmarks de Next.js, el streaming puede reducir el Time to Interactive hasta un 30% en apps con datos pesados, comparado con SSR tradicional.
Errores comunes
- No usar fallbacks adecuados: Si omites el prop
fallbacken Suspense, el usuario verá un espacio vacío. Siempre incluye un indicador de carga simple, como un spinner o esqueleto HTML. - Anidar Suspense innecesariamente: Envolver cada componente pequeño en Suspense añade overhead. Agrupa componentes lógicos (por ejemplo, todos los posts juntos) para minimizar los límites de streaming.
- Ignorar el orden de carga: Los componentes se stream en el orden del árbol React. Si un componente lento está arriba, bloquea los de abajo. Reorganiza para cargar primero lo crítico.
- No manejar errores en streaming: Usa
error.jsen Next.js para capturar fallos en componentes asíncronos, mostrando un mensaje amigable en lugar de romper la página. - Olvidar optimizar datos: Streaming no es excusa para APIs lentas. Usa caching (por ejemplo, con
fetchy revalidate) o paginación para reducir tiempos.
Checklist de dominio
- ¿Puedes crear un Server Component asíncrono que obtenga datos de una API o base de datos?
- ¿Sabes envolver componentes en Suspense con un fallback visualmente útil?
- ¿Entiendes cómo priorizar el streaming de secciones críticas sobre las menos importantes?
- ¿Puedes medir el impacto del streaming usando herramientas como Lighthouse o Chrome DevTools?
- ¿Eres capaz de integrar streaming con Server Actions para operaciones de datos en tiempo real?
- ¿Sabes evitar errores comunes como anidación excesiva o falta de manejo de errores?
- ¿Puedes explicar la diferencia entre streaming SSR y SSR tradicional en términos de experiencia de usuario?
Implementar streaming en una página de blog con Next.js 15
En este ejercicio, construirás una página de blog que use streaming SSR para cargar posts y comentarios progresivamente. Sigue estos pasos:
- Crea un nuevo proyecto Next.js 15 con TypeScript usando
npx create-next-app@latesty selecciona el App Router. - En
app/blog/page.tsx, define un componente asíncronoBlogPostsque simule una API lenta: usaawait new Promise(resolve => setTimeout(resolve, 2000))y devuelve una lista de 3 posts con título y contenido. - Envuelve
BlogPostsen<Suspense>con un fallback que muestre<p>Cargando posts...</p>. - Añade un segundo componente asíncrono
Commentsque simule cargar comentarios en 3 segundos, y envuélvelo en otro Suspense con su propio fallback. - Ejecuta la app con
npm run dev, navega a /blog, y observa cómo los posts y comentarios cargan por separado. Usa Chrome DevTools en la pestaña Network para ver el streaming en acción. - Opcional: Añade un botón con una Server Action para agregar un comentario, y prueba cómo el streaming se integra con actualizaciones en tiempo real.
Pistas
- Recuerda que los Server Components en Next.js 15 son asíncronos por defecto; no necesitas configurar nada extra para streaming.
- Usa múltiples componentes Suspense para controlar la carga independiente de secciones, pero evita anidarlos si no es necesario.
- Si no ves el streaming, verifica que estás usando fetch o funciones asíncronas dentro de los componentes, no en el nivel superior de la página.
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.