Next.js第十四课 - Metadata 与 OG 图片

4 阅读3分钟

前面我们学习了字体优化,本节来聊聊 Metadata 和 OG 图片。Metadata 是 SEO 和社交媒体分享的关键,配置得当能让你的网站在搜索引擎和社交媒体中表现更好。

Metadata 概述

Metadata API 让你可以定义:

良好的 Metadata 配置能显著提升网站的点击率和流量。

静态 Metadata

基本配置

最简单的 Metadata 配置:

// app/layout.tsx
import type { Metadata } from 'next'

export const metadata: Metadata = {
  title: '我的应用',
  description: '使用 Next.js 构建的现代化应用',
}

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="zh-CN">
      <body>{children}</body>
    </html>
  )
}

完整配置

一个更完整的配置示例:

// app/layout.tsx
import type { Metadata } from 'next'

export const metadata: Metadata = {
  title: '我的应用',
  description: '使用 Next.js 构建的现代化应用',
  keywords: ['Next.js', 'React', 'TypeScript'],
  authors: [{ name: '作者名', url: 'https://example.com' }],
  openGraph: {
    title: '我的应用',
    description: '使用 Next.js 构建的现代化应用',
    url: 'https://example.com',
    siteName: '我的应用',
    images: [
      {
        url: 'https://example.com/og.jpg',
        width: 1200,
        height: 630,
      },
    ],
    locale: 'zh_CN',
    type: 'website',
  },
  twitter: {
    card: 'summary_large_image',
    title: '我的应用',
    description: '使用 Next.js 构建的现代化应用',
    images: ['https://example.com/og.jpg'],
  },
}

动态 Metadata

很多情况下,我们需要根据数据动态生成 Metadata:

generateMetadata 函数

// app/blog/[slug]/page.tsx
import type { Metadata } from 'next'

export async function generateMetadata({
  params,
}: {
  params: { slug: string }
}): Promise<Metadata> {
  const post = await fetchPost(params.slug)

  return {
    title: post.title,
    description: post.excerpt,
    openGraph: {
      title: post.title,
      description: post.excerpt,
      images: [post.coverImage],
    },
  }
}

export default async function BlogPost({
  params,
}: {
  params: { slug: string }
}) {
  const post = await fetchPost(params.slug)
  return <article>{/* ... */}</article>
}

访问父级 Metadata

export async function generateMetadata({
  params,
}: {
  params: { slug: string }
}): Promise<Metadata> {
  return {
    title: '文章详情', // 会追加到父级标题后
  }
}

图标和清单

配置网站图标:

// app/layout.tsx
import type { Metadata } from 'next'

export const metadata: Metadata = {
  icons: {
    icon: '/favicon.ico',
    shortcut: '/favicon-16x16.png',
    apple: '/apple-touch-icon.png',
  },
  manifest: '/manifest.json',
}

Open Graph 图片

OG 图片在社交媒体分享时显示,非常重要。

基本 OG 图片

export const metadata: Metadata = {
  openGraph: {
    images: [
      {
        url: 'https://example.com/og.jpg',
        width: 1200,
        height: 630,
        alt: '我的应用',
      },
    ],
  },
}

多个 OG 图片

export const metadata: Metadata = {
  openGraph: {
    images: [
      {
        url: 'https://example.com/og-1200x630.jpg',
        width: 1200,
        height: 630,
        alt: '我的应用 - 大图',
      },
      {
        url: 'https://example.com/og-800x418.jpg',
        width: 800,
        height: 418,
        alt: '我的应用 - 中图',
      },
    ],
  },
}

动态 OG 图片

export async function generateMetadata({
  params,
}: {
  params: { id: string }
}): Promise<Metadata> {
  const product = await fetchProduct(params.id)

  return {
    openGraph: {
      images: [
        {
          url: product.image,
          width: 1200,
          height: 630,
          alt: product.name,
        },
      ],
    },
  }
}

Twitter 卡片

Twitter 有自己的卡片格式:

export const metadata: Metadata = {
  twitter: {
    card: 'summary_large_image',
    site: '@yourtwitterhandle',
    title: '我的应用',
    description: '使用 Next.js 构建的现代化应用',
    images: {
      url: 'https://example.com/og.jpg',
      alt: '我的应用',
    },
  },
}

SEO 实用技巧

这里分享几个在配置 SEO 时特别有用的技巧。

独特的标题和描述

实际开发中,我发现每个页面都应该有独特的标题和描述,这对 SEO 特别重要:

// 推荐这样做 - 每个页面有独特的 Metadata
export async function generateMetadata({ params }) {
  const post = await fetchPost(params.slug)
  return {
    title: post.title,
    description: post.excerpt,
  }
}

// 避免这种情况 - 所有页面使用相同的 Metadata
export const metadata = {
  title: '我的博客',
  description: '一个使用 Next.js 构建的博客',
}

合理的标题长度

这里有个小建议:标题应该简洁明了,太长的标题反而不容易被搜索引擎完整显示:

// 推荐这样做 - 简洁明了的标题
title: 'Next.js 教程:从零开始学习 Next.js'

// 避免这种情况 - 过长的标题
title: 'Next.js 教程:从零开始学习 Next.js,包括安装、配置、路由、数据获取、部署等所有内容'

描述性描述

这个技巧特别有用——描述应该包含关键词且有实际意义:

// 推荐这样做 - 描述性且包含关键词
description: '学习如何使用 Next.js 构建现代化的 Web 应用,包括服务端渲染、静态生成、API 路由等核心概念。'

// 避免这种情况 - 无意义的描述
description: '这是一个很好的网站,你一定会喜欢的。'

总结

本节我们学习了 Next.js 的 Metadata API,包括静态和动态 Metadata、OG 图片、Twitter 卡片等。良好的 Metadata 配置能显著提升网站的 SEO 和社交媒体表现。

如果你对本节内容有任何疑问,欢迎在评论区提出来,我们一起学习讨论。

原文地址:blog.uuhb.cn/archives/ne…