跳到内容

路由片段配置

须知:

  • 如果 cacheComponents 标志已启用,本页列出的选项将被禁用,并最终在未来被废弃。
  • 路由段选项仅在服务器组件页面、布局或路由处理器中生效。
  • generateStaticParams 不能在 'use client' 文件中使用。

通过直接导出以下变量,路由段选项允许您配置 页面布局路由处理器 的行为。

选项类型默认
动态'auto' | 'force-dynamic' | 'error' | 'force-static''auto'
动态参数booleantrue
`revalidate`false | 0 | 数字false
fetchCache'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store''auto'
运行时'nodejs' | 'edge''nodejs'
preferredRegion'auto' | 'global' | 'home' | 字符串 | 字符串数组'auto'
maxDuration数字由部署平台设置

选项

dynamic

更改布局或页面的动态行为,使其完全静态或完全动态。

layout.tsx | page.tsx | route.ts
export const dynamic = 'auto'
// 'auto' | 'force-dynamic' | 'error' | 'force-static'

须知app 目录中的新模型倾向于在 fetch 请求级别进行细粒度的缓存控制,而不是像 pages 目录中 getServerSidePropsgetStaticProps 在页面级别那样全有或全无的二元模型。dynamic 选项是一种方便的方式,可以重新选择以前的模型,并提供更简单的迁移路径。

  • 'auto'(默认):默认选项,尽可能多地缓存,同时不阻止任何组件选择动态行为。

  • 'force-dynamic':强制动态渲染,这将导致路由在请求时为每个用户渲染。此选项等同于

    • 将布局或页面中每个 fetch() 请求的选项设置为 { cache: 'no-store', next: { revalidate: 0 } }
    • 将段配置设置为 export const fetchCache = 'force-no-store'
  • 'error':强制静态渲染并缓存布局或页面的数据,如果任何组件使用动态 API 或未缓存的数据,则会引发错误。此选项等同于

    • pages 目录中的 getStaticProps()
    • 将布局或页面中每个 fetch() 请求的选项设置为 { cache: 'force-cache' }
    • 将段配置设置为 fetchCache = 'only-cache'
  • 'force-static':强制静态渲染并缓存布局或页面的数据,通过强制 cookiesheaders()useSearchParams() 返回空值。在以 force-static 渲染的页面或布局中,可以进行 revalidaterevalidatePathrevalidateTag

须知:

  • 关于如何从 getServerSidePropsgetStaticProps 迁移dynamic: 'force-dynamic'dynamic: 'error' 的说明可在升级指南中找到。

dynamicParams

控制访问未通过 generateStaticParams 生成的动态段时会发生什么。

layout.tsx | page.tsx
export const dynamicParams = true // true | false
  • true(默认):未包含在 generateStaticParams 中的动态段按需生成。
  • **`false`**:`generateStaticParams` 中未包含的动态段将返回 404。

须知:

  • 此选项取代了 pages 目录中 getStaticPathsfallback: true | false | blocking 选项。
  • 要首次访问时静态渲染所有路径,您需要在 generateStaticParams 中返回一个空数组,或使用 export const dynamic = 'force-static'
  • dynamicParams = true 时,该段使用流式服务器渲染

`revalidate`

设置布局或页面的默认重新验证时间。此选项不会覆盖单个 fetch 请求设置的 revalidate 值。

layout.tsx | page.tsx | route.ts
export const revalidate = false
// false | 0 | number
  • false(默认):默认的启发式缓存任何将 cache 选项设置为 'force-cache' 或在使用动态 API 之前发现的 fetch 请求。语义上等同于 revalidate: Infinity,这意味着资源应无限期缓存。单个 fetch 请求仍可以使用 cache: 'no-store'revalidate: 0 来避免缓存并使路由动态渲染。或者将 revalidate 设置为小于路由默认值的正数,以增加路由的重新验证频率。
  • 0:确保布局或页面始终动态渲染,即使没有发现动态 API 或未缓存的数据获取。此选项将未设置 cache 选项的 fetch 请求的默认值更改为 'no-store',但保持选择 'force-cache' 或使用正数 revalidatefetch 请求不变。
  • number:(以秒为单位)将布局或页面的默认重新验证频率设置为 n 秒。

