概念

发布于 2026-07-24更新于 2026-07-30

dynamicParams

当访问一个没有通过 `generateStaticParams` 预先生成的动态路由参数时,Next.js 应该如何处理。

官方文档

参数理解

用于控制:当用户访问一个没有通过 generateStaticParams 预先生成的动态路由参数时,Next.js 应该如何处理。

适用文件:layout.tsx、page.tsx。

export const dynamicParams = true; // true | false

true,默认值。当用户访问没有通过 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 执行该路径对应的服务端渲染逻辑。

配合掌握的知识点

  1. 动态路由段

  2. generateStaticParams

  3. 预渲染和请求时生成

  4. notFound()

  5. 缓存和 ISR

  6. 部署模式