Saltar al contenido

Lección 12 de 17 · Lectura y práctica

Quiz: Rendimiento y optimización con SSR

Tipo de lección: QuizConcepto claveEl 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é.

Del concepto a la práctica

Taller de esta lección

Optimizar con SSR no consiste en declarar que una página es rápida; consiste en relacionar cada espera con el contenido que bloquea. Si una cabecera tarda 20 ms y una recomendación 300 ms, el límite de carga debe evitar que la recomendación bloquee la cabecera. La medición debe conservar condiciones comparables.

Ejemplo resuelto

Datos locales: cabecera 20 ms, artículo 40 ms, recomendaciones 300 ms. Suponiendo que las tres consultas comienzan en paralelo, sin separación el primer contenido depende de 300 ms. Con Suspense para recomendaciones, el contenido principal puede terminar tras 40 ms y la sección secundaria después de 300 ms. Son tiempos del escenario, no una promesa general.

Pruébalo

  1. Escribe los tres tiempos en una tabla.

  2. Identifica qué bloque puede esperar.

  3. Define un fallback para recomendaciones.

  4. Repite la observación con los mismos datos.

Comprueba tu resultado

Error frecuente: sumar porcentajes inventados para anunciar una mejora. Corrígelo comparando solo los tiempos observados. Resultado esperado: bloqueo inicial sin separación = 300 ms; contenido principal separado = 40 ms; recomendaciones terminan en 300 ms. No confundas “contenido visible” con “página completa”.

Hipótesis de la comparación

El máximo de 20, 40 y 300 es 300 solo si las consultas empiezan juntas y se espera a todas; ejecutarlas secuencialmente daría 360 ms, antes de otros costes. Con independencia, el título puede estar listo en 20 y el artículo en 40, mientras las recomendaciones terminan en 300. No derives FCP, LCP, TTFB ni un porcentaje comercial de estos temporizadores. Una medición necesita misma compilación, datos, red, caché y entorno, varias muestras y tiempos del navegador.

Servidor que produce HTML y navegador que lo muestra y gestiona la interacción; claves sensibles permanecen en el servidor.
CursaloMapa de práctica
Dónde se ejecuta cada parte

El 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: Quiz

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:

  1. Envuelve las secciones de tu página que dependen de datos asíncronos en un componente <Suspense>.
  2. Dentro de <Suspense>, usa await para cargar los datos, y define un fallback que se muestre mientras se carga.
  3. 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ónTipo de datoTiempo estimado de cargaEstrategia con Streaming SSR
Título y precioEstático0 msEnviado inmediatamente
Galería de imágenesAssets locales100 msEnviado con el chunk inicial
Reseñas de usuariosAPI externa lenta2000 msEnvuelta en Suspense con fallback
Productos recomendadosAPI externa lenta1500 msEnvuelta 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 fallback en <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

  1. Entiendo cómo Streaming SSR difiere del SSR tradicional en términos de flujo de datos.
  2. Puedo implementar un componente de servidor con Suspense para cargar datos asíncronos.
  3. Sé diseñar fallbacks efectivos que mejoren la experiencia de usuario durante la carga.
  4. Puedo medir el impacto de Streaming SSR usando herramientas como Lighthouse o Web Vitals.
  5. Reconozco cuándo usar Streaming SSR vs. otras técnicas como Static Generation o Client-side Fetching.
  6. Sé estructurar una página para minimizar el número de chunks sin sacrificar el rendimiento.
  7. 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.

  1. Crea un nuevo componente de servidor llamado BlogPage que represente un artículo de blog.
  2. 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).
  3. Envuelve la sección de comentarios en un <Suspense> con un fallback que muestre 'Cargando comentarios...'.
  4. Simula una API lenta para comentarios usando await new Promise(resolve => setTimeout(resolve, 2000)) para retrasar 2 segundos.
  5. Prueba la página y verifica que el contenido del artículo se muestre inmediatamente, mientras los comentarios se cargan progresivamente.
Pistas
  • 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.

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.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.