GEO
GEO Docs

Next.js

使用 @geo/sdk-next 在 App Router 中生成 Metadata、JSON-LD、sitemap 与 robots。

npm i @geo/sdk-next

generateMetadata

// app/[locale]/blog/[slug]/page.tsx
import { geoMetadata } from '@geo/sdk-next';

export async function generateMetadata({ params }) {
  const { locale, slug } = await params;
  const post = await getPost(slug, locale);
  return geoMetadata({
    site: process.env.NEXT_PUBLIC_GEO_SITE!,
    path: `/blog/${slug}`,
    locale,
    variables: { title: post.title, summary: post.summary, cover: post.cover },
    fallback: { title: post.title, description: post.summary },
  });
}

geoMetadata() 会把平台规则转成 Next 的 Metadata:title、description、alternates.canonical、alternates.languages(hreflang)、openGraph、twitter、robots。

JSON-LD

import { GeoJsonLd } from '@geo/sdk-next';

export default async function Page({ params }) {
  return (
    <>
      <GeoJsonLd site={site} path={`/blog/${slug}`} locale={locale} variables={{ title, summary }} />
      <article>…</article>
    </>
  );
}

sitemap 与 robots

// app/sitemap.ts
import { geoSitemap } from '@geo/sdk-next';
export default geoSitemap({ site: process.env.NEXT_PUBLIC_GEO_SITE! });

// app/robots.ts
import { geoRobots } from '@geo/sdk-next';
export default geoRobots({ site: process.env.NEXT_PUBLIC_GEO_SITE! });

两者都从平台的 sitemap / robots 配置生成,并带上多语言 alternates。

客户端路由

在根布局加入 <GeoClient site="…" />,SPA 导航时 head 保持与规则同步(generateMetadata 已经覆盖的字段不会被重复写入)。

缓存

配置请求在边缘缓存 5 分钟,后台发布时按站点失效。geoMetadata() 默认 revalidate: 300,可通过 cache 参数调整。