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.
馃摝 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.
♻️ 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.
馃捇 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.
馃搳 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 |
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias