元数据对象与 generateMetadata 选项
本文涵盖所有基于 generateMetadata
和静态元数据对象的配置式元数据选项。
须知:
metadata
对象和generateMetadata
函数导出仅支持在服务端组件中使用- 不能在同一路由段中同时导出
metadata
对象和generateMetadata
函数
metadata
对象
要定义静态元数据,可从 layout.js
或 page.js
文件导出一个 Metadata
对象。
完整支持的选项列表请参阅元数据字段。
generateMetadata
函数
依赖动态信息的元数据(如当前路由参数、外部数据或父段中的 metadata
)可通过导出一个返回 Metadata
对象 的 generateMetadata
函数来设置。
参数
generateMetadata
函数接受以下参数:
-
props
- 包含当前路由参数的对象:-
params
- 包含从根段到调用generateMetadata
的段的动态路由参数对象。例如:路由 URL params
app/shop/[slug]/page.js
/shop/1
{ slug: '1' }
app/shop/[tag]/[item]/page.js
/shop/1/2
{ tag: '1', item: '2' }
app/shop/[...slug]/page.js
/shop/1/2
{ slug: ['1', '2'] }
-
searchParams
- 包含当前 URL 的查询参数的对象。例如:URL searchParams
/shop?a=1
{ a: '1' }
/shop?a=1&b=2
{ a: '1', b: '2' }
/shop?a=1&a=2
{ a: ['1', '2'] }
-
-
parent
- 父路由段解析后的元数据的 Promise。
返回值
generateMetadata
应返回包含一个或多个元数据字段的 Metadata
对象。
须知:
- 如果元数据不依赖运行时信息,应使用静态
metadata
对象而非generateMetadata
定义。fetch
请求在generateMetadata
、generateStaticParams
、布局、页面和服务端组件之间会自动记忆化。如果无法使用fetch
,可使用 React 的cache
。searchParams
仅在page.js
段中可用。- Next.js 的
redirect()
和notFound()
方法也可在generateMetadata
中使用。
元数据字段
title
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
中无效,因为页面始终是路由的终止段。
description
基础字段
metadataBase
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
将被忽略。- 未配置
metadataBase
时在基于 URL 的metadata
字段中使用相对路径会导致构建错误。- Next.js 会规范化
metadataBase
(如https://acme.com/
)和相对字段(如/path
)之间的重复斜杠为单斜杠(如https://acme.com/path
)。
默认值
如果未配置,metadataBase
有默认值:
- 检测到
VERCEL_URL
时为https://${process.env.VERCEL_URL}
,否则回退到http://localhost:${process.env.PORT || 3000}
。 - 覆盖默认值时,建议使用环境变量计算 URL,以便为本地开发、预发布和生产环境配置 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 |
openGraph
须知:
- 对于 Open Graph 图片,使用基于文件的元数据 API 可能更方便。无需手动同步配置文件与实际文件,基于文件的 API 会自动为您生成正确的元数据。
robots
icons
须知:我们建议尽可能使用基于文件的元数据 API 来设置图标。无需手动同步配置文件与实际文件,基于文件的 API 会自动为您生成正确的元数据。
须知:
msapplication-*
元标签在 Microsoft Edge 的 Chromium 版本中不再支持,因此不再需要。
themeColor
了解更多关于 theme-color 的信息。
简单主题色
带媒体属性
manifest
Web 应用清单,定义于 Web 应用清单规范。
twitter
了解更多关于 Twitter Card 标记参考。
viewport
须知:
viewport
元标签会自动设置为以下默认值。通常无需手动配置,因为默认值已足够。但为了完整性,这里提供了相关信息。
verification
appleWebApp
alternates
appLinks
archives
描述具有历史价值的记录、文档或其他材料的集合(来源)。
assets
bookmarks
category
other
所有元数据选项都应通过内置支持来覆盖。然而,可能会有特定于您网站的自定义元数据标签,或刚刚发布的全新元数据标签。您可以使用 other
选项来渲染任何自定义元数据标签。
不受支持的元数据类型
以下元数据类型目前没有内置支持,但仍可以在布局或页面中直接渲染。
元数据 | 推荐方案 |
---|---|
<meta http-equiv="..."> | 通过 redirect() 、中间件 (Middleware) 或 安全头 (Security Headers) 设置适当的 HTTP 头 |
<base> | 在布局或页面中直接渲染该标签 |
<noscript> | 在布局或页面中直接渲染该标签 |
<style> | 了解更多关于 Next.js 中的样式设置 |
<script> | 了解更多关于 脚本使用 |
<link rel="stylesheet" /> | 直接在布局或页面中 import 样式表 |
<link rel="preload /> | 使用 ReactDOM 的 preload 方法 |
<link rel="preconnect" /> | 使用 ReactDOM 的 preconnect 方法 |
<link rel="dns-prefetch" /> | 使用 ReactDOM 的 prefetchDNS 方法 |
资源提示
<link>
元素有许多 rel
关键字可用于向浏览器提示可能需要外部资源。浏览器会根据这些关键字应用预加载优化。
虽然元数据 API 不直接支持这些提示,但你可以使用新的 ReactDOM
方法 安全地将它们插入文档的 <head>
中。
<link rel="preload">
在页面渲染 (浏览器) 生命周期的早期开始加载资源。MDN 文档。
<link rel="preconnect">
预先发起与源的连接。MDN 文档。
<link rel="dns-prefetch">
在资源被请求前尝试解析域名。MDN 文档。
须知:
- 这些方法目前仅在客户端组件 (Client Components) 中受支持,这些组件在初始页面加载时仍会进行服务端渲染 (SSR)。
- Next.js 内置功能如
next/font
、next/image
和next/script
会自动处理相关资源提示。- React 18.3 尚未包含
ReactDOM.preload
、ReactDOM.preconnect
和ReactDOM.preconnectDNS
的类型定义。你可以使用// @ts-ignore
作为临时解决方案来避免类型错误。
类型
你可以使用 Metadata
类型为元数据添加类型安全。如果在 IDE 中使用 内置 TypeScript 插件,则无需手动添加类型,但仍可以显式添加。
metadata
对象
generateMetadata
函数
常规函数
异步函数
带分段属性
带父级元数据
JavaScript 项目
对于 JavaScript 项目,可以使用 JSDoc 添加类型安全。
版本历史
版本 | 变更 |
---|---|
v13.2.0 | 引入 metadata 和 generateMetadata 功能。 |