馃攧 Tipos de renderizado (SSR, SSG, ISR, CSR)

Next.js Tipos de renderizado SSR SSG ISR CSR

08 - 馃攧 Tipos de renderizado en Next.js (SSR, SSG, ISR, CSR)

Next.js ofrece m煤ltiples estrategias de renderizado para optimizar el rendimiento y la experiencia de usuario. En esta lecci贸n aprender谩s qu茅 son SSR, SSG, ISR y CSR y cu谩ndo usar cada uno.


馃 ¿Qu茅 significa "renderizado"?

El renderizado es el proceso por el cual una p谩gina se transforma desde c贸digo (HTML, JS, datos, etc.) hasta contenido visible en el navegador. Next.js permite decidir d贸nde y cu谩ndo se genera esa p谩gina: en el servidor, en tiempo de compilaci贸n o en el cliente.


⚙️ SSR — Server-Side Rendering

En el Server-Side Rendering, cada solicitud del usuario genera la p谩gina en el servidor en tiempo real. Esto garantiza que el contenido est茅 siempre actualizado, aunque puede ser m谩s lento que otros m茅todos.

// app/usuarios/page.js
export const dynamic = 'force-dynamic'; // Indica SSR en Next.js 13+

export default async function UsuariosPage() {
  const res = await fetch('https://jsonplaceholder.typicode.com/users');
  const users = await res.json();

  return (
    <div className="p-4">
      <h1 className="text-2xl font-bold mb-4">Usuarios (SSR)</h1>
      {users.map(u => (
        <p key={u.id}>馃懁 {u.name}</p>
      ))}
    </div>
  );
}
      

馃З Resultado visual:

馃懁 Leanne Graham

馃懁 Ervin Howell

馃懁 Clementine Bauch

Generado en el servidor en cada visita.

馃挕 Ideal para: datos que cambian constantemente (p. ej. dashboards, noticias, precios, etc.)

馃摝 SSG — Static Site Generation

En el Static Site Generation, las p谩ginas se generan una sola vez durante la compilaci贸n (build), y luego se sirven como HTML est谩tico. Esto las hace extremadamente r谩pidas, aunque los datos no cambian hasta el pr贸ximo despliegue.

// app/blog/[id]/page.js
export const dynamic = 'force-static'; // Indica SSG

export async function generateStaticParams() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();
  return posts.map((p) => ({ id: p.id.toString() }));
}

export default async function BlogPost({ params }) {
  const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${params.id}`);
  const post = await res.json();

  return (
    <article className="p-4">
      <h1 className="text-2xl font-bold">{post.title}</h1>
      <p className="mt-2">{post.body}</p>
    </article>
  );
}
      

馃З Resultado visual:

Ejemplo de publicaci贸n est谩tica

Lorem ipsum dolor sit amet, consectetur adipiscing elit...

Generado una sola vez durante el build.

✅ Ideal para: blogs, p谩ginas informativas, portfolios o documentaci贸n est谩tica.

♻️ ISR — Incremental Static Regeneration

El Incremental Static Regeneration combina lo mejor de SSR y SSG. Las p谩ginas se generan est谩ticamente pero pueden regenerarse autom谩ticamente despu茅s de cierto tiempo sin reconstruir todo el sitio.

// app/productos/page.js
export const revalidate = 60; // Regenera cada 60 segundos

export default async function Productos() {
  const res = await fetch('https://fakestoreapi.com/products');
  const productos = await res.json();

  return (
    <div className="p-4">
      <h1 className="text-2xl font-bold mb-3">Productos (ISR)</h1>
      {productos.slice(0,3).map(p => (
        <p key={p.id}>馃洅 {p.title}</p>
      ))}
    </div>
  );
}
      

馃З Resultado visual:

馃洅 Camiseta de algod贸n

馃洅 Pantal贸n deportivo

馃洅 Zapatillas running

Se regenera cada 60 segundos autom谩ticamente.

⚡ Ideal para: cat谩logos, e-commerce, landing pages con datos que cambian ocasionalmente.

馃捇 CSR — Client-Side Rendering

En el Client-Side Rendering, la p谩gina se carga primero en el navegador y luego obtiene los datos desde el cliente (mediante useEffect() o peticiones AJAX). Es la t茅cnica tradicional de React.

'use client';
import { useEffect, useState } from 'react';

export default function Comentarios() {
  const [comentarios, setComentarios] = useState([]);

  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/comments?_limit=3')
      .then(res => res.json())
      .then(data => setComentarios(data));
  }, []);

  return (
    <div className="p-4">
      <h1 className="text-2xl font-bold mb-3">Comentarios (CSR)</h1>
      {comentarios.map(c => (
        <p key={c.id}>馃挰 {c.name}</p>
      ))}
    </div>
  );
}
      

馃З Resultado visual:

馃挰 Comentario 1

馃挰 Comentario 2

馃挰 Comentario 3

Los datos se cargan desde el cliente despu茅s de renderizar.

⚙️ Ideal para: paneles interactivos, datos personalizados por usuario o componentes que dependen del navegador.

馃搳 Comparativa de estrategias de renderizado

Tipo Momento de renderizado Velocidad Actualizaci贸n de datos Uso recomendado
SSR En el servidor (cada solicitud) ⚡ Media En tiempo real Datos din谩micos
SSG Durante el build 馃殌 Muy alta Solo al reconstruir Contenido est谩tico
ISR Durante el build + cada X segundos 馃殌 Alta Autom谩tica E-commerce, blogs
CSR En el cliente (navegador) ⚡ Variable En cada carga Interactividad y paneles

馃挕 Consejo: puedes combinar varios tipos de renderizado en un mismo proyecto. Por ejemplo, usar SSG para las p谩ginas p煤blicas y CSR para el panel de usuario.

Publicar un comentario

0 Comentarios