| | --- |
| | title: fetch |
| | description: API reference for the extended fetch function. |
| | --- |
| |
|
| | Next.js extends the [Web `fetch()` API](https://developer.mozilla.org/docs/Web/API/Fetch_API) to allow each request on the server to set its own persistent caching and revalidation 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 [Data Cache](/docs/app/guides/caching |
| |
|
| | You can call `fetch` with `async` and `await` directly within Server Components. |
| |
|
| | ```tsx filename="app/page.tsx" switcher |
| | export default async function Page() { |
| | let data = await fetch('https://api.vercel.app/blog') |
| | let posts = await data.json() |
| | return ( |
| | <ul> |
| | {posts.map((post) => ( |
| | <li key={post.id}>{post.title}</li> |
| | ))} |
| | </ul> |
| | ) |
| | } |
| | ``` |
| |
|
| | ```jsx filename="app/page.js" switcher |
| | export default async function Page() { |
| | let data = await fetch('https://api.vercel.app/blog') |
| | let posts = await data.json() |
| | return ( |
| | <ul> |
| | {posts.map((post) => ( |
| | <li key={post.id}>{post.title}</li> |
| | ))} |
| | </ul> |
| | ) |
| | } |
| | ``` |
| |
|
| | |
| |
|
| | Since Next.js extends the [Web `fetch()` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), you can use any of the [native options available](https://developer.mozilla.org/docs/Web/API/fetch |
| |
|
| | |
| |
|
| | Configure how the request should interact with Next.js [Data Cache](/docs/app/guides/caching |
| |
|
| | ```ts |
| | fetch(`https://...`, { cache: 'force-cache' | 'no-store' }) |
| | ``` |
| |
|
| | - **`auto no cache`** (default): Next.js fetches the resource from the remote server on every request in development, but will fetch once during `next build` because the route will be statically prerendered. If [Dynamic APIs](/docs/app/guides/caching |
| | - **`no-store`**: Next.js fetches the resource from the remote server on every request, even if Dynamic APIs are not detected on the route. |
| | - **`force-cache`**: 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. |
| |
|
| | |
| |
|
| | ```ts |
| | fetch(`https://...`, { next: { revalidate: false | 0 | number } }) |
| | ``` |
| |
|
| | Set the cache lifetime of a resource (in seconds). [Data Cache](/docs/app/guides/caching |
| |
|
| | - **`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 a `revalidate` number lower than the [default `revalidate`](/docs/app/api-reference/file-conventions/route-segment-config |
| | > - If two fetch requests with the same URL in the same route have different `revalidate` values, the lower value will be used. |
| | > - Conflicting options such as `{ revalidate: 3600, cache: 'no-store' }` are not allowed, both will be ignored, and in development mode a warning will be printed to the terminal. |
| |
|
| | |
| |
|
| | ```ts |
| | fetch(`https://...`, { next: { tags: ['collection'] } }) |
| | ``` |
| |
|
| | Set the cache tags of a resource. Data can then be revalidated on-demand using [`revalidateTag`](/docs/app/api-reference/functions/revalidateTag). The max length for a custom tag is 256 characters and the max tag items is 128. |
| |
|
| | |
| |
|
| | |
| |
|
| | Next.js caches `fetch` responses in Server Components across Hot Module Replacement (HMR) in local development for faster responses and to reduce costs for billed API calls. |
| |
|
| | By default, the [HMR cache](/docs/app/api-reference/config/next-config-js/serverComponentsHmrCache) applies to all fetch requests, including those with the default `auto no cache` and `cache: 'no-store'` option. This means uncached requests will not show fresh data between HMR refreshes. However, the cache will be cleared on navigation or full-page reloads. |
| |
|
| | See the [`serverComponentsHmrCache`](/docs/app/api-reference/config/next-config-js/serverComponentsHmrCache) docs for more information. |
| |
|
| | |
| |
|
| | In development mode, if the request includes the `cache-control: no-cache` header, `options.cache`, `options.next.revalidate`, and `options.next.tags` are ignored, and the `fetch` request is served from the source. |
| |
|
| | Browsers typically include `cache-control: no-cache` when the cache is disabled in developer tools or during a hard refresh. |
| |
|
| | |
| |
|
| | | Version | Changes | |
| | | --------- | ------------------- | |
| | | `v13.0.0` | `fetch` introduced. | |
| |
|