generateMetadata
你可以使用 metadata
对象或 generateMetadata
函数来定义元数据。
metadata
对象
要定义静态元数据,从 layout.js
或 page.js
文件导出 Metadata
对象。
- TypeScript
layout.tsx | page.tsx
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: '...',
description: '...',
}
export default function Page() {}
- JavaScript
layout.js | page.js
export const metadata = {
title: '...',
description: '...',
}
export default function Page() {}
有关支持的选项的完整列表,请参阅 元数据字段。
generateMetadata
函数
动态元数据依赖于动态信息,例如当前路由参数、外部数据或父段中的 metadata
,可以通过导出一个返回 Metadata
对象 的 generateMetadata
函数来设置。
- TypeScript
- JavaScript
app/products/[id]/page.tsx
import type { Metadata, ResolvingMetadata } from 'next'
type Props = {
params: Promise<{ id: string }>
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}
export async function generateMetadata(
{ params, searchParams }: Props,
parent: ResolvingMetadata
): Promise<Metadata> {
// 读取路由参数
const { id } = await params
// 获取数据
const product = await fetch(`https://.../${id}`).then((res) => res.json())
// 可选地访问和扩展(而不是替换)父元数据
const previousImages = (await parent).openGraph?.images || []
return {
title: product.title,
openGraph: {
images: ['/some-specific-page-image.jpg', ...previousImages],
},
}
}
export default function Page({ params, searchParams }: Props) {}
app/products/[id]/page.js
export async function generateMetadata({ params, searchParams }, parent) {
// 读取路由参数
const { id } = await params
// 获取数据
const product = await fetch(`https://.../${id}`).then((res) => res.json())
// 可选地访问和扩展(而不是替换)父元数据
const previousImages = (await parent).openGraph?.images || []
return {
title: product.title,
openGraph: {
images: ['/some-specific-page-image.jpg', ...previousImages],
},
}
}
export default function Page({ params, searchParams }) {}
提示:
- 元数据可以添加到
layout.js
和page.js
文件中。- Next.js 会自动解析元数据,并为页面创建相关的
<head>
标签。metadata
对象和generateMetadata
函数的导出仅在服务端组件中支持。- 你不能从同一路由段导出
metadata
对象和generateMetadata
函数。generateMetadata
中的fetch
请求会自动进行 记忆化,以便在generateMetadata
、generateStaticParams
、布局、页面和服务端组件之间共享相同的数据。- 解析
generateMetadata
是渲染页面的一部分。如果页面可以预渲染,并且generateMetadata
不引入动态行为,则其结果将包含在页面的初始 HTML 中。- 如果
fetch
不可用,可以使用 Reactcache
。- 基于文件的元数据 优先级更高,将覆盖
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。