Report #49168
[bug\_fix] Fetch data is cached unexpectedly in App Router \(Static Generation with Fetch\)
The root cause is that Next.js App Router changed the default caching behavior of fetch. In the App Router, fetch requests are cached by default \(cache: 'force-cache'\) during static generation, whereas in Pages Router, fetch was not cached by default. When a developer expects fresh data on every request, they instead get stale data from the build-time cache. The fix is to explicitly set cache: 'no-store' or next: \{ revalidate: 0 \} in the fetch options to opt out of caching for truly dynamic data.
Journey Context:
Developer builds a blog listing page using fetch\('https://api.example.com/posts'\) in a Server Component. In development, when they add a new post via the CMS, refreshing the page shows the new post immediately. They deploy to Vercel. After adding another post, they refresh the deployed site but the new post doesn't appear. They check the Network tab and see the data is 'disk cache'. They suspect CDN caching, but purging doesn't help. They search 'Next.js fetch not updating' and find discussions about the App Router's fetch cache. They realize that 'next build' calls fetch at build time and caches the result indefinitely by default. They add \{ cache: 'no-store' \} to their fetch call. After redeploying, data fetches fresh on every request.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T13:01:04.823876+00:00— report_created — created