JavaScriptフレームワークのSEO
React、Next.js、Vue、Nuxt、Angular、Svelte、AstroなどJavaScriptフレームワークのSEOを解説します。SSR、SSG、CSRのレンダリングモードがGoogleのインデックス登録をどう決めるか、初期状態でどのフレームワークがSEOに最も適しているかを扱います。
言語
JavaScriptフレームワークのSEOはレンダリングモードで決まります。SSGとSSRはGooglebotに事前生成HTMLを渡しますが、CSRは成功するとは限らないJavaScript実行に依存します。Next.jsとNuxtはSSR、SSG、ISR、メタデータAPIによる組み込みSEOサポートが最も充実し、純粋なReactとVueのCSRモードはリスクが高くなります。AstroはデフォルトのIslandアーキテクチャがSEOに適しており、Angularは安定したインデックス登録に@angular/ssrが必要です。
TL;DR — JavaScriptフレームワークの多くは、訪問者のブラウザーでページを構築します (CSR)。ユーザーには問題なくても、検索エンジンがJavaScriptを実行せずコンテンツを見落とすことがあります。 対策は、サーバー(SSR)またはビルド時(SSG)にページを作るモードを使うことです。Next.jsとNuxtなら簡単で、 CSRモードの純粋なReactとVueでは追加作業が必要です。
JavaScriptフレームワークにSEO上の懸念がある理由
Googleはクロール、レンダリング、インデックス登録を通してJavaScriptを処理します。ブロックされたリソースや失敗したリソースは、 レンダリング結果を変える可能性があります。 Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics レンダリングモードとメタデータの実装は、 フレームワークのブランドだけよりも重要です。 Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: web.dev: Rendering on the Web
従来のサイトはサーバーから完全なHTMLを送ります。検索エンジンのクローラーはそのHTMLをダウンロードして、すぐにコンテンツをインデックス登録します。 JavaScriptフレームワークは異なる動作をすることが多く、サーバーが最小限のHTMLを送り、その後ブラウザーでJavaScriptが実際のページコンテンツを組み立てます。
検索エンジンのクローラーがJavaScriptを実行しない(または実行しても何かが失敗する)と、空のページが見えます。これがCSRのSEO問題です。
レンダリングモードを理解する
- SSG(静的サイト生成) — デプロイ時にページをHTMLとしてビルドします。クローラーはJavaScriptなしで完全なHTMLを取得でき、SEOに最適です。
- SSR(サーバーサイドレンダリング) — リクエストごとにサーバーがHTMLを新しく作ります。クローラーは完全なHTMLを取得でき、こちらもSEOに非常に適しています。
- CSR(クライアントサイドレンダリング) — ブラウザーでJavaScriptがページを構築します。クローラーはコンテンツを見るためにJavaScriptを実行する必要があります。Googleは実行できますが、失敗が起き、発見も遅くなります。
初期状態でのSEO安全性によるフレームワーク比較
最も安全:
- Astro — デフォルトで静的HTMLを生成し、JavaScriptは明示的に選んだ場所だけに使います。
- Next.js — SSG、SSR、ISR、完全なメタデータAPIを提供し、業界標準です。
- Nuxt — Vueエコシステムで同じ役割を持ち、SSR/SSGサポートが非常に優れています。
設定が必要:
- Angular — デフォルトはCSRで、安全なSEOには
@angular/ssr(旧Angular Universal)が必要です。 - React — デフォルトはCSRで、SSR/SSGにはNext.jsまたはReact Router(フレームワークモード)が必要です。
- Vue — デフォルトはCSRで、SSR/SSGにはNuxtが必要です。
- Svelte — デフォルトはCSRで、SvelteKitがSSR/SSGサポートを追加します。
TL;DR — 技術的には、JSフレームワークのSEOは(1)初期HTMLペイロードのレンダリングアーキテクチャ、 (2)レスポンス送信前の
<head>へのメタデータ注入、(3)ハイドレーションとリンク発見の扱い、 (4)ISRキャッシュの古さに関係します。Next.jsには最も完全な組み込みSEOツール(Metadata API、組み込みのapp/sitemap.ts、画像最適化)があります。 Astroはアーキテクチャ上、最もSEO安全です。
フレームワークごとのレンダリングモード、メタデータAPI、ISRサポート
フレームワークの機能とデフォルトはバージョンによって変わるため、各フレームワークの公式ドキュメントで確認してください。 Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: web.dev: Rendering on the Web レンダリングモードがインデックス登録やランキングを保証することはありません。 Evidence for this claim Primary standard or official documentation supporting the adjacent article claim. Scope: Protocol semantics and Search behavior are kept separate; no indexing, ranking, or migration-timing guarantee is inferred. Confidence: high · Verified: Google: JavaScript SEO basics フレームワークを比較する決定では、候補ごとに同じルート、コンテンツ、デプロイ対象、ツールをテストしてください。これらを入れ替えるベンチマークは、フレームワークではなく設定の違いを測っています。
| フレームワーク | デフォルトのレンダリング | 組み込みメタデータAPI | SSR/SSGサポート | エコシステムのSEOサポート |
|---|---|---|---|---|
| Astro | SSG(islands) | Yes(.astroファイルの<head>、構造化データ用Content Collections) | Both | Strong |
| Next.js | SSR/SSG(設定可能) | Yes(App RouterのMetadata API) | Both + ISR | Excellent |
| Nuxt | デフォルトSSR | Yes(useHead、useSeoMeta) | Both + ISR | Excellent |
| SvelteKit | デフォルトSSR | Yes(svelte:head) | Both | Good |
| React Router(フレームワークモード) | デフォルトSSR | Yes(meta export) | SSR + Deferred | Good |
| Angular | デフォルトCSR | AngularのMeta/Titleサービス経由 | @angular/ssr経由 | Moderate |
| React(bare) | CSR | 手動(react-helmet-async、react-helmetは未保守) | Next.js/Gatsby経由 | ラッパーによる |
| Vue(bare) | CSR | 手動(@unhead/vue、vue-metaは未保守) | Nuxt経由 | ラッパーによる |
Remix v2とReact Router v7は統合されました。Remixのサーバーレンダリングとデータ読み込みモデルはReact Routerの「framework mode」として提供され、 Remix v2アプリの安定したアップグレード経路になっています。Remix 3は別の実験的なReact非依存の書き直し(ベータ)であり、 Remix v2の後継ではありません。ReactコードベースのドロップインSSRオプションとして扱わないでください。
メタデータのタイミング、クロール可能なリンク、ISRキャッシュの古さ
メタデータ注入のタイミング — メタデータ(<title>、<meta>)はJavaScriptがページ読み込み後に追加するのではなく、
サーバーレスポンスに含める必要があります。Next.jsのMetadata API、NuxtのuseSeoMeta、Astroの<head>コンポーネントは正しく処理します。
document.title = '...'やCSRモードのReact Helmetはそうではなく、初期HTMLが配信された後に実行されます。
リンク発見 — GooglebotはHTMLを解析してリンクを発見します。JavaScriptで追加されたリンク(onClick、<a>タグなしの動的ルーティング)は、
発見されない可能性があります。重要なナビゲーションには実際の<a href>要素を使ってください。
ハイドレーションと重複コンテンツ — SSRとCSRが異なるコンテンツをレンダリングすると(ハイドレーションの不一致)、 ユーザーに見えるものと一致しないコンテンツがインデックス登録されることがあります。ブラウザーのコンソールでハイドレーションエラーをテストしてください。
ソフト404 — クライアントサイドルーターは、HTTPステータス200を返しながら「ページが見つかりません」UIを静かにレンダリングできます。 検索エンジンはこれを実在するページとしてインデックス登録します。404ページが実際の404ステータスを返し、サーバー側リダイレクトが301を返すようにします。
ISRキャッシュの無効化 — Next.jsとNuxtのISR構成では、再検証の期間中に古いページがクローラーへ配信される可能性があります。
時間ベースのrevalidate間隔を設定し、CMS保存など自分で制御しない予定更新のコンテンツには、Webhookからルートハンドラーを介してオンデマンド再検証を起動します。
詳しくはNext.js ISR guideの完全なAPIを参照してください。
// app/blog/[id]/page.tsx — time-based revalidation
export const revalidate = 3600 // re-check this page at most once an hour
// app/api/revalidate/route.ts — on-demand revalidation, called by a CMS webhook
import { revalidatePath } from 'next/cache'
import { NextRequest, NextResponse } from 'next/server'
export async function POST(request: NextRequest) {
const { path, secret } = await request.json()
if (secret !== process.env.REVALIDATE_SECRET) {
return NextResponse.json({ message: 'Invalid secret' }, { status: 401 })
}
revalidatePath(path) // e.g. '/blog/1' — next request regenerates fresh HTML
return NextResponse.json({ revalidated: true })
} JavaScriptフレームワークのSEOは主にレンダリングモードで決まります。SSG(デプロイ時に静的HTMLとしてビルド)とSSR(リクエストごとにサーバーでレンダリング)は、 どちらも検索エンジンのインデックス登録に安全です。CSR(JavaScriptでブラウザー内だけでレンダリング)はよりリスクが高く、GoogleはJavaScriptを実行できますが、 失敗と遅延が起こりやすく、発見も遅くなります。
Next.js(Reactのメタフレームワーク): 組み込みSEOサポートが最も完全です。App Router Metadata API、SSG/SSR/ISR、画像最適化、
組み込みapp/sitemap.ts(next-sitemapパッケージはカバー外の拡張が必要な場合だけ使う)、リンクレベルのプリフェッチがあります。SEOが重要なReactアプリの業界標準です。
Nuxt(Vueのメタフレームワーク): Vue向けに同等の機能があります。組み込みのuseSeoMeta()とuseHead()コンポーザブル、SSR/SSG/ISR、Nuxt SEOモジュールを備えています。Vueサイトに非常に適しています。
Astro: IslandアーキテクチャでデフォルトではJavaScriptをゼロにします。ページは静的HTMLで、インタラクティブ性は明示的な「islands」で追加します。 デフォルトのJSフレームワークとしてSEO安全性が最も高く、コンテンツ中心のサイトに適しています。
SvelteKit: デフォルトSSRで、svelte:headによるメタデータサポートが非常に優れています。最小限の設定で堅実なSEOを実現します。
Angular: デフォルトCSRで、安定したインデックス登録には@angular/ssr(旧Angular Universal)が必要です。歴史的には主要フレームワークの中でSEO上の問題が最も多いものです。
React(bare): デフォルトCSRです。SSR/SSGにはNext.js、React Router(フレームワークモード)、またはGatsbyが必要です。 注意: Remix v2のサーバーレンダリングモデルはReact Router v7/v8の「framework mode」に統合されました。これは保守されるアップグレード経路であり、 別の実験的なReact非依存Remix 3ベータではありません。ランキングが必要なコンテンツにbare CRA/Vite-Reactを使わないでください。
Vue(bare): 同じ問題があります。SEOが重要なVueアプリケーションにはNuxtを使います。
Svelte(bare): デフォルトCSRです。SSR/SSGにはSvelteKitを使います。
JavaScriptフレームワークSEOチェックリスト
共通(すべてのフレームワークに適用)
- レンダリングモードを確認:
curl -s URL | grep "<title>"— titleは生HTMLに出なければならない -
<title>と<meta name="description">がサーバーレスポンスに含まれていることを確認 - ナビゲーション可能なすべてのリンクに実際の
<a href>タグを使う(クリックハンドラーだけにしない) - 404ページが200ではなくHTTP 404を返すことを確認
- リダイレクトに
window.location.hrefではなくサーバー側301/302を使う - XMLサイトマップを生成して送信する
- 公開ディレクトリに
robots.txtを追加する
Next.js
- App Router Metadata API(
metadataexportまたはgenerateMetadata())を使う - ルートごとにSSG(
generateStaticParams)またはSSR(dynamic = 'force-dynamic')を選ぶ - 多くのサイトでは
app/sitemap.ts(App Router組み込みサイトマップ)を追加する。クロスドメインサイトマップや組み込みのMetadataRoute.Sitemap型にない拡張が必要な場合だけnext-sitemapパッケージを使う - すべての画像に
next/imageを使う(自動WebP、サイズ調整、遅延読み込み) - ISRの
revalidate値を確認し、頻繁に更新されるページには短い期間を設定する
Nuxt
- すべてのページコンポーネントで
useSeoMeta()またはuseHead()を使う -
@nuxtjs/sitemapモジュールを導入する - Nuxtの組み込みSSR(またはSSGには
nuxt generate)を使う -
@nuxtjs/robotsでrobots.txtを設定する
Astro
- 各ページでSEO propsを
<BaseHead>コンポーネントへ渡す - Astroの
@astrojs/sitemap統合を使う - JavaScript islandsを最小限に保ち、静的セクションをislandsへ変換しすぎない
Angular
-
ng add @angular/ssrでSSRを有効にする - メタデータに
MetaとTitleサービスを使う - ハイドレーション時のAPI二重取得を防ぐためtransfer stateを追加する
フレームワーク別の詳しい解説
関連する読み物
変更履歴
2026年7月19日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。