3秒でわかる
最初に読み込んだ 1 枚の HTML の上で、JavaScript が中身を差し替えて画面を切り替える Web アプリの作り方です。
30秒図解
もう少し詳しく
どういうものか
Single Page Application の略。従来の Web サイトはリンクを押すたびにサーバーから新しい HTML を受け取り、ページ全体を読み直していた。SPA では最初の 1 回だけ HTML と JavaScript を受け取り、以降の画面切り替えは JavaScript が DOM を書き換えて行う。サーバーとは必要なデータだけを JSON でやり取りする。
React、Vue、Angular で作られたアプリの多くがこの形になる。Gmail や Google マップのように、操作しても画面全体が白く点滅しないサイトは、たいてい SPA と考えてよい。
なぜ必要か
画面遷移のたびにヘッダーやサイドバーまで送り直すのは無駄が多い。SPA は変わる部分だけを描き直すため、体感速度が上がる。加えて、入力途中の状態や開いたタブの位置といった情報が遷移をまたいで保てるので、業務システムのような操作の多い画面と相性がよい。
具体例
React Router で 2 画面を切り替える最小の形。
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">一覧</Link>
<Link to="/detail/1">詳細</Link>
</nav>
<Routes>
<Route path="/" element={<ItemList />} />
<Route path="/detail/:id" element={<ItemDetail />} />
</Routes>
</BrowserRouter>
);
}Link を押しても通信は発生せず、History API で URL を書き換えたうえで表示する部品だけを入れ替えている。
つまずきやすいところ
サーバー設定の抜けが最も多い。/detail/1 を直接開いたりリロードしたりすると、そのパスのファイルはサーバーに存在しないため 404 になる。どのパスへのアクセスでも index.html を返す設定が要る。
検索エンジン対策も課題になる。中身が JavaScript 実行後にしか存在しないため、クロールの結果が安定しない。SEO が重要なページは、Next.js のようなサーバーサイドレンダリングを併用する構成が選ばれる。
最初に読み込む JavaScript が大きくなりがちな点も見落とされやすい。初回表示だけは、素の HTML より遅くなることがある。
似た用語との違い
| 方式 | HTML を作る場所 | 初回表示 | 遷移の速さ |
|---|---|---|---|
| MPA | サーバー | 速い | 毎回読み直し |
| SPA | ブラウザ | 遅め | 速い |
| SSR | サーバーで生成しブラウザで引き継ぐ | 速い | 速い |