Caché
Reglas que detectan patrones que impiden un caché efectivo en Vercel.
Estas reglas identifican patrones que omiten el caché de la CDN e ISR de Vercel, forzando renderizado del lado del servidor innecesario y aumentando los costos de cómputo.
Comportamiento según la versión
Los diagnósticos de caché se adaptan a la versión mayor detectada de Next.js:
- Next.js 15: las advertencias destacan que
fetchy los handlers GET no usan caché por defecto. - Next.js 16+: las advertencias priorizan la guía de Cache Components (
"use cache", etiquetas de caché, revalidación dirigida). - Otras/versiones desconocidas: las advertencias usan una guía de políticas de caché agnóstica al framework.
nextjs-no-side-effect-in-get-handler
vercel-doctor/nextjs-no-side-effect-in-get-handlerDetecta manejadores de rutas GET que contienen efectos secundarios (mutación de cookies, headers o llamadas a base de datos) o están en segmentos de ruta mutantes como /logout, /signout, /delete, etc.
Por qué importa: Las peticiones GET pueden activarse por prefetching y son vulnerables a CSRF. Los efectos secundarios en manejadores GET también impiden el caché.
// app/api/logout/route.ts
export async function GET() {
cookies().delete("session");
return Response.json({ ok: true });
}// app/api/logout/route.ts
export async function POST() {
cookies().delete("session");
return Response.json({ ok: true });
}Segmentos de ruta mutantes detectados: logout, log-out, signout, sign-out, unsubscribe, delete, remove, revoke, cancel, deactivate.
vercel-no-force-dynamic
vercel-doctor/vercel-no-force-dynamicDetecta páginas con export const dynamic = "force-dynamic".
Por qué importa: force-dynamic fuerza el renderizado del lado del servidor en cada petición, omitiendo por completo el caché de página completa.
export const dynamic = "force-dynamic";
export default function Page() { ... }export const revalidate = 3600;
export default function Page() { ... }vercel-no-no-store-fetch
vercel-doctor/vercel-no-no-store-fetchDetecta llamadas fetch con cache: "no-store" o revalidate: 0.
Por qué importa: Estas opciones desactivan el caché por completo, aumentando el ancho de banda sin caché y los costos de cómputo en cada petición.
const data = await fetch(url, { cache: "no-store" });const data = await fetch(url, {
next: { revalidate: 3600 },
});vercel-missing-cache-policy
vercel-doctor/vercel-missing-cache-policyDetecta manejadores de rutas GET sin ninguna configuración explícita de caché — sin headers Cache-Control, sin exportación revalidate, y sin exportación dynamic.
Por qué importa: Sin una política de caché explícita, las respuestas pueden perder oportunidades de caché en la CDN, causando visitas repetidas al origen.
export async function GET() {
const data = await fetchData();
return Response.json(data);
}export const revalidate = 3600;
export async function GET() {
const data = await fetchData();
return Response.json(data);
}vercel-prefer-get-static-props
vercel-doctor/vercel-prefer-get-static-propsDetecta rutas de Pages Router que usan getServerSideProps.
Por qué importa: getServerSideProps se ejecuta en cada petición. Cambiar a getStaticProps (con ISR opcional) cachea páginas en la CDN y reduce el cómputo del servidor.
vercel-get-static-props-consider-isr
vercel-doctor/vercel-get-static-props-consider-isrDetecta getStaticProps sin un valor de retorno revalidate.
Por qué importa: Sin revalidate, todas las páginas se compilan en el momento del despliegue. Para sitios grandes esto ralentiza mucho las compilaciones. ISR genera páginas bajo demanda y las cachea.
export async function getStaticProps() {
const data = await fetchData();
return {
props: { data },
revalidate: 3600,
};
}Last updated on