use cache
use cache 指令允许你将某个路由、React 组件或函数标记为可缓存。你可以在文件顶部添加该指令,表示该文件中所有导出的内容都将被缓存;也可以在组件或函数顶部内联使用,实现对返回值的缓存。
用法
use cache 目前属于实验性特性。要启用它,请在 next.config.ts 文件中添加 useCache 选项:
- TypeScript
- JavaScript
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
experimental: {
useCache: true,
},
}
export default nextConfig
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
useCache: true,
},
}
module.exports = nextConfig
提示: 你也可以通过
dynamicIO选项启用use cache。
然后,在文件、组件或函数级别添加 use cache:
// 文件级别
'use cache'
export default async function Page() {
// ...
}
// 组件级别
export async function MyComponent() {
'use cache'
return <></>
}
// 函数级别
export async function getData() {
'use cache'
const data = await fetch('/api/data')
return data
}
use cache 的工作原理
缓存键
缓存条目的 key 是通过对其输入进行序列化生成的,主要包括:
- 构建 ID(每次构建都会生成)
- 函数 ID(每个函数唯一的安全标识符)
- 可序列化 的函数参数(或 props)
传递给被缓存函数的参数,以及它从父作用域读取的任何值,都会自动成为缓存 key 的一部分。也就是说,只要输入相同,就会复用同一个缓存条目。
非可序列化参数
任何不可序列化的参数、props 或闭包中的值,在缓存函数内部会变成引用,只能传递,无法被检查或修改。这些不可序列化的值会在请求时被填充,不会成为缓存 key 的一部分。
例如,一个被缓存的函数可以接收 JSX 作为 children prop 并返回 <div>{children}</div>,但无法检查 children 对象的实际内容。这允许你在缓存组件内部嵌套未缓存的内容。
- TypeScript
- JavaScript
function CachedComponent({ children }: { children: ReactNode }) {
'use cache'
return <div>{children}</div>
}
function CachedComponent({ children }) {
'use cache'
return <div>{children}</div>
}
返回值
可缓存函数的返回值必须是可序列化的。这样才能确保缓存数据能够被正确存储和读取。
构建时的 use cache
当你在 layout 或 page 文件顶部使用 use cache 时,该路由段会被预渲染,从而支持后续的再验证。
这意味着 use cache 不能与 请求时 API(如 cookies 或 headers)一起使用。
运行时的 use cache
在服务端,各个组件或函数的缓存条目会存储在内存中。
在客户端,从服务端缓存返回的内容会存储在浏览器内存中,持续到会话结束或被再验证。
再验证期间
默认情况下,use cache 的服务端再验证周期为 15 分钟。如果你的内容不需要频繁更新,这个周期可能已经足够。你也可以通过 cacheLife 和 cacheTag API 配置每个缓存条目的再验证时机。
这两个 API 会在客户端和服务端缓存层之间协同工作,你可以在一个地方配置缓存策略,并在全局生效。
更多信息请参阅 cacheLife 和 cacheTag 的 API 文档。