クライアントサイドJavaScriptフレームワーク

React、Vue、Angular、Svelte、SolidJSに共通するSEO問題を説明します。クライアントサイドレンダリングは空のシェルを送り、解決策はhead管理とレンダリング戦略を組み合わせることです。

初回公開:2026年6月26日 · 最終更新:2026年8月22日 · Advanced
言語

React、Vue、Angular、Svelte、SolidJSは、既定ではほぼ空のHTMLシェルを送り、ブラウザーでページを構築するUIライブラリです。クローラーはJavaScriptが実行されるまで空のページを見る可能性があり、Googleはレンダリングできますが遅延キューで処理し、BingやAIクローラーははるかに不確実です。共通する修正は、(1)ルートごとのメタタグを管理するheadパッケージと、(2)prerender、SSR、対応するmeta-frameworkというレンダリング戦略です。このハブでは共通問題と修正を説明し、フレームワーク別ガイドへ案内します。

要点 — React、Vue、Angular、Svelte、SolidJSはすべて、既定ではクライアントサイドレンダリングを行うUIライブラリです。ほぼ空のHTMLシェルを送り、ブラウザーでDOMを構築します。5つに共通するSEO上の問題は、クローラーが空のシェルを受け取り、コンテンツがJS実行後にしか存在しないことです。Googleはこれらのアプリを遅延したキュー方式でレンダリングしますが、BingとAIクローラーははるかに不確実です。修正も共通で、(1)<title>/メタ用のルート単位パッケージによるhead管理と、(2)prerendering、SSR、対応するmeta-frameworkへの移行というレンダリング戦略です。フレームワーク間の違いは主に、どのパッケージとどの戦略を選ぶかです。以下の各深掘りで扱います。

フルフレームワークではなくライブラリであることが根本原因

フレームワークのアーキテクチャはさまざまなので、クライアントレンダリングは自動的にインデックス登録の失敗になるわけではありません。 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: MDN: Client-side frameworks サーバーレンダリングまたはprerenderingは、クローラー側の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

React、Vue、Angular、Svelte、SolidJSは、主にUIレンダリングライブラリです。データをDOMへ変換し、状態が変わるとDOMを同期させます。初期状態ではDOMがブラウザー内で構築されます。これが高速でアプリらしい操作感を生む一方、SEO上の問題も生みます。

既定のビルドは、空のマウントノード(<div id="root"><div id="app"><app-root>)とJavaScriptバンドルを含むHTMLシェルを送ります。検索エンジンが必要とする見出し、本文、内部リンク、構造化データは、バンドルのダウンロードと実行に注入されます。JSが実行される前には、何もありません。

これはクライアントサイドレンダリングです。meta-frameworkやビルド時のprerenderステップを追加する前の、素のライブラリにおける初期動作です。バグではなく、最初に与えられる既定値です。しかし「既定」は「永続的」でも「普遍的」でもありません。バージョン、使用したCLIやスターターによって変わり、同じアプリ内でも、作り方によって2つのルートが異なるレンダリング方式になることがあります(マーケティングページはprerender、ダッシュボードは純粋なCSRのまま、など)。フレームワーク名だけで動作を決めつけず、特定のビルドの特定のルートが実際に何を送るかを確認してください。

共通する問題:空のシェル

Googleは、JSアプリをクロール、レンダリング、インデックス登録という段階で処理すると明記しており、“without rendering Google might not see that content.” (翻訳)「レンダリングしなければ、Googleはそのコンテンツを見られない可能性があります」と説明しています。CSRアプリでは、すべてのコンテンツがそのレンダリング工程の背後にあります。そこから3つの帰結が生じます。

  • レンダリングは遅延し、待ち時間は固定されていない。 レンダリングはクロール後の別キュー工程です。Googleはクロール、レンダリング、インデックス登録を3つの別工程として説明していますが、すべてのページに共通する待ち時間は約束していません。遅延はURLと、その時点のGoogle側のリソース配分によって変わります。ページでレンダリングが完了するまで、どれほど時間がかかっても、コンテンツはインデックス登録用に存在しません。
  • Google以外のクローラーを前提にできない。 BingのJavaScriptレンダリングは一貫せず、ほとんどのAIクローラー(LLMやAI検索向けにページを取得するボット)はJSをほとんど、またはまったく実行しません。これらは別会社の別インフラなので、Googleのドキュメントから一般化できません。Googleや昨年のテストと同じだと決めつけず、各プロバイダーの現在の動作を確認してください。CSRだけのサイトは、レンダリングしないクローラーからほぼ見えなくなるリスクがあり、AIクローラーは増えつつあります。
  • ページごとのメタデータが欠ける。 HTMLファイルが1つなら、ルートごとにheadを積極的に管理しない限り、すべてのルートで<title>とメタディスクリプションが1つずつになります。

共通する修正その1:head管理

SPAはHTMLドキュメントが1つなので、ユーザー(およびクローラーのレンダラー)がルート間を移動するときに、ドキュメントのheadを更新するコードが必要です。すべてのフレームワークには、そのための標準パッケージまたは組み込みAPIがあります。

  • Reactreact-helmet-async(またはNext.jsへ移行した場合はフレームワークのメタデータAPI)。
  • Vue@unhead/vue(NuxtのSEOユーティリティの基盤)。
  • Angular@angular/platform-browser組み込みTitleMetaサービス。追加依存関係は不要です。
  • Svelte → 組み込みの**<svelte:head>要素**。
  • SolidJS@solidjs/meta(SSR経路ではSolidStart)。

head管理で正しく固有のメタタグを設定できますが、それだけでは空のシェルの問題は解決しません。タグもJS実行後にしか現れないからです。そのため、パート2も必要です。

共通する修正その2:レンダリング戦略

