Data fetching: cuando cachear y cuando no
Data fetching: cuándo cachear y cuándo no
En el App Router obtienes datos directamente dentro de los Server Components con await fetch() o consultando tu base de datos. La gran decisión no es cómo traer los datos, sino cuánto tiempo reutilizarlos. Elegir bien entre datos estáticos, revalidados o siempre dinámicos define la velocidad y la frescura de tu app.
Las tres estrategias
| Estrategia | Cuándo usarla | Cómo activarla |
|---|---|---|
| Estática (cache permanente) | Contenido que casi no cambia | Por defecto en muchos fetch |
| Revalidación (ISR) | Contenido que cambia cada cierto tiempo | revalidate |
| Dinámica | Datos por usuario o en tiempo real | force-dynamic o no-store |
Revalidación por tiempo (ISR)
Sirve para páginas de contenido que toleran unos minutos de retraso. La página se regenera en segundo plano cada N segundos:
// Revalida toda la página cada 60 segundos
export const revalidate = 60;
export default async function Blog() {
const posts = await fetch("https://api.midominio.com/posts")
.then((r) => r.json());
return <PostList posts={posts} />;
}Datos siempre frescos
Para datos por usuario (un dashboard, un carrito) que nunca deben cachearse:
// Opción 1: a nivel de página
export const dynamic = "force-dynamic";
// Opción 2: a nivel de petición concreta
const data = await fetch(url, { cache: "no-store" });Atención
Si una página lee la base de datos durante el build pero la DB no está accesible en ese momento, el build puede fallar. Marca esas páginas con export const dynamic = "force-dynamic" para que se rendericen en runtime y no en build.
Revalidación bajo demanda
Cuando cambias datos (un nuevo post) y quieres refrescar una página cacheada al instante, usa revalidatePath o revalidateTag desde una Server Action.
Tienes un dashboard que muestra el saldo del usuario en tiempo real. ¿Qué configuración encaja mejor?
force-dynamic garantiza datos siempre frescos.Ejercicio práctico
Objetivo: aplicar la estrategia de cache correcta a dos páginas distintas.
- En una página de contenido (por ejemplo un listado de artículos) añade
export const revalidate = 60. - En una página que lee la base de datos por usuario añade
export const dynamic = "force-dynamic". - Cambia un dato de origen y comprueba cuánto tarda en reflejarse en cada caso.
Entregable: explica en 3 líneas por qué elegiste cada estrategia.
Para recordar
- Estático para lo que no cambia; ISR (
revalidate) para lo que cambia cada tanto; dinámico para lo personalizado. force-dynamicocache: "no-store"evitan cachear datos sensibles o en tiempo real.- Marca dinámicas las páginas que dependen de la DB para no romper el build.