Next.js 扩展了 Web fetch() API,允许服务器上的每个请求设置自己的持久化缓存和重新验证语义。
在浏览器中,cache 选项指示 fetch 请求将如何与浏览器的 HTTP 缓存交互。通过此扩展,cache 指示服务器端的 fetch 请求将如何与框架的持久化 Data Cache 交互。
您可以在 Server Components 中直接使用 async 和 await 调用 fetch。
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>
)
}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>
)
}fetch(url, options)由于 Next.js 扩展了 Web fetch() API,因此您可以使用任何 可用的原生选项。
options.cache配置请求应如何与 Next.js Data Cache 交互。
fetch(`https://...`, { cache: 'force-cache' | 'no-store' })auto no cache (默认): 在开发环境中,Next.js 会在每次请求时从远程服务器获取资源,但在 next build 期间只会获取一次,因为该路由将被静态预渲染。如果路由上检测到 Dynamic APIs,Next.js 将在每次请求时获取资源。no-store: Next.js 会在每次请求时从远程服务器获取资源,即使在路由上未检测到动态 API。force-cache: Next.js 会在其 Data Cache 中查找匹配的请求。
options.next.revalidatefetch(`https://...`, { next: { revalidate: false | 0 | number } })设置资源的缓存生命周期(以秒为单位)。 Data Cache。
false - 无限期缓存资源。语义上等同于 revalidate: Infinity。HTTP 缓存可能会随着时间的推移逐出旧资源。0 - 阻止资源被缓存。number - (以秒为单位)指定资源应具有最多 n 秒的缓存生命周期。须知:
- 如果单个
fetch()请求设置的revalidate值低于路由的 默认revalidate,则整个路由的重新验证间隔将缩短。- 如果同一路由中具有相同 URL 的两个 fetch 请求具有不同的
revalidate值,则将使用较低的值。- 不允许使用诸如
{ revalidate: 3600, cache: 'no-store' }之类的冲突选项,两者都将被忽略,并且在开发模式下会在终端打印警告。
options.next.tagsfetch(`https://...`, { next: { tags: ['collection'] } })设置资源的缓存标签。然后可以使用 revalidateTag 按需重新验证数据。自定义标签的最大长度为 256 个字符,最大标签项数为 128。
auto no store 和 cache: 'no-store' 未显示最新数据在本地开发中,Next.js 会在热模块替换(HMR)过程中缓存 Server Components 中的 fetch 响应,以加快响应速度并降低计费 API 调用的成本。
默认情况下,HMR 缓存 适用于所有 fetch 请求,包括那些具有默认 auto no cache 和 cache: 'no-store' 选项的请求。这意味着未缓存的请求在 HMR 刷新之间不会显示最新数据。但是,缓存会在导航或整页重新加载时清除。
有关更多信息,请参阅 serverComponentsHmrCache 文档。
在开发模式下,如果请求包含 cache-control: no-cache 头,options.cache、options.next.revalidate 和 options.next.tags 将被忽略,并且 fetch 请求将从源获取。
当在开发者工具中禁用缓存或进行硬刷新时,浏览器通常会包含 cache-control: no-cache。
| Version | Changes |
|---|---|
v13.0.0 | 引入 fetch。 |