JavaScriptが実行されるに実コンテンツ(およびheadタグ)をHTMLへ入れるには、3つの方式から選びます。SEOリスクをどれだけ減らすかで並べると、次の順です。

  1. prerendering/静的生成(SSG)。 ビルド時に各ルートの静的HTMLを作ります。リクエストごとに変わらないコンテンツならリスクが最も低い方式です。各ライブラリにはprerender経路があります(SolidJS組み込みprerender、Vueのprerenderプラグイン、Angularのprerenderingなど)。
  2. サーバーサイドレンダリング(SSR)。 リクエストごとにサーバーでHTMLをレンダリングし、ブラウザーでhydrateします。ここでmeta-frameworkが登場します。Next.js(React)、Nuxt(Vue)、Angular SSR(旧Angular Universal)、SvelteKit(Svelte)、SolidStart(SolidJS)です。ランキングが必要なコンテンツサイトの多くでは、対応するmeta-frameworkの採用が最もきれいな修正です。
  3. 完全なCSRのまま、クロール可能にする。 ランキングが不要なログイン後のアプリ画面なら許容できることがありますが、検索に出したいものには悪い既定値です。

この判断はアプリ単位ではなく、ルート単位で行います。同じコードベースでも、マーケティングページとログイン済みダッシュボードは、リストの別の行に入って当然です。各ルートについて次を問いかけます。

  • 出力 — コンテンツは初期レスポンスに必要か、それともJS実行後に現れてもよいか。
  • 鮮度 — 一度ビルドできるほど安定しているか(prerender)、リクエストごとに変わるか(SSR)。
  • パーソナライズ — 訪問者ごとに異なるか。prerenderでは対応できず、SSRとCSRの選択になります。
  • サーバーコスト — SSRはリクエストごとに計算を追加し、prerenderはそのコストをビルド時に前倒しします。
  • JS依存 — ルートの有用性は、クライアントJavaScriptが実行されることにどれだけ依存するか。
  • 失敗時の挙動 — JSが失敗またはブロックされたとき、ルートは使える状態へ劣化するか、それとも何もなくなるか。

フレームワークにかかわらず、判断の核心は同じです。このコンテンツはランキングまたは引用される必要があるか。 答えが「はい」なら、サーバーレンダリングまたはprerenderされたHTMLへ入れます。純粋にインタラクティブなアプリUIならCSRで問題ありません。

Googleはこれらのアプリをどう扱うか(そして他社が同じでない理由)

Googleは、これらのフレームワークをすべてレンダリングできます。常に更新されるheadless Chromeを実行してJSを動かします。しかし処理は遅延キューに入り、レンダラーはステートレスです(保存されたcookie/localStorage、service worker、操作状態はなく、スクロールもクリックもしません)。したがって、フレームワーク選択に加えて、JavaScript SEOハブのJS-SEOルールも適用されます。実際の<a href>リンク、raw DOMとrendered DOMの一致、操作の背後に隠さないコンテンツ、JSでnoindexを注入しないことが重要です。

Google以外では状況が悪くなります。BingのJSレンダリングは不安定で、AIクローラーの多くはまったくレンダリングしません。CSRアプリでは、コンテンツがGoogleには(最終的には)存在しても、Bingや、検索に使う人が増えているAIツールには存在しない可能性があります。SSRまたはprerenderingなら、Googleだけでなくすべてのクローラーとの隔たりを埋められます。CSRだけのコンテンツを出荷しない最大の理由です。

5つのフレームワークを一覧で比較

フレームワーク既定値head管理SSR/meta-frameworkSEO上の注意
ReactCSRreact-helmet-asyncNext.js(Metadata API)CSR優先SPAで最も一般的。Next.jsが標準的なSEO修正
VueCSR@unhead/vueNuxtuseSeoMeta()NuxtはSSRが既定。素のVueではprerenderまたはNuxtが必要
AngularCSR(SPA)組み込みTitleMetaサービスAngular SSR(旧Universal)大規模SPA。現代のAngularはSSRと段階的hydrateを追加
SvelteCSR(Svelte)/SSR(SvelteKit)<svelte:head>SvelteKit(SSRが既定)SSRが既定だが、ssr:falseの静的トラップに注意
SolidJSCSR@solidjs/metaSolidStart細粒度リアクティビティ。SolidStartがSSRとprerenderを追加

パターンは一貫しています。CSRという既定値、headパッケージ、そしてレンダリング戦略(通常は対応するmeta-framework)です。異なるのは名前と、いくつかの注意点です。

次に読むもの:フレームワーク別の深掘り

このハブは地図です。各フレームワークには、固有のパッケージ、設定、落とし穴を説明するガイドがあります。

  • React SEO — CSR優先のReactがインデックス登録リスクを生む理由、React RouterとHistory API、react-helmet-async、Next.jsを選ぶタイミング。
  • Vue SEO — Vue 3のCSR既定値、createWebHistory()@unhead/vue、meta-frameworkなしのprerendering、Nuxtを選ぶべき場面。
  • Angular SEO — AngularのSPA既定値、@angular/ssr、組み込みのTitleMetaサービス、prerendering、段階的hydrate。
  • Svelte SEO — SvelteとSvelteKitの違い、SvelteKitのSSR既定値、<svelte:head>adapter-static + ssr: falseのトラップ、AIクローラーへの含意。
  • SolidJS SEO — SolidJSのCSR既定値、@solidjs/meta、SSRとprerenderingのためのSolidStart、細粒度モデルがレンダリング出力へ与える影響。

CSR、SSR、SSG、ISR、hydrate、dynamic renderingというレンダリング方式と、より広いレンダー/パリティルールについては、親のJavaScript SEOハブを参照してください。

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.