Full Route Cache
The Full Route Cache is a server-side cache that stores the rendered output of your routes — the generated HTML and the React Server Component (RSC) payload — at build time or after the first request. Its purpose is simple: if a route can be rendered once and reused for every visitor, Next.js should never waste server or database cycles rendering it again.
This cache is what makes statically rendered routes in the App Router so fast in production. When a request comes in for a route that has an entry in the Full Route Cache, Next.js skips rendering entirely and serves the cached HTML and RSC payload directly, whether that request comes from the first visitor or the millionth.
How entries get created
An entry is added to the Full Route Cache whenever a route is statically rendered. That happens in two situations:
At build time, for any route that Next.js determines can be fully static (no dynamic functions, no uncached dynamic data).
On-demand, the first time a route using Incremental Static Regeneration (ISR) is requested after a revalidation window has passed.
// app/blog/[slug]/page.tsx
// Statically rendered at build time (or on first request with ISR)
export const revalidate = 3600 // regenerate at most once per hour
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
return <article>{post.title}</article>
}Full Route Cache vs. Data Cache
Cache | What it stores | Scope |
|---|---|---|
Data Cache | Raw results of individual fetch() calls | Persists across requests and deployments |
Full Route Cache | Rendered HTML + RSC payload for a route | Persists across requests, tied to the deployment |
A route can only be added to the Full Route Cache if all of the data it depends on is itself cacheable. If a page reads from the Data Cache but that data changes, the route won't automatically re-render until it is revalidated or the whole route is rebuilt — the two caches work in layers, with the Data Cache feeding the render that the Full Route Cache then stores.
Invalidating the Full Route Cache
Revalidating data — calling revalidatePath() or revalidateTag() clears the cached render for the affected route(s).
Time-based revalidation — export const revalidate = <seconds> on a route regenerates it after the window expires.
A new deployment — every deploy wipes the Full Route Cache clean, since it is tied to the current build.
import { revalidatePath } from 'next/cache'
export async function publishPost(id: string) {
await db.post.update({ where: { id }, data: { published: true } })
// Clears the Full Route Cache entry for /blog and lets the
// next request regenerate it with fresh data
revalidatePath('/blog')
}Routes that opt out automatically
Not every route is eligible. Next.js will skip the Full Route Cache entirely for a route that:
Reads cookies() or headers() to make a rendering decision.
Uses searchParams in a way that affects the render.
Calls fetch() with { cache: 'no-store' }, or the route sets export const dynamic = 'force-dynamic'.
next build — the output table marks each route as ○ (Static), ● (SSG), or λ (Dynamic), which is the quickest way to confirm whether a route is eligible for the Full Route Cache.