Next.js extends the native Web fetch() API to allow each request on the server to set its own persistent caching semantics.
In the browser, the cache option indicates how a fetch request will interact with the browser's HTTP cache. With this extension, cache indicates how a server-side fetch request will interact with the framework's persistent HTTP cache.
You can call fetch with async and await directly within Server Components.
export default async function Page() {
// This request should be cached until manually invalidated.
// Similar to `getStaticProps`.
// `force-cache` is the default and can be omitted.
const staticData = await fetch(`https://...`, { cache: 'force-cache' })
// This request should be refetched on every request.
// Similar to `getServerSideProps`.
const dynamicData = await fetch(`https://...`, { cache: 'no-store' })
// This request should be cached with a lifetime of 10 seconds.
// Similar to `getStaticProps` with the `revalidate` option.
const revalidatedData = await fetch(`https://...`, {
next: { revalidate: 10 },
})
return <div>...</div>
}Since Next.js extends the Web fetch() API, you can use any of the native options available.
Configure how the request should interact with Next.js Data Cache.
fetch(`https://...`, { cache: 'force-cache' | 'no-store' })
force-cache (default) - Next.js looks for a matching request in its Data Cache. no-store - Next.js fetches the resource from the remote server on every request without looking in the cache, and it will not update the cache with the downloaded resource.Good to know:
- If you don't provide a
cacheoption, Next.js will default toforce-cache, unless a dynamic function such ascookies()is used, in which case it will default tono-store.- The
no-cacheoption behaves the same way asno-storein Next.js.
fetch(`https://...`, { next: { revalidate: false | 0 | number } })
Set the cache lifetime of a resource (in seconds).
false - Cache the resource indefinitely. Semantically equivalent to revalidate: Infinity. The HTTP cache may evict older resources over time.0 - Prevent the resource from being cached.number - (in seconds) Specify the resource should have a cache lifetime of at most n seconds.Good to know:
- If an individual
fetch()request sets arevalidatenumber lower than the defaultrevalidateof a route, the whole route revalidation interval will be decreased.- If two fetch requests with the same URL in the same route have different
revalidatevalues, the lower value will be used.- As a convenience, it is not necessary to set the
cacheoption ifrevalidateis set to a number since0impliescache: 'no-store'and a positive value impliescache: 'force-cache'.- Conflicting options such as
{ revalidate: 0, cache: 'force-cache' }or{ revalidate: 10, cache: 'no-store' }will cause an error.
fetch(`https://...`, { next: { tags: ['collection'] } })
Set the cache tags of a resource. Data can then be revalidated on-demand using revalidateTag. The max length for a custom tag is 256 characters and the max tag items is 64.
| Version | Changes |
|---|---|
v13.0.0 |
fetch introduced. |
© 2024 Vercel, Inc.
Licensed under the MIT License.
https://nextjs.org/docs/app/api-reference/functions/fetch