generateMetadata
此页面涵盖了使用 generateMetadata
和静态 metadata 对象的所有基于配置的 Metadata 选项。
值得注意的是:
metadata
对象和 generateMetadata
函数导出仅在服务器组件中支持。
- 你不能在同一路由段中同时导出
metadata
对象和 generateMetadata
函数。
要定义静态 metadata,从 layout.js
或 page.js
文件中导出一个 Metadata
对象。
查看 Metadata 字段 获取完整的支持选项列表。
依赖于动态信息的动态 metadata,例如当前路由参数、外部数据或父段中的 metadata
,可以通过导出一个返回 Metadata
对象的 generateMetadata
函数来设置。
generateMetadata
函数接受以下参数:
generateMetadata
应返回一个包含一个或多个 metadata 字段的 Metadata
对象。
值得注意的是:
- 如果 metadata 不依赖于运行时信息,应使用静态
metadata
对象而不是 generateMetadata
来定义。
- 在
generateMetadata
、generateStaticParams
、Layouts、Pages 和 Server Components 中,对相同数据的 fetch
请求会自动记忆化。如果 fetch
不可用,可以使用 React cache
。
searchParams
仅在 page.js
段中可用。
- Next.js 的
redirect()
和 notFound()
方法也可以在 generateMetadata
内部使用。
title
属性用于设置文档的标题。它可以定义为简单的字符串或可选的模板对象。
title.default
可用于为未定义 title
的子路由段提供一个后备标题。
title.template
可用于为子路由段中定义的 titles
添加前缀或后缀。
值得注意的是:
-
title.template
适用于子路由段,而不是定义它的段。这意味着:
- 添加
title.template
时需要 title.default
。
- 在
layout.js
中定义的 title.template
不会应用于同一路由段中 page.js
定义的 title
。
- 在
page.js
中定义的 title.template
没有效果,因为页面始终是终止段(它没有任何子路由段)。
-
如果路由未定义 title
或 title.default
,则 title.template
无效。
title.absolute
可用于提供一个忽略父段中设置的 title.template
的标题。
值得注意的是:
-
layout.js
title
(字符串) 和 title.default
为子段定义默认标题(未定义自己的 title
的子段)。如果存在最近父段的 title.template
,它将增强该模板。
title.absolute
为子段定义默认标题。它忽略父段的 title.template
。
title.template
为子段定义一个新的标题模板。
-
page.js
- 如果页面未定义自己的标题,将使用最近父级解析的标题。
title
(字符串) 定义路由标题。如果存在最近父段的 title.template
,它将增强该模板。
title.absolute
定义路由标题。它忽略父段的 title.template
。
title.template
在 page.js
中没有效果,因为页面始终是路由的终止段。
metadataBase
是一个便利选项,用于为需要完全限定 URL 的 metadata
字段设置基本 URL 前缀。
metadataBase
允许当前路由段及其以下定义的基于 URL 的 metadata
字段使用相对路径,而不是原本需要的绝对 URL。
- 该字段的相对路径将与
metadataBase
组合形成一个完全限定的 URL。
- 如果未配置,
metadataBase
将自动填充为默认值。
值得注意的是:
metadataBase
通常在根 app/layout.js
中设置,以应用于所有路由的基于 URL 的 metadata
字段。
- 所有需要绝对 URL 的基于 URL 的
metadata
字段都可以用 metadataBase
选项配置。
metadataBase
可以包含子域名,例如 https://app.acme.com
或基本路径,例如 https://acme.com/start/from/here
- 如果
metadata
字段提供了绝对 URL,则会忽略 metadataBase
。
- 在基于 URL 的
metadata
字段中使用相对路径而不配置 metadataBase
将导致构建错误。
- Next.js 将规范化
metadataBase
(例如 https://acme.com/
)和相对字段(例如 /path
)之间的重复斜杠为单个斜杠(例如 https://acme.com/path
)
如果未配置,metadataBase
有一个默认值。
在 Vercel 上:
- 对于生产部署,将使用
VERCEL_PROJECT_PRODUCTION_URL
。
- 对于预览部署,
VERCEL_BRANCH_URL
将优先使用,如果不存在则回退到 VERCEL_URL
。
如果这些值存在,它们将被用作 metadataBase
的默认值,否则会回退到 http://localhost:${process.env.PORT || 3000}
。这允许 Open Graph 图像在本地构建和 Vercel 预览及生产部署上都能正常工作。当覆盖默认值时,我们建议使用环境变量来计算 URL。这允许为本地开发、暂存和生产环境配置 URL。
在系统环境变量文档中查看有关这些环境变量的更多详细信息。
URL 组合优先考虑开发者意图,而不是默认的目录遍历语义。
metadataBase
和 metadata
字段之间的尾部斜杠会被规范化。
metadata
字段中的"绝对"路径(通常会替换整个 URL 路径)被视为"相对"路径(从 metadataBase
的末尾开始)。
例如,给定以下 metadataBase
:
任何继承上述 metadataBase
并设置自己的值的 metadata
字段将按如下方式解析:
metadata 字段 | 解析后的 URL |
---|
/ | https://acme.com |
./ | https://acme.com |
payments | https://acme.com/payments |
/payments | https://acme.com/payments |
./payments | https://acme.com/payments |
../payments | https://acme.com/payments |
https://beta.acme.com/payments | https://beta.acme.com/payments |
值得注意的是:
- 对于 Open Graph 图像,使用基于文件的元数据 API可能更方便。与其必须同步配置导出和实际文件,基于文件的 API 将自动为您生成正确的元数据。
值得注意的是: 我们建议尽可能使用基于文件的元数据 API来处理图标。与其必须同步配置导出和实际文件,基于文件的 API 将自动为您生成正确的元数据。
值得注意的是: msapplication-*
元标签在 Microsoft Edge 的 Chromium 版本中不再受支持,因此不再需要。
已废弃: 自 Next.js 14 起,metadata
中的 themeColor
选项已废弃。请改用 viewport
配置。
Web 应用程序清单,定义在 Web 应用程序清单规范中。
Twitter 规范(令人惊讶的是)不仅仅用于 X(前身为 Twitter)。
了解更多关于 Twitter 卡片标记参考的信息。
已废弃: 自 Next.js 14 起,metadata
中的 viewport
选项已废弃。请改用 viewport
配置。
提供一个指向历史记录、文档或其他具有历史意义的材料集合的链接(来源)。
您可以将Facebook应用或Facebook账户连接到您的网页,以便使用某些Facebook社交插件 Facebook文档
值得注意的是:您可以指定appId或admins,但不能同时指定两者。
如果您想生成多个fb:admins元标签,可以使用数组值。
所有元数据选项都应该通过内置支持来覆盖。但是,可能存在特定于您网站的自定义元数据标签,或者刚刚发布的新元数据标签。您可以使用other
选项来渲染任何自定义元数据标签。
如果您想生成多个相同键的元标签,可以使用数组值。
以下元数据类型目前没有内置支持。但是,它们仍然可以在布局或页面本身中进行渲染。
<link>
元素有许多 rel
关键字,可用于向浏览器暗示可能需要外部资源。浏览器使用此信息根据关键字应用预加载优化。
虽然元数据 API 不直接支持这些提示,但您可以使用新的 ReactDOM
方法 安全地将它们插入到文档的 <head>
中。
在页面渲染(浏览器)生命周期的早期开始加载资源。MDN 文档。
预先启动与源的连接。MDN 文档。
在请求资源之前尝试解析域名。MDN 文档。
值得注意的是:
- 这些方法目前仅在客户端组件中支持,但在初始页面加载时仍会进行服务器端渲染。
- Next.js 内置功能如
next/font
、next/image
和 next/script
会自动处理相关资源提示。
您可以使用 Metadata
类型为元数据添加类型安全。如果您在 IDE 中使用 内置 TypeScript 插件,则无需手动添加类型,但如果您希望,仍可以显式添加。
对于 JavaScript 项目,您可以使用 JSDoc 添加类型安全。
版本 | 变更 |
---|
v13.2.0 | viewport 、themeColor 和 colorScheme 已弃用,改为使用 viewport 配置。 |
v13.2.0 | 引入了 metadata 和 generateMetadata 。 |