Next.js - 元数据
网页的元数据存储重要信息,如网页标题、描述、标题卡图像等。适当的元数据对于更好的搜索引擎结果至关重要。在本章中,我们将解释 Next.js 中的元数据对象,如何定义静态和动态元数据,如何使用 CSS 生成元数据图像。
Next.js 中的元数据对象
在 Next.js 中,元数据对象是 App Router 的一部分,用于定义每个路由的元数据。使用元数据对象,我们可以定义标题、描述和其他 SEO 组件,即使是动态生成的路由。以下是元数据对象的语法。
export const metadata = { title: "网页标题", description: "网页描述" }
Title 属性
title 属性用于设置文档的标题。它可以定义为一个简单的字符串或一个可选的模板对象。
import type { Metadata } from 'next' export const metadata: Metadata = { title: { default: '...', template: '...', absolute: '...', }, }
- default :此默认标题值,定义子路由的后备标题
- template :用于为子路由中定义的标题添加前缀或后缀
- absolute :用于提供忽略父路由中设置的 title.template 的标题。
声明静态元数据
静态元数据是指不依赖于外部源数据的元数据。此静态元数据对于所有用户都保持不变,并且在编写应用程序时定义。
在应用路由器中,您可以通过从"layout.tsx"或静态"page.tsx"文件导出元数据对象来定义静态元数据。layout.tsx 中定义的元数据可供布局中的所有组件访问。page.tsx 中定义的元数据特定于该组件,它可以覆盖布局页面的元数据。
布局组件元数据示例
在下面的代码中,我们使用元数据对象为布局组件定义元数据。我们定义的标题将显示在浏览器选项卡的顶部。
// app/layout.tsx file import { ReactNode } from 'react'; import type { Metadata } from 'next' export const metadata: Metadata = { title: 'Next JS Tutorial', description: 'We provide simple and easy to learn tutorial on Next JS', } interface RootLayoutProps { children: ReactNode; } export default function RootLayout({ children }: RootLayoutProps) { return ( <html lang="en"> <body> <header> <h1>Header Element</h1> </header> <main>{children}</main> </body> </html> ); }
输出
以下是上述代码的输出。标题元数据以红色矩形突出显示。
任何组件的元数据示例
如上所述,我们可以在任何组件内覆盖布局页面的元数据。在下面的示例中,我们为"关于"页面定义了新的标题和描述。
// app/about/page.tsx file import type { Metadata } from 'next'; export const metadata: Metadata = { title: 'Next JS About Page', description: 'We provide simple and easy to learn tutorial on Next JS', } export default function About() { return ( <div> <h1>About Us</h1> <h2>Welcome to the Next JS About page!</h2> <h4>This page is same for all users</h4> </div> ); }
输出
这是上述两段代码的组合输出。您可以看到,布局页面中定义的元数据是默认元数据,当我们打开"关于"页面时,它会被"关于"页面的元数据覆盖。
声明动态元数据
动态元数据依赖于动态信息,例如当前路由参数、外部数据或父段中的元数据。可以通过导出返回元数据对象的"generateMetadata()"函数来设置它。在阅读示例之前,先了解动态路由的工作原理。
基于路由的动态标题示例
在下面的示例中,我们将根据用户选择的页面为组件生成动态标题。
// app/products/[id]/page.tsx import { Metadata } from "next"; type Props ={ params: { id: string; }; } // 动态元数据函数 export const generateMetadata = ({ params }: Props): Metadata => { return { title: `Product ${params.id} - My Store`, }; } export default function ProductPage({params }: Props) { return ( <div> <h1>Product {params.id}</h1> <p>This is the product page for item {params.id}</p> </div> ); }
输出
在输出中,您可以看到页面根据我们选择的路线而变化。
元数据图像生成
元数据图像用于创建社交媒体图像,例如 Open Graph 图像、Twitter 卡片等。当我们的网页链接在 Whatsapp、Twitter 等中共享时,将显示此图像。
简单 Hello World 图像示例
以下示例使用 ImageResponse 构造函数通过 JSX 和 CSS 生成动态图像。我们将在同一网页中显示生成的图像,以便您可以在输出中看到它。
// app/api/og/route.js import { ImageResponse } from 'next/og'; export async function GET() { return new ImageResponse( ( <div style={{ fontSize: 50, background: 'grey', color: '#f0f0f0', width: '100%', height: '100%', display: 'flex', textAlign: 'center', alignItems: 'center', justifyContent: 'center', }} > Hello world! </div> ), { width: 300, height: 100, } ); } // app/contacts/page.js export default function Page() { return ( <div> <h1>Contacts Page</h1> <img src="/api/og" alt="Generated Image" /> </div> ); }
输出
在下面的输出中,您可以看到生成的带有"Hello World"消息的图像。