You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js App Router中如何读取页面静态Metadata?

在Next.js App Router根layout中读取子路由静态metadata的页面标题

有两种可靠的方法可以实现需求:

方法一:通过headers()读取x-nextjs-metadata头

Next.js会将当前路由的metadata序列化为x-nextjs-metadata请求头,你可以在根layout中读取并解析这个头来获取页面标题:

import { headers } from 'next/headers';

export default function RootLayout({ children }) {
  const headerList = headers();
  // 解析metadata,处理空值情况
  const pageMetadata = JSON.parse(headerList.get('x-nextjs-metadata') || '{}');
  const pageTitle = pageMetadata.title || '默认站点标题';

  return (
    <html lang="zh-CN">
      <body>
        <header>
          <h2>{pageTitle}</h2>
        </header>
        <main>{children}</main>
      </body>
    </html>
  );
}

在子路由页面(比如app/blog/page.js)中定义静态metadata:

export const metadata = {
  title: '博客首页',
};

export default function BlogPage() {
  return <div>博客内容</div>;
}

访问/blog时,header会自动显示“博客首页”,未定义title的路由会使用默认标题。

方法二:手动维护路由-标题映射(适合少量路由场景)

如果你的路由数量不多,可以创建一个映射对象,结合usePathname获取当前路径来匹配标题:

'use client';
import { usePathname } from 'next/navigation';

// 路由与标题的映射表
const routeTitles = {
  '/': '首页',
  '/about': '关于我们',
  '/blog': '博客首页',
};

export default function RootLayout({ children }) {
  const pathname = usePathname();
  const pageTitle = routeTitles[pathname] || '默认站点标题';

  return (
    <html lang="zh-CN">
      <body>
        <header>
          <h2>{pageTitle}</h2>
        </header>
        <main>{children}</main>
      </body>
    </html>
  );
}

这种方法不需要依赖请求头,逻辑更直观,但需要手动同步路由和标题的变化。


内容的提问来源于stack exchange,提问作者Nico Richter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:27:40