须知:

  • 重新验证值需要是静态可分析的。例如,`revalidate = 600` 是有效的,但 `revalidate = 60 * 10` 是无效的。
  • 使用 runtime = 'edge' 时,重新验证值不可用。
  • 在开发环境中,页面 总是 按需渲染,并且从不缓存。这使您可以立即看到更改,而无需等待重新验证周期过去。

重新验证频率

  • 单个路由中每个布局和页面中最低的 revalidate 值将决定整个路由的重新验证频率。这确保了子页面与其父布局一样频繁地重新验证。
  • 单个 fetch 请求可以设置低于路由默认 revalidaterevalidate 值,以增加整个路由的重新验证频率。这允许您根据某些标准动态选择更频繁地重新验证某些路由。

fetchCache

这是一个高级选项,仅当您需要专门覆盖默认行为时才应使用。

默认情况下,Next.js 将缓存 任何在任何动态 API 使用之前可访问的 fetch() 请求,并且 不会缓存 在动态 API 使用之后发现的 fetch 请求。

fetchCache 允许您覆盖布局或页面中所有 fetch 请求的默认 cache 选项。

layout.tsx | page.tsx | route.ts
export const fetchCache = 'auto'
// 'auto' | 'default-cache' | 'only-cache'
// 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'
  • 'auto' (默认): 默认选项是在动态 API 之前缓存 fetch 请求,并使用它们提供的 cache 选项,而不缓存动态 API 之后的 fetch 请求。
  • 'default-cache':允许将任何 cache 选项传递给 fetch,但如果未提供选项,则将 cache 选项设置为 'force-cache'。这意味着即使在动态 API 之后的 fetch 请求也被视为静态。
  • 'only-cache':通过将默认值更改为 cache: 'force-cache'(如果未提供选项)并导致任何使用 cache: 'no-store'fetch 请求出错,来确保所有 fetch 请求都选择缓存。
  • 'force-cache':通过将所有 fetch 请求的 cache 选项设置为 'force-cache',确保所有 fetch 请求都选择缓存。
  • 'default-no-store':允许将任何 cache 选项传递给 fetch,但如果未提供选项,则将 cache 选项设置为 'no-store'。这意味着即使在动态 API 之前的 fetch 请求也被视为动态。
  • 'only-no-store':通过将默认值更改为 cache: 'no-store'(如果未提供选项)并导致任何使用 cache: 'force-cache'fetch 请求出错,来确保所有 fetch 请求都选择不缓存。
  • 'force-no-store':通过将所有 fetch 请求的 cache 选项设置为 'no-store',确保所有 fetch 请求都选择不缓存。这会强制所有 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',因为这可能会使相同的 fetch 具有不同的行为。
  • 通常建议将共享的父级布局保留为 'auto',并在子段出现差异时自定义选项。

runtime

我们建议使用 Node.js 运行时渲染您的应用程序,使用 Edge 运行时作为代理。

layout.tsx | page.tsx | route.ts
export const runtime = 'nodejs'
// 'nodejs' | 'edge'
  • 'nodejs' (默认)
  • 'edge'

preferredRegion

layout.tsx | page.tsx | route.ts
export const preferredRegion = 'auto'
// 'auto' | 'global' | 'home' | ['iad1', 'sfo1']

preferredRegion 的支持以及支持的区域取决于您的部署平台。

须知:

  • 如果未指定 preferredRegion,它将继承最近的父布局的选项。
  • 根布局默认为 all 区域。

maxDuration

默认情况下,Next.js 不限制服务器端逻辑(渲染页面或处理 API)的执行。部署平台可以使用 Next.js 构建输出中的 maxDuration 来添加特定的执行限制。

注意:此设置需要 Next.js 13.4.10 或更高版本。

layout.tsx | page.tsx | route.ts
export const maxDuration = 5

须知:

  • 如果使用服务器动作,请在页面级别设置 maxDuration 以更改页面上使用的所有服务器动作的默认超时时间。

generateStaticParams

generateStaticParams 函数可以与动态路由段结合使用,以定义将在构建时而不是在请求时按需静态生成的路由段参数列表。

有关更多详细信息,请参阅 API 参考

版本历史

版本
v16.0.0export const experimental_ppr = true 已移除。可以使用代码转换工具。
v15.0.0-RCexport const runtime = "experimental-edge" 已废弃。可以使用代码转换工具。