Concepto clave
El Streaming SSR 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 el servidor, 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. Esto mejora la percepción de velocidad para el usuario, ya que puede empezar a interactuar con la página antes de que esté completamente cargada.
Este enfoque es especialmente útil para páginas con secciones que dependen de datos lentos, como consultas a APIs externas o bases de datos. En Next.js 15, se implementa usando Suspense junto con componentes de servidor, lo que permite definir límites de carga para diferentes partes de la interfaz. La clave está en dividir la página en chunks independientes que se pueden transmitir y renderizar progresivamente.
Cómo funciona en la práctica
Para implementar Streaming SSR en Next.js 15, sigue estos pasos en un componente de servidor:
- Envuelve las secciones de tu página que dependen de datos asíncronos en un componente
<Suspense>. - Dentro de
<Suspense>, usaawaitpara cargar los datos, y define unfallbackque se muestre mientras se carga. - Next.js enviará primero el HTML estático y el fallback, luego transmitirá los chunks de datos a medida que estén disponibles.
Ejemplo básico:
export default async function Page() {
return (
<div>
<h1>Dashboard</h1>
<Suspense fallback={<p>Cargando datos lentos...</p>}>
<SlowDataSection />
</Suspense>
<FastSection />
</div>
);
}
async function SlowDataSection() {
const data = await fetchSlowData(); // Llamada lenta
return <p>Datos: {data}</p>;
}
function FastSection() {
return <p>Esta sección se carga rápido.</p>;
}Caso de estudio
Considera una aplicación de e-commerce con una página de producto que incluye: título, precio, galería de imágenes, reseñas de usuarios, y productos recomendados. Las reseñas y recomendaciones dependen de APIs externas que pueden tardar hasta 2 segundos en responder.
| Sección | Tipo de dato | Tiempo estimado de carga | Estrategia con Streaming SSR |
|---|---|---|---|
| Título y precio | Estático | 0 ms | Enviado inmediatamente |
| Galería de imágenes | Assets locales | 100 ms | Enviado con el chunk inicial |
| Reseñas de usuarios | API externa lenta | 2000 ms | Envuelta en Suspense con fallback |
| Productos recomendados | API externa lenta | 1500 ms | Envuelta en Suspense separado |
Al usar Streaming SSR, el usuario ve el título, precio y galería casi al instante, mientras que las reseñas y recomendaciones se cargan progresivamente. Esto reduce el First Contentful Paint y mejora la experiencia, especialmente en conexiones lentas.
En pruebas reales, Streaming SSR puede reducir el tiempo percibido de carga en un 40-60% para páginas con datos asíncronos.
Errores comunes
- No usar fallbacks adecuados: Si omites el prop
fallbacken<Suspense>, el usuario puede ver un espacio en blanco. Siempre proporciona un indicador de carga simple, como un spinner o texto. - Anidar demasiados componentes Suspense: Esto puede fragmentar excesivamente la página y aumentar la complejidad. Agrupa secciones relacionadas en un solo Suspense cuando sea posible.
- Ignorar el manejo de errores: Los datos asíncronos pueden fallar. Usa try-catch o componentes de error boundaries para evitar que un error en un chunk afecte toda la página.
- No optimizar el orden de los chunks: Prioriza los chunks críticos para la interacción del usuario (como botones o formularios) enviándolos primero.
- Usar Streaming SSR para todo: No es necesario para páginas completamente estáticas o con datos muy rápidos; evalúa el costo-beneficio basado en métricas de rendimiento.
Checklist de dominio
- Entiendo cómo Streaming SSR difiere del SSR tradicional en términos de flujo de datos.
- Puedo implementar un componente de servidor con Suspense para cargar datos asíncronos.
- Sé diseñar fallbacks efectivos que mejoren la experiencia de usuario durante la carga.
- Puedo medir el impacto de Streaming SSR usando herramientas como Lighthouse o Web Vitals.
- Reconozco cuándo usar Streaming SSR vs. otras técnicas como Static Generation o Client-side Fetching.
- Sé estructurar una página para minimizar el número de chunks sin sacrificar el rendimiento.
- Puedo solucionar problemas comunes, como chunks que no se transmiten o fallbacks que no se muestran.
Optimiza una página de blog con Streaming SSR
En este ejercicio, mejorarás el rendimiento de una página de blog en Next.js 15 usando Streaming SSR. La página actual carga todos los datos (artículo, comentarios, autor) de manera sincrónica, lo que causa una espera larga.
- Crea un nuevo componente de servidor llamado
BlogPageque represente un artículo de blog. - Divide la página en tres secciones: contenido del artículo (carga rápida), comentarios (carga lenta desde una API simulada), e información del autor (carga media).
- Envuelve la sección de comentarios en un
<Suspense>con un fallback que muestre'Cargando comentarios...'. - Simula una API lenta para comentarios usando
await new Promise(resolve => setTimeout(resolve, 2000))para retrasar 2 segundos. - Prueba la página y verifica que el contenido del artículo se muestre inmediatamente, mientras los comentarios se cargan progresivamente.
- Usa funciones async en componentes de servidor para cargar datos.
- Asegúrate de que el fallback en Suspense sea un elemento React válido, como un
o
. - Puedes usar console.log para depurar el orden de carga de los chunks.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.