Skip to content

路由段

前言

之前的文章中已经多次提到了路由段配置项,路由段配置选项可以配置页面、布局、路由处理程序的行为,本篇我们会详细介绍其中的配置内容。

段(Segment)

路由中的每个文件夹都代表一个路由段。每个路由段都映射一个对应的 URL Segment:

在这张图中,/dashboard/settings 由三段组成:

  • /:根段(Root Segment)

  • dashboard:段(Segment)

  • settings:叶段(Leaf Segment)

路由段配置(Route Segment Config)

接下来我们来到本章的正题——路由段配置。

路由段配置选项可以配置页面、布局、路由处理程序的行为。

比如我们使用 fetch 的时候可以单独配置某个请求的 revalidate

借助路由段配置,我们可以配置这个路由下所有 fetch 请求的 revalidate

路由段配置的使用方式也很简单,导出一个约定变量名即可,比如:

ts
// layout.js | page.js | route.js
export const dynamic = "auto";
export const dynamicParams = true;
export const revalidate = false;
export const fetchCache = "auto";
export const runtime = "nodejs";
export const preferredRegion = "auto";
export const maxDuration = 5;

export default function MyComponent() {}

具体这些变量名和值的类型为:

dynamic

  • 类型:

'auto' | 'force-dynamic' | 'error' | 'force-static'

  • 默认值: auto

dynamicParams

  • 类型: boolean

  • 默认值: true

fetchCache

  • 类型: 'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'

  • 默认值: 'auto'

revalidate

  • 类型: false | 'force-cache' | 0 | number

  • 默认值: false

runtime

  • 类型: 'nodejs' | 'edge'

  • 默认值: 'nodejs'

preferredRegion

  • 类型: 'auto' | 'global' | 'home' | string | string[]

  • 默认值: 'auto'

maxDuration

  • 类型: number

  • 默认值: 部署平台设置

注意

注意配置选项的值目前是静态分析的,也就是说,配置 revalidate = 600 是有效的,但是 revalidate = 60 \* 10 是无效的。

参数解释

dynamic

  • auto:默认值,Nest.js 会根据路由段中的参数数量来决定是否启用动态路由。

  • force-dynamic:强制启用动态路由,即使路由段中没有参数。

  • error:禁用动态路由,如果路由段中有参数,则会返回 404 错误。

  • force-static:强制禁用动态路由,即使路由段中有参数,也不会返回 404 错误。

  • 代码如下:

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

dynamicParams

  • true:默认值,Nest.js 会根据路由段中的参数数量来决定是否启用动态路由。

  • false:返回 404

ts
// layout.jsx | page.jsx
export const dynamicParams = true; // true | false,

revalidate

设置布局或者页面的默认验证时间。此设置不会覆盖单个 fetch 请求设置的 revalidate 的值。 注意 revalidate 选项只能用于 Nodejs Runtime,不能用于 Edge Runtime。

ts
// layout.jsx | page.jsx | route.js
export const revalidate = false;
// false | 'force-cache' | 0 | number
  • false(默认),语义上相当于 revalidate: Infinity,资源无限期缓存。

  • 0,页面或布局总是动态渲染,即使没有使用动态函数或者不缓存数据请求

  • number :设置布局或页面的默认重新验证频率,以秒为单位。

关于重新验证频率,一个路由可能有多个布局和一个页面,此时会选择最低的 revalidate 值作为路由的重新验证频率。

这是为了确保子路由的重新验证时间频率和父布局保持一致。

此外,单个 fetch 请求可以设置比路由默认的 revalidate 值更低的 revalidate 值,这会增加整个路由的重新验证频率。

这允许你根据某些动态条件进行更频繁的重新验证。

fetchCache

ts
// layout.jsx | page.jsx | route.js
export const fetchCache = "auto";
// 'auto' | 'default-cache' | 'only-cache'
// 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'
  • 'auto'(默认):动态函数之前按照开发者设置的 cache 选项进行缓存,动态函数之后不缓存请求

  • 'default-cache':开发者可以自由设置 cache 选项,但如果开发者未设置 cache 选项,默认设置为 force-cache,这意味着即使是在动态函数之后的请求,也会被视为静态

  • 'only-cache':如果开发者未设置 cache 选项,默认设置为 force-cache,如果有请求设置成 cache: 'no-store',则会导致报错

  • 'force-cache':将所有请求的 cache 选项设置为 force-cache 。

  • 'default-no-store':开发者可以自由设置 cache 选项,但如果开发者未设置 cache 选项,默认设置为 no-store,这意味着即使是在动态函数之前的请求,也会被视为动态。

  • 'only-no-store':如果开发者未设置 cache 选项,默认设置为 no-store,如果有请求设置成 cache: 'force-cache',则会导致报错

  • 'force-no-store':将所有请求的 cache 选项设置为 no-store 。

runtime

设置运行时环境

ts
// layout.jsx | page.jsx | route.js
export const runtime = "nodejs";
// 'edge' | 'nodejs'