SPAとSSRを混在させるハイブリッド設計法

SPAかSSRかの二択にしてはいけない

Webアプリ設計でよくある失敗は「SPAにするか、SSRにするか」を最初に決めてしまうことです。
実務では、この二択自体が誤りです。

現在の大規模Webサービスの多くは、SPAとSSRを同時に使っています。
この構成をハイブリッドレンダリングと呼びます。

結論として、レンダリング方式は「サイト全体」で選ぶものではなく「URL単位」で選びます。
ページの役割ごとに最適な描画方式を割り当てるのが現実的な設計です。

なぜ単一方式では破綻するのか

それぞれの特徴を整理します。

方式 強み 弱み
SPA 操作性・状態管理 初回表示・SEO
SSR 初回表示・共有 サーバ負荷・開発コスト

公開サイトとアプリケーションを同時に持つサービスでは、どちらか一方では必ず問題が出ます。

例:ECサイト

  • 商品一覧 → 検索流入が重要
  • 商品詳細 → 共有される
  • マイページ → 操作が多い
  • 管理画面 → 高頻度入力

すべて同じレンダリング方式にすると、どこかが最適化されません。

ハイブリッドレンダリングの基本設計

最も重要なのは「ページの分類」です。

ページ種類 推奨方式
公開コンテンツ SSR or SSG
ユーザー操作画面 SPA
ログイン後画面 SPA
共有前提ページ SSR
管理機能 SPA

つまり、公開領域とアプリ領域を分離します。

ルーティング分割

典型的な構成です。

パス 方式
/ SSR
/article/* SSR
/product/* SSR
/mypage/* SPA
/admin/* SPA

この時点で、1つのアプリではなく「2つのアプリ」が存在します。

実装の考え方

実務では次の構造になります。

Frontend Gateway
  ├ Public Renderer(SSR)
  └ App Renderer(SPA)

サーバはリクエストURLを見て振り分けます。

location /mypage/ {
    proxy_pass http://spa_server;
}

location / {
    proxy_pass http://ssr_server;
}

これにより、ユーザーは同じサイトを見ているように感じながら、裏側では描画方式が変わります。

認証との関係

ログイン状態はSPAと相性が良いです。
なぜなら、状態をクライアントで保持できるからです。

localStorage.setItem("token", jwt)

一方、公開ページでこれを行うとキャッシュが効かなくなります。
ここも分離の理由です。

データ取得戦略

ハイブリッド設計では、データ取得も変わります。

領域 取得方法
公開ページ サーバ取得(SSR)
操作画面 API取得(SPA)

公開ページは「HTMLに含める」、操作画面は「後から取得する」という考え方になります。

実務でよくある失敗

すべてをSPAにする

初期開発が楽なため、最初は動きます。
しかし後からSEO・OGP・表示速度の問題が発生します。

すべてをSSRにする

今度は管理画面が遅くなり、操作性が悪化します。
フォーム入力が多いシステムでは致命的です。

注意点

ハイブリッドは強力ですが、設計を誤ると複雑化します。

特に注意すべき点があります。

  • セッション管理の統一
  • Cookieの扱い
  • キャッシュ戦略
  • CORS設定

認証方法を統一しないと、ログインしているのに公開ページで未ログイン扱いになるなどの問題が起きます。

なぜこの設計が増えているのか

サービスは「サイト」と「アプリ」を同時に持つようになりました。

  • メディア機能
  • アカウント機能
  • 投稿機能
  • 管理機能

1つのレンダリング方式では対応できません。
ハイブリッドは妥協ではなく、役割分担です。

まとめ

SPAとSSRは競合技術ではありません。
役割が違うコンポーネントです。

ページは「表示のためのページ」と「操作のための画面」に分かれます。
レンダリング方式を技術で選ぶのではなく、ページの目的で選ぶと、設計の迷いが減ります。