参数理解
用于控制:当用户访问一个没有通过 generateStaticParams 预先生成的动态路由参数时,Next.js 应该如何处理。
适用文件:layout.tsx、page.tsx。
export const dynamicParams = true; // true | falsetrue,默认值。当用户访问没有通过 generateStaticParams 结果中的动态路由,会在用户请求时动态生成。
false,没有包含在 generateStaticParams 返回结果中的动态路由,将返回 404 Not Found。
假设有一个动态路由:app/articles/[slug]/page.tsx,并使用 generateStaticParams 在构建阶段生成部分文章页面:
export async function generateStaticParams() {
return [
{ slug: "nextjs-routing" },
{ slug: "typescript-comments" },
];
}构建时,Next.js 已知的页面是:/articles/nextjs-routing 和 /articles/typescript-comments。
如果用户访问 /articles/react-routing,没有出现在 generateStaticParams 返回结果中,dynamicParams 决定 Next.js 如何处理这个请求。
dynamicParams = true:
Next.js 不会因为它没有在构建阶段生成就立即返回 404。
- 会尝试在请求发生时生成这个页面;
- 不一定就直接判定它不存在,先让它进入页面渲染逻辑;
- 动态路由按 URL 提供的参数在请求时渲染,generateStaticParams() 只是把其中一部分路由提前到构建阶段生成,具体结果依赖于页面的渲染逻辑。
dynamicParams = false,Next.js 直接返回 404。
静态导出
在静态导出网站中,所有的内容都来自固定文件,构建时已经可以确定所有合法路径,不会在部署完成后临时增加新文章。
所以:在 output: 'export' 模式下,通常不需要显式声明 dynamicParams = false。
FAQ
dynamicParams = true 是不是请求时“多生成一次”?
更准确的说法是:
对于没有在构建阶段预生成的路径,第一次收到请求时,Next.js 执行该路径对应的服务端渲染逻辑。
配合掌握的知识点
-
动态路由段
-
generateStaticParams -
预渲染和请求时生成
-
notFound()
-
缓存和 ISR
-
部署模式