コンテンツにスキップ

【比較】SPAとMPAの違い

概要

SPA(Single-Page Application)と MPA(Multi-Page Application)は、「ページ遷移のときにブラウザが何をするか」という Web アプリの構成方式の違いです。SPA は最初に1つの HTML 文書だけを読み込み、以降の画面切り替えは JavaScript が文書の中身を書き換えて行います。MPA はリンクをたどるたびにサーバーから新しい HTML 文書を取得し、ブラウザがそれを読み込み直します。

混同しやすいのは、これを SSR/CSR と同じ軸だと思ってしまう点です。SSR/CSR は「HTML をどこで生成するか」の軸、SPA/MPA は「遷移ごとに文書を読み込み直すか」の軸で、おおむね直交します。実際、SPA でも初期 HTML をサーバーで生成(SSR)できますし、MPA でも各ページ内で CSR を使えます。Astro や Next.js の App Router のように、両者の良いとこ取りをするハイブリッド構成も一般化しています。

例えるなら:本の読み方

  • MPA … 章を変えるたびに「別の冊子」を司書(サーバー)に取りに行く。冊子そのものは完成しているのですぐ読めるが、取りに行く往復が毎回発生する。
  • SPA … 最初に1冊の差し替え式バインダーを受け取り、ページめくりは自分(ブラウザの JS)が中身を差し替えて行う。最初にバインダー一式を受け取るのに時間がかかるが、その後のページめくりは手元で速い。

詳細比較

比較軸 SPA(シングルページアプリ) MPA(マルチページアプリ)
読み込む文書 起動時に1つの HTML 文書のみ 遷移ごとに新しい HTML 文書
画面遷移の仕組み JS が文書の中身を書き換え(クライアントサイドルーティング、History API の pushState 等を使用) サーバーへ新規リクエストし、ブラウザがページを再読み込み
初回ロード 重くなりやすい(アプリ全体の JS を読む) ページ単位で軽くなりやすい(そのページ分だけ)
遷移後の体感 速くアプリ的(差分のみ更新) 都度フルロード(往復が発生)
状態(state)の保持 文書が維持されるので保持しやすい(実装は要工夫) 遷移で文書が破棄され基本リセット(保持には別途仕組みが必要)
SEO・クローラ 不利になりやすい(初期 HTML が空になりがち。MDN も SEO を弱点に挙げる) 有利になりやすい(各 URL が完成 HTML を返しやすい)
ルーティング実装 自前で実装が必要(MDN が弱点として明記) サーバー/ブラウザ標準の遷移に乗れる
代表例 React/Vue/Angular の単一アプリ構成 従来型 Web サイト、Astro(MPA フレームワーク)

よくある誤解

  • 誤解1:「SPA は CSR、MPA は SSR と同じ意味」 — 誤りです。SPA/MPA は「遷移で文書を読み込み直すか」、SSR/CSR は「HTML をどこで生成するか」の別軸で、ほぼ直交します。SPA でも初期 HTML をサーバーで生成(SSR)できますし、MPA の各ページ内で JS による CSR を併用することもできます。組み合わせで考えるべきものです。
  • 誤解2:「SPA の方が常に速い」 — 一面的です。遷移後の体感は SPA が軽快ですが、SPA は起動時にアプリ全体の JavaScript を読み込むため初回ロードが重くなりやすいのがトレードオフです。MPA は各ページがそのページ分の HTML だけで完結し、初回が軽いことも多い。Astro 公式も、SPA は多量のクライアント JavaScript により初回表示性能(TTI など)を損ないやすいと整理しています。
  • 誤解3:「SPA は SEO に対応できない」 — 「できない」ではなく「不利になりやすい・追加対応が要る」が正確です。MDN も SPA の弱点として SEO・状態管理・ナビゲーション実装・性能計測の難しさを挙げています。SSR やプリレンダリングを併用すればクローラ向けに完成 HTML を返すことは可能で、絶対に不可能なわけではありません。
  • 誤解4:「ページ数が複数あれば MPA」 — 誤りです。MPA/SPA の本質は「ページ数」ではなく「遷移時にブラウザが新しい HTML 文書を読み込み直すか(MPA)/1つの文書のまま JS で書き換えるか(SPA)」です。SPA も URL 上は複数の画面(/profile 等)を持てますが、それはクライアントサイドルーティングで文書を読み込み直さずに実現しています。

実務での選び分け

  • コンテンツ中心・公開サイト(メディア、ブログ、コーポレート、LP、ドキュメント) → MPA 寄り。SEO に強く初回が軽い。Astro のような MPA フレームワーク+必要箇所だけ JS(アイランド)構成が好相性。
  • 操作中心・アプリ的 UX(管理画面、SaaS ダッシュボード、エディタ、認証後の業務アプリ) → SPA 寄り。遷移が頻繁で状態を持ち回る画面は SPA の体感が活きる。SEO 不要なら弱点も問題になりにくい。
  • 公開もアプリ性も両方必要(EC、ニュースサイトの会員機能など) → ハイブリッド。Next.js App Router のように初期はサーバーで HTML を返し(SEO・初回速度)、遷移以降はクライアント側で滑らかに、という構成が定石。
  • 判断軸:①SEO と初回表示が重要か(→ MPA/ハイブリッド) ②遷移頻度とリッチな状態管理が必要か(→ SPA) ③チームが許容できる実装複雑度(SPA はルーティング・状態・計測の自前実装コストが上がる)。

ひとことまとめ

SPA=1つの文書を JS で書き換えて遷移、MPA=遷移ごとにサーバーから新しい文書を取得。SSR/CSR とは別軸(直交)で、現代は両者を組み合わせたハイブリッドが主流です。

出典・参考

  • MDN「SPA (Single-page application)」用語集(SPA は1つの Web 文書だけを読み込み、表示内容が変わるとき Fetch 等の JS API でその文書の body を更新する。サーバーからページ全体を読み込み直さないため性能と動的体験で利点があるが、SEO・状態維持・ナビゲーション実装・性能計測の難しさというトレードオフがある): https://developer.mozilla.org/en-US/docs/Glossary/SPA
  • MDN「Working with the History API」(SPA のように fetch() で内容を更新するサイトを支えるのが History API の主目的。pushState() でページ全体を再読み込みせず履歴と URL を更新できる): https://developer.mozilla.org/en-US/docs/Web/API/History_API/Working_with_the_History_API
  • Astro 公式ドキュメント「MPAs vs. SPAs」(MPA はサーバーで描画される複数 HTML ページから成り、遷移でブラウザが新しい HTML をサーバーに要求する。SPA はブラウザで動く単一 JS アプリで、SPA もサーバーで HTML を生成しうるが、遷移時にブラウザ内で新しい HTML を描画する点が固有): https://docs.astro.build/en/concepts/mpa-vs-spa/
  • Astro 公式ドキュメント「Islands architecture」(既定で UI を HTML/CSS に描画し、client:* で指定した対話要素のみ JS を読み込む、MPA を基盤とした構成): https://docs.astro.build/en/concepts/islands/