SPA
ページ遷移なしに動的にコンテンツを更新する Web アプリケーションのアーキテクチャ
Webフロントエンド
SPA とは
SPA (Single Page Application) は、最初に 1 つの HTML ページを読み込み、以降のページ遷移をブラウザ側の JavaScript で処理する Web アプリケーションのアーキテクチャである。サーバーからは API (JSON) でデータだけを取得し、画面の描画はクライアント側で行う。Gmail、Google Maps、Twitter が代表的な SPA だ。
MPA との比較
| 観点 | SPA | MPA (Multi Page Application) |
|---|---|---|
| ページ遷移 | JavaScript で画面を切り替え (高速) | サーバーから新しい HTML を取得 (遅い) |
| 初期ロード | 遅い (JS バンドルのダウンロード) | 速い (HTML だけ) |
| SEO | 対策が必要 (SSR/SSG) | 問題なし |
| UX | ネイティブアプリに近い操作感 | ページ遷移のたびに白画面 |
| サーバー負荷 | API のみ (軽い) | HTML 生成 (重い) |
SPA の動作フロー
1. ブラウザが index.html を取得 (ほぼ空の HTML)
2. JavaScript バンドル (main.js) をダウンロード・実行
3. React/Vue が DOM を構築し、画面を表示
4. ユーザーがリンクをクリック
5. JavaScript が URL を変更 (History API)
6. 対応するコンポーネントを表示 (サーバーへのリクエストなし)
7. データが必要な場合は API (fetch) でサーバーに問い合わせ
S3 + CloudFront でのホスティング
SPA は静的ファイル (HTML, JS, CSS) だけで構成されるため、S3 + CloudFront でホスティングできる。サーバーが不要でコストが最小限だ。
SPA の課題と対策
SEO
SPA の初期 HTML は空 (<div id="root"></div>) のため、検索エンジンがコンテンツを認識できない。
対策:
- SSR (Next.js): サーバーで HTML を生成
- SSG: ビルド時に静的 HTML を生成
- プリレンダリング: クローラー向けに事前レンダリング
初期ロードの遅さ
JavaScript バンドルが大きいと、初期表示が遅くなる。
対策:
- コード分割 (React.lazy): ルートごとにチャンクを分割
- Tree Shaking: 未使用コードを除去
- CDN (CloudFront): エッジからの高速配信
メモリリーク
SPA はページ遷移でリロードされないため、イベントリスナーやタイマーの解除忘れがメモリリークの原因になる。React の useEffect のクリーンアップ関数で適切に解除する。
実践的な知識は関連書籍でも得られる。