Next.js desde Cero (App Router)

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 EstrategiaCuándo usarlaCómo activarla Estática (cache permanente)Contenido que casi no cambiaPor defecto en muchos fetc
Tiempo de estudio
18 Min

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









EstrategiaCuándo usarlaCómo activarla
Estática (cache permanente)Contenido que casi no cambiaPor defecto en muchos fetch
Revalidación (ISR)Contenido que cambia cada cierto tiemporevalidate
DinámicaDatos por usuario o en tiempo realforce-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?

El saldo es dato por usuario y en tiempo real: debe renderizarse en cada petición, no cachearse. force-dynamic garantiza datos siempre frescos.


Ejercicio práctico


Objetivo: aplicar la estrategia de cache correcta a dos páginas distintas.

  1. En una página de contenido (por ejemplo un listado de artículos) añade export const revalidate = 60.
  2. En una página que lee la base de datos por usuario añade export const dynamic = "force-dynamic".
  3. 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-dynamic o cache: "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.
Texto Leccion 1/12
Estas viendo
Data fetching: cuando cachear y cuando no
Hablar por WhatsAppContactar por WhatsApp