路由段选项允许您通过直接导出以下变量来配置 页面、布局 或 路由处理器 的行为:
| 选项 | 类型 | 默认值 |
|---|---|---|
dynamic | 'auto' | 'force-dynamic' | 'error' | 'force-static' | 'auto' |
dynamicParams | boolean | true |
revalidate | false | 0 | number | false |
fetchCache | 'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store' | 'auto' |
runtime | 'nodejs' | 'edge' | 'nodejs' |
preferredRegion | 'auto' | 'global' | 'home' | string | string[] | 'auto' |
maxDuration | number | 由部署平台设置 |
选项
dynamic
更改布局或页面的动态行为,使其完全静态或完全动态。
export const dynamic = 'auto'
// 'auto' | 'force-dynamic' | 'error' | 'force-static'export const dynamic = 'auto'
// 'auto' | 'force-dynamic' | 'error' | 'force-static'须知:在
app目录中的新模型更倾向于在fetch请求级别上进行细粒度的缓存控制,而不是pages目录中页面级别的getServerSideProps和getStaticProps的二元全有或全无模型。dynamic选项是一种回归到旧模型的方式,作为便利,并提供了一个更简单的迁移路径。
'auto'(默认):默认选项,尽可能多地缓存,同时不阻止任何组件选择动态行为。'force-dynamic':强制动态渲染,这将导致每个用户的路由在请求时渲染。此选项等同于:pages目录中的getServerSideProps()。- 在布局或页面中的每个
fetch()请求设置选项为{ cache: 'no-store', next: { revalidate: 0 } }。 - 设置段配置为
export const fetchCache = 'force-no-store'
'error':通过在任何组件使用动态函数或未缓存的数据时引发错误,强制静态渲染并缓存布局或页面的数据。此选项等同于:pages目录中的getStaticProps()。- 在布局或页面中的每个
fetch()请求设置选项为{ cache: 'force-cache' }。 - 设置段配置为
fetchCache = 'only-cache', dynamicParams = false。 dynamic = 'error'将dynamicParams的默认值从true更改为false。您可以通过手动设置dynamicParams = true来选择性地回归到动态参数的动态渲染。
'force-static':通过强制cookies()、headers()和useSearchParams()返回空值,强制静态渲染并缓存布局或页面的数据。
须知:
dynamicParams
控制访问未用 generateStaticParams 生成的动态段时会发生什么。
export const dynamicParams = true // true | false,export const dynamicParams = true // true | false,true(默认):未包含在generateStaticParams中的动态段按需生成。false:未包含在generateStaticParams中的动态段将返回 404。
须知:
- 此选项替代了
pages目录中getStaticPaths的fallback: true | false | blocking选项。- 当
dynamicParams = true时,该段使用 Streaming Server Rendering。- 如果使用了
dynamic = 'error'和dynamic = 'force-static',它将把dynamicParams的默认值更改为false。
revalidate
设置布局或页面的默认重新验证时间。此选项不会覆盖个别 fetch 请求设置的 revalidate 值。
export const revalidate = false
// false | 0 | numberexport const revalidate = false
// false | 0 | numberfalse(默认):默认启发式缓存任何将cache选项设置为'force-cache'或在使用动态函数之前发现的fetch请求。语义上等同于revalidate: Infinity,实际上意味着资源应该无限期地被缓存。尽管如此,个别fetch请求仍然可以使用cache: 'no-store'或revalidate: 0来避免被缓存并使路由动态渲染。或者将revalidate设置为低于路由默认值的正数来增加路由的重新验证频率。0:确保即使没有发现动态函数或未缓存的数据获取,布局或页面始终动态渲染。此选项将未设置cache选项的fetch请求的默认值更改为'no-store',但保留选择使用'force-cache'或使用正数revalidate的fetch请求。number:(单位:秒)将布局或页面的默认重新验证频率设置为n秒。
须知:
- 重新验证值需要能够静态分析。例如
revalidate = 600是有效的,但revalidate = 60 * 10是无效的。- 使用
runtime = 'edge'时,重新验证值不可用。
重新验证频率
- 单个路由中每个布局和页面的最低
revalidate值将决定整个路由的重新验证频率。这确保子页面的重新验证频率与它们的父布局一样频繁。 - 个别
fetch请求可以设置比路由的默认revalidate更低的值,以增加整个路由的重新验证频率。这允许您根据某些标准为特定路由动态选择更频繁的重新验证。
fetchCache
这是一个高级选项,只有在您特别需要覆盖默认行为时才应使用。
默认情况下,Next.js 会缓存任何在任何动态函数使用之前可访问的 fetch() 请求,并且不会缓存在使用动态函数之后发现的 fetch 请求。
fetchCache 允许您覆盖布局或页面中所有 fetch 请求的默认 cache 选项。
export const fetchCache = 'auto'
// 'auto' | 'default-cache' | 'only-cache'
// 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'export const fetchCache = 'auto'
// 'auto' | 'default-cache' | 'only-cache'
// 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store''auto'(默认):默认选项是在动态函数之前缓存fetch请求,并使用它们提供的cache选项,而不缓存动态函数之后的fetch请求。'default-cache':允许向fetch传递任何cache选项,但如果未提供选项,则将cache选项设置为'force-cache'。这意味着即使在动态函数之后的fetch请求也被视为静态。'only-cache':确保所有fetch请求都选择使用缓存,如果未提供选项,则将默认更改为cache: 'force-cache',并在任何fetch请求使用cache: 'no-store'时引发错误。'force-cache':确保所有fetch请求都选择使用缓存,通过将所有fetch请求的cache选项设置为'force-cache'。'default-no-store':允许向fetch传递任何cache选项,但如果未提供选项,则将cache选项设置为'no-store'。这意味着即使在动态函数之前的fetch请求也被视为动态。'only-no-store':确保所有fetch请求都不使用缓存,如果未提供选项,则将默认更改为cache: 'no-store',并在任何fetch请求使用cache: 'force-cache'时引发错误。'force-no-store':确保所有fetch请求都不使用缓存,通过将所有fetch请求的cache选项设置为'no-store'。这将强制每个请求都重新获取所有fetch请求,即使它们提供了'force-cache'选项。
跨路由段行为
- 单个路由的每个布局和页面设置的任何选项需要彼此兼容。
- 如果同时提供了
'only-cache'和'force-cache',则'force-cache'优先。如果同时提供了'only-no-store'和'force-no-store',则'force-no-store'优先。强制选项会改变整个路由的行为,因此具有'force-*'的单个段将防止由'only-*'引起的任何错误。 'only-*'和force-*'选项的目的是保证整个路由要么完全静态,要么完全动态。这意味着:- 在单个路由中不允许组合使用
'only-cache'和'only-no-store'。 - 在单个路由中不允许组合使用
'force-cache'和'force-no-store'。
- 在单个路由中不允许组合使用
- 如果子级提供了
'auto'或'*-cache',则父级不能提供'default-no-store',因为这可能导致相同的获取具有不同的行为。
- 如果同时提供了
- 通常建议将共享的父级布局保留为
'auto',并在子段发散的地方自定义选项。
我们建议您使用 Node.js 运行时来渲染您的应用程序,并使用 Edge 运行时来处理中间件(唯一支持的选项)。
export const runtime = 'nodejs'
// 'nodejs' | 'edge'export const runtime = 'nodejs'
// 'nodejs' | 'edge''nodejs'(默认)'edge'
了解更多关于不同的运行时。
preferredRegion
export const preferredRegion = 'auto'
// 'auto' | 'global' | 'home' | ['iad1', 'sfo1']export const preferredRegion = 'auto'
// 'auto' | 'global' | 'home' | ['iad1', 'sfo1']preferredRegion 的支持以及支持的区域取决于您的部署平台。
须知:
- 如果没有指定
preferredRegion,则会继承最近父布局的选项。- 根布局默认为
all区域。
maxDuration
默认情况下,Next.js 不限制服务器端逻辑的执行(渲染页面或处理 API)。 部署平台可以使用 Next.js 构建输出中的 maxDuration 来添加特定的执行限制。 例如,在 Vercel 上。
注意:此设置需要 Next.js 13.4.10 或更高版本。
export const maxDuration = 5export const maxDuration = 5须知:
- 如果使用 Server Actions,请在页面级别设置
maxDuration以更改页面上使用的所有 Server Actions 的默认超时时间。
generateStaticParams
generateStaticParams 函数可以与动态路由段结合使用,以定义将在构建时静态生成的路由段参数列表,而不是在请求时按需生成。
有关更多详细信息,请参见API参考。