React SEOガイド:クライアントサイドレンダリングがインデックスを遅らせる理由、SSRと事前レンダリングの使い分け、React 19でのメタタグ設定、AIに読まれるページ作り。

このページの内容
要点
ReactでもGoogleで上位表示はできますが、標準的なシングルページアプリはほぼ空のHTMLを送り、内容の表示をJavaScriptに頼るため、インデックス登録が遅れ、多くのAIクローラーからはページが見えません。確実な解決策は、サーバーからHTMLを返すことです。静的なページはビルド時に事前レンダリングするか、サーバーレンダリングに対応したフレームワーク(Next.js、React Router)を使います。そのうえでURLごとに固有のタイトル、説明文、canonicalを設定し、本物のリンクと正しいステータスコードを使い、ボットが受け取る内容を確認しましょう。
さらに詳しく知るには、こちらに質問
クイック診断
SEOはあなたに向いている?どう始めるべき?
Sorankはあなたの回答にぴったりです
ご自身のサイトで3日間お試しいただき、Google、ChatGPT、その他のAIでの現状をご確認ください。
3日間の無料トライアルを開始3日間無料、いつでも解約できます。90日間成果保証(成果が出なければ返金)。
React SEOとは、Reactアプリを検索エンジンやAIアシスタントがクロールし、インデックスし、理解できるようにする取り組みです。React自体は中立で、問題はすべてをブラウザでレンダリングすることから生じます。GoogleはJavaScript SEOの基本で、JavaScriptアプリをクロール、レンダリング、インデックス登録の3段階で処理すると説明し、サーバーサイドレンダリングや事前レンダリングは「ユーザーにもクローラーにもサイトが速くなり、すべてのボットがJavaScriptを実行できるわけではないため、今でも優れた方法」だと述べています。
シングルページアプリとして作られたReactアプリが返すHTMLには、空のルートdivとscriptタグくらいしか入っていません。ブラウザがJavaScriptをダウンロードして実行し、ページを組み立てます。HTMLだけを読むクローラーには、インデックスすべき見出しも本文もリンクも見えません。
GooglebotはJavaScriptを実行しますが、それは別の工程です。ページはクロールされ、レンダリング待ちのキューに入り、ヘッドレスChromiumでレンダリングされ、その後でようやくレンダリング結果のリンクと内容が使われます。工程が増えるたびに失敗の可能性(スクリプトエラー、APIのブロック、タイムアウト)が生まれ、新しいページが検索結果に出るまでの時間も延びます。この流れはJavaScript SEOのガイドで、インデックスを早める方法はGoogleのインデックス登録の記事で解説しています。
ほかのボットはそれほど待ってくれません。Vercelが2024年12月に公開した分析The rise of the AI crawlerは、「主要なAIクローラーはいずれも現在JavaScriptをレンダリングしていない」とし、GPTBot、ChatGPT-User、OAI-SearchBot、ClaudeBot、PerplexityBotを挙げています。クライアントでレンダリングされるReactのページは、GoogleにインデックスされていてもChatGPT、Claude、Perplexityには見えません。
Reactチームは現在、新規アプリをフレームワークで始めることを推奨しています。2025年2月14日にCreate React Appを非推奨にした際の発表では、「サーバーレンダリングはSEOを改善できる」とし、内容が表示されるまでにダウンロードするJavaScriptを減らしてパフォーマンスも高めると述べています。検索にとって弱いものから強いものへ並べると次のとおりです。
| 方式 | ボットが受け取るもの | SEOの評価 | 代表的なツール |
|---|---|---|---|
| クライアントサイドレンダリング(SPA) | 空のHTML、内容はJavaScript実行後 | 弱い:インデックスが遅れ、AIクローラーには見えない | Vite + React、古いCreate React Appのプロジェクト |
| ダイナミックレンダリング | ボットにだけ事前レンダリングしたHTML | 回避策であり、Googleは推奨しない | 事前レンダリングサービス、ヘッドレスブラウザのプロキシ |
| ビルド時の静的事前レンダリング | 既知のURLすべてに完全なHTML | 更新の少ないコンテンツに非常に有効 | React Routerの事前レンダリング、静的サイトジェネレーター、Next.jsの静的エクスポート |
| サーバーサイドレンダリング | リクエストごとに完全なHTML、その後ハイドレーション | 大規模・更新の多いサイトに最良 | Next.js、React Router(フレームワークモード、旧Remix) |
ダイナミックレンダリングについて、Googleのドキュメントは明確で、「回避策であり、長期的な解決策ではなかった」とし、代わりにサーバーサイドレンダリング、静的レンダリング、ハイドレーションを推奨しています。フレームワークを選ぶなら、Next.js SEOガイドでレンダリング方式、Metadata API、サイトマップを詳しく解説しています。
移行が難しい場合でも、いくつかの点に気をつければGoogleはシングルページアプリをインデックスできます。条件はシングルページアプリケーションのSEOのガイドにまとめており、本記事の残りはどちらの場合にも当てはまります。
React 19(2024年12月5日に安定版)以降、コンポーネントはtitle、meta、linkタグを直接レンダリングでき、Reactがそれらをドキュメントのheadへ移動します。React 19のリリースノートによると、このネイティブ対応は「クライアントのみのアプリ、ストリーミングSSR、Server Components」で動作します。React 19以前はreact-helmetやreact-helmet-asyncといったライブラリがこの役割を担っており、ルートごとにデフォルト値を上書きしたい場合には今も役立ちます。
function ProductPage({ product }) {
return (
<>
<title>{`${product.name} | Shop`}</title>
<meta name="description" content={product.summary} />
<link rel="canonical" href={`https://example.com/p/${product.slug}`} />
<h1>{product.name}</h1>
</>
)
}どの方法でも守るべきルールは3つです。
注意
クライアントのみのアプリでは、Reactがレンダリングしたタグは、JavaScriptが実行された後にしか存在しません。Googleはレンダリング後に読めますが、AIクローラーやほとんどのSNSのプレビュー用ボットは読めません。サーバーレンダリングや事前レンダリングなら、すべてのボット向けにHTMLレスポンスに含められます。
Googleは「href属性を持つHTMLのa要素でなければリンクを発見できない」と述べ、異なるコンテンツの読み込みにURLフラグメントを使わないよう勧めています。React SEOの失敗の多くはルーティングの細部から生じます。
| ミス | 影響 | 対策 |
|---|---|---|
| divやボタンのonClickで遷移 | Googleがたどれるリンクがない | href付きのaを出力するルーターのLinkコンポーネントを使う |
| ハッシュルート(/#/products) | Googleから見て全ページが1つのURLを共有 | BrowserRouterやフレームワークでhistoryベースのルート(/products)を使う |
| 「見つかりません」画面を200で返す | Search Consoleで「ソフト404」 | サーバーから本当の404を返す。純粋なSPAならJavaScriptでnoindexを追加 |
| クライアント側だけのリダイレクト | リダイレクトが遅い、または見落とされる | 移転したページにはサーバーの301または308リダイレクトを使う |
| クリックやスクロールで読み込むコンテンツ | クローラー向けに本文がレンダリングされない | 主要コンテンツは読み込み時にレンダリングし、一覧は実在するURLでページ分割する |
| robots.txtでJavaScriptやAPIをブロック | Googleが空のページをレンダリング | ページに必要なスクリプトとAPIエンドポイントを許可する |
Googleが何をレンダリングしているかは、Search ConsoleのURL検査ツールでテストしたページのHTMLを確認するか、主要なテンプレートをインデックス可能性チェッカーにかけて確認します。
Reactにはサイトマップ機能が組み込まれていません。ルートとデータからビルド時にsitemap.xmlを生成し(またはフレームワークのサイトマップ機能を使い)、200を返すcanonicalのURLだけを載せ、robots.txtで参照します。小さな静的サイトならXMLサイトマップジェネレーターで十分です。
構造化データもメタデータと同じルールです。JSON-LDのscriptはページと一緒に、同じデータから、できればサーバーでレンダリングします。GoogleはJavaScriptで挿入されたJSON-LDをレンダリング後に読めますが、初期HTMLにないマークアップは、レンダリングしないクローラーにとっては存在しません。記事にはArticle、ECにはProduct、サイト全体にはOrganization、深い階層のページにはBreadcrumbListを使います。
ヒント
ページのURLにcurlを実行し、出力の中でH1と本文の一文を検索してください。見つからなければ、Googleはレンダリング後にインデックスするかもしれませんが、AIクローラーには何も見えません。
大きなJavaScriptバンドルはCore Web Vitalsを悪化させます。ページが反応する前に、ブラウザはコードをダウンロード、解析、ハイドレーションしなければならず、特にモバイルでLargest Contentful PaintとInteraction to Next Paintに負担がかかります。ReactチームのCreate React Appに関する発表は、サーバーレンダリングならJavaScriptが少なく完全なHTMLドキュメントを送れるため、First Contentful Paintが速くなり、INPも下がりうると述べています。実践的な手段は、React.lazyによるルート単位のコード分割、明示的なサイズを指定した画像配信、スクロールしないと見えないコンポーネントの遅延読み込み、外部スクリプトの見直しです。
GEO(生成エンジン最適化)はアクセスから始まります。AIクローラーは生のHTMLを取得するため、Reactのページは本文、見出し、JSON-LDをJavaScriptなしで届けなければ、読まれ、要約され、引用されることはありません。AIクローラビリティ監査を使えば、これらのボットがあなたのページから何を受け取っているかがわかります。第二の条件は引用に値するコンテンツで、セクションごとにひとつの質問に答え、出典、数値、明確な定義を備えたページです。
このコンテンツ面を自動化するのが、私たちの製品Sorankです。SorankはautopilotでSEOとGEOを進めるソフトウェアで、ブログ記事ジェネレーターが出典、内部リンク、画像付きの記事を月20本、60本、または120本作成・公開し、webhookを通じてReactやNext.jsのような独自構成のサイトにも接続できます。SEO Chatは、サイトの検索パフォーマンスに関する質問に会話形式で答えます。

まとめると、HTMLはサーバーから返し、URLごとに固有のタイトル、説明文、canonicalを設定し、本物のリンクを使うことです。そうすればReactサイトもほかのサイトと同じように上位表示され、AIアシスタントにも読まれます。GoogleとAIに向けた記事をサイトに継続的に供給するなら、Sorankの料金プランをご覧ください。月額49ドルからで、3日間の無料トライアルがあります。
いいえ。ReactはUIライブラリであり、SEOはページのレンダリング方法で決まります。クライアントでレンダリングするシングルページアプリは空のHTMLを送り、Googleのレンダリング工程に頼るため、インデックスが遅れ、AIクローラーからは内容が見えません。同じReactのコードでも、サーバーレンダリングや静的な事前レンダリングで配信すれば、従来のサイトと同じように上位表示されます。
はい。Googlebotは最新に近いChromiumでJavaScriptを実行するため、Reactアプリがブラウザで組み立てるコンテンツもインデックスできます。ただしレンダリングはクロールの後に行われ、スクリプトのエラーやAPIのブロックがあると遅れたり失敗したりします。Search ConsoleのURL検査ツールで、Googleが見ているレンダリング後のHTMLを確認できます。
シンプルな用途なら不要です。React 19はどのコンポーネントからでもtitle、meta、linkタグをレンダリングし、ドキュメントのheadへ移動します。サイト共通のデフォルト値をルートごとに上書きしたい場合や、古いReactをサポートする必要がある場合は、react-helmet-asyncなどのライブラリが引き続き役立ちます。
先行導入企業のご紹介
