2026/03/31
SPA
1つの HTML ページの中でコンテンツを動的に書き換えることで動作する Web アプリのこと
MPA(Multi Page Application)
従来の Web 形式
毎回「対象のページ」をもらうイメージ
ページを表示させようとするたびに、サーバー側で用意&画面 “全体” を再度描画する必要がある
SPA(Single Page Application)
最初に「全部入りのページ」をもらうイメージ
最初にまるごともらっておいて、あとは必要な情報だけサーバー側から取得&“画面の一部”を更新する
CSR(Client Side Rendering)
クライアント(ブラウザ)側で JavaScript を使って HTML を組み立てるレンダリング手法のこと
| CSR | SPA | |
|---|---|---|
| 分類 | レンダリング手法 | アプリケーション設計 |
| 観点 | 「どこで」HTML を作るか | 「どのように」画面遷移させるか |
従来との違い
| MPA(従来) | SPA | |
|---|---|---|
| ページ遷移 | サーバーから HTML を毎回取得 | JavaScript が DOM を書き換える |
| 画面の白ちらつき | ある(ページ全体が再読み込み) | ない(部分的に更新) |
| 初回読み込み | 速い | 遅め(JS を全部読み込む) |
| 2回目以降の遷移 | 毎回サーバー通信が発生 | 高速(データだけ取得) |
| サーバーの役割 | HTML を生成して返す | データ(API)を返す |
| URL の変化 | 毎回変わる | JavaScript で制御(History API) |
メリット
ユーザー体験(UX)が高い
画面遷移のたびにページ全体がリロードされないため、スムーズな操作感を実現できる
例:地図サービスなど
→ ページ遷移してもチラつきがなく、素早く動作する
フロントエンドとバックエンドを完全に分離できる
サーバーは HTML を生成する必要がなく API(JSON)を返すだけでよい
同じ API をモバイルアプリにも使い回せる
API を中心に設計するため、Web と iOS/Android が同じ API を共有できる
部分的なデータ更新でサーバー負荷を下げられる
ページ全体の HTML をサーバーで生成する必要がなくなるため、サーバーの処理負荷を下げられる
デメリット
初回読み込みが遅い
JavaScript バンドル(bundle)をまとめてダウンロードするため、初回表示までの時間が MPA より長くなる
対策:
├ コード分割(Code Splitting):使うページのコードだけ読み込む
├ 遅延読み込み(Lazy Loading):必要になったタイミングで読み込む
└ SSR(サーバーサイドレンダリング)と組み合わせる
SEO 対策が難しい
従来の SPA は JavaScript が実行されてから HTML が生成されるため、クローラー(検索エンジンのbot)がコンテンツを読み取れないことがある
対策:
├ SSR(Next.js/Nuxt)でサーバー側で HTML を生成する
└ SSG(静的サイト生成)でビルド時に HTML を生成する
JavaScript が無効な環境では動かない
JavaScript を無効にしているブラウザや環境では動作しない
対策:
├ SSR(Next.js/Nuxt)でサーバー側で HTML を生成する
└ SSG(静的サイト生成)でビルド時に HTML を生成する
セキュリティ上の考慮点が増える
クライアントサイドで多くのロジックが動くため、以下の点を注意する必要がある
・XSS対策
・認証トークンの安全な保持(localStorage, Cookie)
・API の CORS 設定 etc.
主要フレームワーク
| フレームワーク | note |
|---|---|
| React | |
| Vue.js | |
| Angular | API(BackEnd)にはSpring Boot/.NETなど |
メタフレームワーク(SSR・SSG統合)
CSR のデメリット(SEO・初回ロード)を解消するために、フレームワークの上に SSR・SSG 機能を追加したフレームワーク
| フレームワーク | ベース | note |
|---|---|---|
| Next.js | React | |
| Nuxt | Vue.js | |
| Astro | - | 静的サイト特化 |
参考
- React:https://react.dev
- Next.js:https://nextjs.org
- Vue.js:https://ja.vuejs.org
- Nuxt:https://nuxt.com
- Astro:https://docs.astro.build/en/getting-started/