SPAとMPA

SPAとMPAとは

Webアプリの画面の作り方には、大きく2つの方式があります。

  • MPA(Multi Page Application)— ページを移動するたびに、サーバーから新しいHTMLを丸ごと受け取って表示し直す従来型の方式
  • SPA(Single Page Application)— 最初に1枚のHTMLと JavaScript を読み込み、以降はJSが [[DOM]] を書き換えて画面を切り替える方式。サーバーとは [[REST API]] などを通じてデータ(JSON)だけをやり取りします

比較

SPAMPA
ページ遷移JSで画面を書き換え(高速・なめらか)HTMLを再読み込み(画面が一瞬白くなる)
初回表示遅くなりがち(JSを大量に読む)速い(HTMLがすぐ表示される)
サーバーとの通信データ(JSON)のみHTML全体
SEO工夫が必要有利
実装の複雑さ高い(ルーティング・状態管理が必要)低い
代表例管理画面、Webメール、地図アプリブログ、ニュースサイト、ECの商品ページ

どちらを選ぶか

「操作が多いアプリはSPA、閲覧が中心のサイトはMPA」が基本的な目安です。

  • SPA は [[React]] や [[Vue.js]] で作られることが多く、画面の状態を [[状態管理]] の仕組みで保持します
  • SPA は最初のHTMLがほぼ空のため、検索エンジンに内容が伝わりにくいという弱点があります([[SEOの技術基礎]] 参照)
  • この弱点を補うのが [[Next.js]] などのサーバーサイドレンダリング(SSR)で、初回はサーバーでHTMLを生成し、以降はSPAとして動く「いいとこ取り」ができます

初学者向けポイント

  • SPA でもURLは変わります。History API という仕組みで、再読み込みせずにURLだけを書き換えています
  • 「SPAが常に優れている」わけではありません。要件に対して過剰なSPA化は、初回表示の遅さと実装コストだけが残ることもあります
  • 迷ったら「このページはどれくらい操作するか?」を考えると選びやすくなります

公開するときにつまずくところ

ブラウザ側だけで動く SPA の実体は 1枚の HTML と JavaScript・CSS だけです。サーバー側でページを組み立てる処理が要らないため、公開に必要なのは静的ファイルを置いて配る場所だけになります。静的サイト向けの [[ホスティングとレンタルサーバー]] や、配信そのものを [[CDN]] 上で行うサービスがそのまま選択肢になります。

ただし、ここでほぼ全員が同じ罠を踏みます。SPA が History API で URL を /users/123 のように書き換えるとき、その書き換えはブラウザの中だけで完結していて、サーバーへは何も問い合わせていません。アドレス欄の見た目が変わっているだけ、という状態です。ところが同じ URL を直接開いたり、その画面で再読み込みしたりすると、今度は /users/123 がそのままサーバーへの実際のリクエストになります。サーバー側にその名前のファイルは存在しないので、返ってくるのは 404 です。「手元では動くのに、公開してリンクを共有した相手だけエラーになる」という定番のつまずきです。

直すのはアプリ側ではなく配信側の設定で、「該当するファイルが無ければ index.html を返す」というフォールバックを入れます。[[Nginx]] なら try_files、[[リバースプロキシ]] を挟む構成なら同じ考え方の転送設定、静的ホスティングサービスでは「SPAモード」「リライト設定」といった名前で用意されています。index.html さえ返れば、あとは JS が URL を読んで正しい画面を描きます。

MPA でこの問題が起きないのは、URL がサーバー側のファイルやルートと1対1で対応していて、どの URL を直接開いてもサーバー側に答えがあるからです。

なお、ここまでは SSR を使わない構成の話です。[[Next.js]] のようにサーバーでHTMLを組み立てる構成では、置き場所は「ファイルを配るだけの場所」では足りず、リクエストのたびにコードを実行できる環境が要ります。逆にビルド時にURLごとのHTMLを書き出しておく静的生成(SSG)なら、配信は静的ファイルのままで、どのURLを直接開いてもそのHTMLが返るため上の404も起きません。

関連技術とのつながり

  • [[React]] — SPA を作る代表的なライブラリ
  • [[Next.js]] — SSR で SPA の弱点を補うフレームワーク
  • [[DOM]] — SPA は DOM の書き換えで画面遷移を実現する
  • [[状態管理]] — SPA では画面をまたぐデータの持ち方が課題になる
  • [[SEOの技術基礎]] — SPA と検索エンジンの相性問題を理解する鍵
  • [[REST API]] — SPA が画面を書き換えるためのデータの入手先
  • [[CORS]] — SPA と API を別オリジンで動かすときに必ず出会う制約
  • [[fetchと非同期通信]] — そのデータを実際に取りに行くブラウザ標準API
Q: SPAのページ遷移の仕組みとして正しいのはどれ?
- [ ] 遷移のたびにサーバーから新しいHTMLを丸ごと受け取る
- [x] JavaScriptがDOMを書き換えて画面を切り替える
- [ ] ブラウザが自動的にページのスクリーンショットを切り替える
解説: SPAは1枚のHTMLを読み込んだ後、JSによるDOM書き換えで画面を切り替え、サーバーとはデータだけをやり取りします。

Q: MPAが有利とされる点はどれ?
- [x] 初回表示の速さとSEO
- [ ] ページ遷移のなめらかさ
- [ ] 画面をまたぐ状態管理のしやすさ
解説: MPAはHTMLがすぐ表示されるため初回表示が速く、検索エンジンにも内容が伝わりやすい方式です。

Q: SPAのSEO面の弱点を補う手法として本文で挙げられているのはどれ?
- [ ] 画像をすべてSVGに置き換える
- [ ] localStorageにHTMLを保存する
- [x] Next.jsなどによるサーバーサイドレンダリング(SSR)
解説: SSRは初回はサーバーでHTMLを生成して返すため、SPAの「最初のHTMLがほぼ空」という弱点を補えます。