fetch
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>
}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>
}fetch(url, options)
Since Next.js extends the Web fetch() API, you can use any of the native options available.
options.cache
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.- If there is a match and it is fresh, it will be returned from the cache.
- If there is no match or a stale match, Next.js will fetch the resource from the remote server and update the cache with the downloaded resource.
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.
options.next.revalidate
fetch(`https://...`, { next: { revalidate: false | 0 | number } })Set the cache lifetime of a resource (in seconds).
false- Cache the resource indefinitely. Semantically equivalent torevalidate: 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 mostnseconds.
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.
options.next.tags
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 128.
Version History
| Version | Changes |
|---|---|
v13.0.0 | fetch introduced. |