Domain 207 / 225
Next.js SEO は App Router で metadata API + Server Components が標準
Next.js SEO の要点
Next.js は React の SEO 課題を解決する代表フレームワーク。App Router の metadata API で title / description / OGP を一元管理、Server Components で SSR / SSG を選択、構造化データは <script type=application/ld+json> で実装
なぜこれを学ぶか
Next.js は React フレームワークの SEO 標準。 App Router の機能を正しく使えば、SPA 的に書きながら完全な SEO 対応が可能。
Next.js を使うすべての担当者で必須。
学ばないと起きること
| よくある事故 | 被害 |
|---|---|
| metadata 設定漏れ | title / OGP 欠落 |
| Client Components 多用 | SEO 評価減 |
| 構造化データなし | リッチリザルト機会逃す |
学ぶメリット
- Next.js での完全 SEO 対応
- 高速 + SEO 両立
- 商談で「App Router SEO」を即答
仕組み
metadata API
// app/page.tsx
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'spotyou - SEO/AEO ガイド',
description: '無料で学べる SEO/AEO 完全ガイド',
openGraph: {
title: 'spotyou - SEO/AEO ガイド',
description: '...',
images: ['/og.png'],
},
twitter: {
card: 'summary_large_image',
},
robots: {
index: true,
follow: true,
},
alternates: {
canonical: 'https://spotyou.ai/',
},
};
generateMetadata(動的)
// app/blog/[slug]/page.tsx
export async function generateMetadata({ params }): Promise<Metadata> {
const post = await getPost(params.slug);
return {
title: post.title,
description: post.excerpt,
openGraph: {
images: [post.image],
},
};
}
各記事ごとに動的 metadata 生成。
Server vs Client Components
| Server | Client | |
|---|---|---|
| デフォルト | はい | "use client" 必要 |
| SEO | 完全対応 | レンダリング後 |
| 用途 | データ取得 / SEO | インタラクティブ |
SEO 重視なら Server Components がデフォルト。
sitemap.xml の自動生成
// app/sitemap.ts
import type { MetadataRoute } from 'next';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const posts = await getPosts();
return posts.map(post => ({
url: `https://spotyou.ai/blog/${post.slug}`,
lastModified: post.updatedAt,
}));
}
robots.txt の生成
// app/robots.ts
import type { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
return {
rules: { userAgent: '*', allow: '/' },
sitemap: 'https://spotyou.ai/sitemap.xml',
};
}
キー概念
構造化データの実装
// 各ページで
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Article',
headline: post.title,
// ...
};
return (
<article>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
{/* コンテンツ */}
</article>
);
Server Component 内でレンダリング。
Edge Runtime vs Node.js Runtime
// Edge Runtime(高速、制限あり)
export const runtime = 'edge';
// Node.js Runtime(標準)
export const runtime = 'nodejs';
SEO 重要ページは Edge Runtime で TTFB 改善。
ISR / 再検証
export const revalidate = 3600; // 1 時間
または on-demand:
import { revalidatePath } from 'next/cache';
revalidatePath('/blog');
Image 最適化
import Image from 'next/image';
<Image
src="/hero.jpg"
width={1200}
height={630}
alt="..."
priority // LCP 候補なら priority
/>
AVIF / WebP / srcset を自動生成。
よくある誤解
| よくある誤解 | 実際のところ | 出典 |
|---|---|---|
| Next.js は SPA だから SEO 不利 | App Router で完全対応 | Next.js Metadata |
| すべて Server Component で OK | インタラクティブな部分は Client | 同上 |
実務での適用
App Router 標準構成
app/
layout.tsx // 共通 metadata
page.tsx // トップページ
sitemap.ts // sitemap 生成
robots.ts // robots.txt 生成
blog/
page.tsx // ブログ一覧
[slug]/
page.tsx // 記事 + generateMetadata
CWV 最適化
- Server Components デフォルト
- dynamic import で重い JS 遅延
- next/image で画像最適化
- Edge Runtime で TTFB 改善
- Streaming SSR で LCP 改善
トラブル別の対処
| 症状 | 確認すべきこと |
|---|---|
| metadata が反映されない | export const metadata or generateMetadata |
| SEO 評価低 | Client Component 過多 / SSR 設定 |
公式ソース
自己テスト
Q1. Next.js App Router の metadata 設定方法は?
export const metadata または generateMetadata 関数
Q2. SEO 重視の Component の選択は?
Server Components がデフォルト、インタラクティブ部分のみ "use client"
Q3. sitemap / robots.txt の自動生成方法は?
app/sitemap.ts / app/robots.ts でエクスポート関数
これらの内容を採点付きで挑戦したい場合は、本ドメインのプロ試験で 5 問形式で確認できる。