缓存
检测阻止在 Vercel 上有效缓存的规则。
这些规则用于发现会绕过 Vercel CDN 和 ISR 缓存、强制不必要服务端渲染并增加计算成本的做法。
版本感知行为
缓存诊断会根据检测到的 Next.js 主版本进行调整:
- Next.js 15:警告会强调
fetch和 GET 处理器默认不缓存。 - Next.js 16+:警告会优先给出 Cache Components 指导(
"use cache"、缓存标签、定向重新验证)。 - 其他/未知版本:警告会使用与框架无关的缓存策略指导。
nextjs-no-side-effect-in-get-handler
vercel-doctor/nextjs-no-side-effect-in-get-handler检测在 GET 路由处理函数中存在副作用(修改 cookies、headers 或数据库调用),或处于具有副作用的路径段(如 /logout、/signout、/delete 等)。
为何重要: GET 请求可能由 prefetch 触发,且易受 CSRF 攻击。GET 中的副作用也会阻止缓存。
// 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 });
}检测到的变更类路径段:logout、log-out、signout、sign-out、unsubscribe、delete、remove、revoke、cancel、deactivate。
vercel-no-force-dynamic
vercel-doctor/vercel-no-force-dynamic检测含有 export const dynamic = "force-dynamic" 的页面。
为何重要: force-dynamic 会在每次请求时强制服务端渲染,完全跳过全页缓存。
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-fetch检测带 cache: "no-store" 或 revalidate: 0 的 fetch 调用。
为何重要: 这些选项会完全关闭缓存,增加未缓存带宽和每次请求的计算成本。
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-policy检测没有明确缓存配置的 GET 路由处理函数——无 Cache-Control 头、无 revalidate 导出、无 dynamic 导出。
为何重要: 缺少明确缓存策略时,响应可能错失 CDN 缓存机会,导致反复回源。
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-props检测 Pages Router 中使用 getServerSideProps 的路由。
为何重要: getServerSideProps 每次请求都会执行。改用 getStaticProps(可选 ISR)可在 CDN 上缓存页面并减少服务端计算。
vercel-get-static-props-consider-isr
vercel-doctor/vercel-get-static-props-consider-isr检测未返回 revalidate 的 getStaticProps。
为何重要: 无 revalidate 时,所有页面在部署时构建,大站点会显著拖慢构建。ISR 按需生成并缓存页面。
export async function getStaticProps() {
const data = await fetchData();
return {
props: { data },
revalidate: 3600,
};
}Last updated on