Skip to content

缓存行为

顶层设置默认 revalidate(ISR)

ts
// app/api/posts/route.js
export const revalidate = 60 // 默认页面/响应可在 60s 后再生成

export async function GET() {
  const data = await getPosts()
  return NextResponse.json(data) // 会使用顶层 revalidate 作为默认
}

在单次响应中覆盖(按响应控制)

ts
// app/api/posts/route.js
export async function GET(req) {
  const id = new URL(req.url).searchParams.get('preview')

  if (id) {
    // 预览或私有请求,不缓存
    return NextResponse.json({ preview: true }, { cache: 'no-store' })
  }

  // 公开请求,显式设定 30s 缓存(覆盖顶层的 60s)
  return NextResponse.json({ posts: [] }, { next: { revalidate: 30 } })
}

强制动态(顶层会阻止缓存)

ts
// app/api/private/route.js
export const dynamic = 'force-dynamic' // 强制每次请求都执行服务器逻辑

export async function GET() {
  // 即使你在这里尝试返回带缓存的 Response,路由被标记 force-dynamic 后其行为会以动态为主
  return NextResponse.json({ now: Date.now() }, { cache: 'no-store' })
}

基于 MIT 许可发布