世界を動かす技術を、日本語で。

現代のCSSがSPAを終わらせる時が来た

概要

  • ネイティブCSSトランジション の登場により、SPA(Single Page Application)を選ぶ最大の理由が消滅
  • 多くのWebサイトが 本来不要な複雑さ をSPAで実装し、パフォーマンス低下を招く現状
  • View Transitions APISpeculation Rules など、モダンブラウザによる新機能の進化
  • SPAとMPA(Multi Page Application) のパフォーマンス比較で、MPAが圧倒的に優位
  • 本質的なWeb開発の指針は「 必要なものだけを使い、プラットフォームの力を活かす」こと

ネイティブCSSトランジションがSPAの優位性を無効化

  • 「アプリのような体験」 を求める声から、安易にSPAアーキテクチャを選択する傾向
  • 実際には、 SPAの導入理由は「滑らかなページ遷移」 のみが主な動機
  • しかし、 View Transitions API のようなネイティブ機能により、 JavaScript不要で滑らかな遷移 が実現可能
  • SPAでは、 本物の滑らかさではなく「シミュレーション」 に過ぎないケースが大半
  • 例:Next.jsやGatsbyなどのSPAは、 大量のJavaScript でネイティブ挙動を模倣

SPAの「滑らかさ」は幻想

  • SPAでよく見られる問題点
    • ページ遷移のローディング状態間のフェード
    • スクロール位置の復元失敗
    • フォーカス挙動の不一致
    • コンポーネント再ハイドレーションによる遅延
    • レイアウトシフトやスケルトン画面
    • 効果に見合わないパフォーマンス低下
  • SPAの本質は「ネイティブ機能の再発明」 であり、結果的に重く脆いUXに

Webプラットフォームの進化

  • Chromium系ブラウザ(Chrome, Edge等) で、 View Transitions API が利用可能
  • CSSのみでページ間アニメーション を実現
    • 例:@view-transition { navigation: auto; } などのシンプルな記述
  • 共通要素のアニメーション も、view-transition-name属性で簡単指定
  • JavaScriptドリブンなトランジション も、document.startViewTransitionで柔軟に対応可能

Speculation Rulesによる高速ナビゲーション

  • Speculation Rules で、ユーザーの行動を元に 事前プリロード・プリレンダ を自動化
    • 例:リンクにhoverやタッチした瞬間にページを先読み
  • 瞬時のページ遷移 を実現、ローディングスピナー不要
  • ただし、 ページが重いと逆効果 (無駄なCPU・バッテリー消費)

ブラウザの進化と「シンプルさ」への回帰

  • Back/Forward Cache(bfcache) など、ブラウザ標準の高速化機能が充実
  • SPAの設計パターン(クライアントサイドルーティング等)はbfcacheと相性が悪い
  • HTML+CSS中心のクリーンな実装 が、パフォーマンス・安定性・SEOで圧倒的有利

SPA vs MPA:パフォーマンス比較

  • SPA(Next.js等)
    • JSバンドル:1〜3MB
    • TTI(操作可能までの時間):3.5〜5秒
    • ルート遷移:シミュレーション
    • SEO:複雑・脆弱
    • スクロール/アンカー挙動:不安定
  • MPA + View Transitions + Speculation Rules
    • JSバンドル:0KB(必要時のみ追加)
    • TTI:約1秒
    • ルート遷移:ネイティブ
    • SEO:簡単・堅牢
    • スクロール/履歴処理:ブラウザ標準で完璧

本当に必要な「アプリ的」要素とは

  • 多くのWebサイトはアプリではなく、SPAの恩恵を受けない
    • 例:ECサイト、ドキュメント、マーケティングサイト、ブログ
  • シンプルな構造・高速なマークアップ・クリーンなURL が最優先
  • 必要な場合のみ最小限のインタラクションを追加 すれば十分

意図的な技術選定のすすめ

  • ReactやTailwind、Vite等の利用自体は否定しない
  • 「必要なものだけを必要な分だけ」 ブラウザに届ける設計が重要
  • HTML、CSS、ネイティブナビゲーションの活用 で、誰にとっても快適なWeb体験

2025年型Web開発の指針

  • SPAは一時的な制約の解決策だったが、今や不要
  • View Transitions APIによるネイティブなページ間遷移
  • Speculation Rulesによる瞬時のプリレンダナビゲーション
  • クリーンなマークアップと高速なロード、実URLの維持
  • 「プラットフォームの力を活かす」ことが最適解

まとめ:Webの本質に立ち返ろう

  • SPAで「滑らかさ」を追求するのは時代遅れ
  • モダンなサーバーレンダリング、CSSアニメーション、意図的なプリロード戦略 の組み合わせが最適
  • 不要なJavaScriptを減らし、2025年らしいWeb開発 を実践
  • ユーザーも開発者も、より速く・シンプルで・後悔の少ないWeb体験 を実現

Hackerたちの意見

SPAは、シームレスな遷移だけじゃなくて、クライアントサイドでのユーザージャーニーをたくさん詰め込むことも大事なんだよね。サーバーにあまり負担をかけずにね。例えば、2025年になっても、ほとんどのショップがフィルターを変えたり、カテゴリーを掘り下げるたびに完全にリロード(再取得)しなきゃいけないのが、俺の一番の不満なんだ。よくあるケースは、ショップに行って「本」をクリック(リクエスト)、次に「ファンタジー」サブセクションをクリック(別のリクエスト)、探してる本が実は「SF」だと気づいて戻る(リクエスト、キャッシュされてるといいな)そして「SF」に行く(またリクエスト)。ユーザーがカタログ全体をダウンロードして、サーバーに触れずにフィルターを適用できる方が、ずっと良いUXだよね。チェックアウトに行くまでサーバーに頼らなくて済むし。でも、データ量が多いって言うかもしれないけど、Amazonならともかく、ほとんどのショップのセクションは、1つの商品の写真より少ないキロバイトでそのパターンを実現できるデータに効率的に詰め込めるんだ。2005年頃からこんなウェブアプリを作ってきたけど、なんでもっと一般的じゃないのか理解できないよ。

HTMX(やそれに似たもの)は、これをたくさん解決してくれるんだ。今のSPAを使うと、フロントエンドとバックエンドの2つのアプリを作ることになることが多いんだよね。俺はサーバーサイドでたくさん作りたいし、クライアント側にはちょっとしたインタラクティブな要素(表示/非表示、折りたたみ/展開、エフェクト)を追加したいんだ。でも、SPAの必要性はまだあると思うよ。

うーん、フルリロードしなきゃいけないのが一番痛いのは、サイトの効率性だと思う。実際のデータは数KBだけど、ページ自体は100MBダウンロードしなきゃいけなくて、ウェブブラウザは1GBのRAMを消費してる。Hacker Newsのナビゲーションがひどいとは思わないけど、ほとんどのナビはリロードだよ。2008年の4GB RAMのノートPCでも問題なく動くし。でも、同じデバイスでDoorDashに行くと、50アイテムのリストを読み込むのに30秒かかる。ダブルダッシュのカウントダウンをくれるけど、カレーを注文して6パックのソーダを手に入れるのに3分以内は無理だと思う。2.5分は、インターフェースが表示されるのを待ってる時間だし、ほとんどがフルリロードじゃないんだ。

スパのバックスワイプを使うと、ほとんどの場合ページのトップに戻っちゃうんだよね。アプリから出て戻っても効果ないし、マルチページのスパを作るのって本当に難しい。

チェックボックスセレクターを使えばできるよ。例えば、[0]を見てみて。俺はフロントエンドはあんまりやらないから、ChatGPTにコードを振ってもらったんだけど、これがベストな方法かは分からないよ。[0] https://html-preview.github.io/?url=https://gist.githubuserc...

一般的に言って、企業はカタログ全体をダウンロードさせたくないんだ。競合他社が簡単に分析できるようになっちゃうからね。もし本を売ってる店なら、何十万冊もあるかもしれない。そんなのをクライアントに転送するのは良い体験じゃないし、それに伴う帯域幅やメモリの使用も考えると、あまり良くないよ。

そうなんだよね、これって貴重な反例だと思うんだけど、リンクをシフトクリックして新しいタブで開く時(これってみんながよくやることだよね)、マルチページアプリケーションだと追加の手間はゼロなんだよね。でも、SPAだとそれを管理しなきゃいけない。もしリンクが存在しなくて、カテゴリにアクセスするのがセレクト入力だけだったら、UXはあまり良くないよね。

SPAは、ユーザーがアプリ内で長時間セッションを持つときに意味があるんだ。大きなバンドルを読み込む苦労に対して、読み込み後は本当に小さなネットワークリクエストで済むからね。スムーズな遷移はいい副産物だけど、SPAの理由じゃない。この記事の核心的な主張、つまりクライアントサイドのルーティングがページ遷移の解決策だっていうのは、SPAが解決する問題を完全に誤解してるよ。だから、もしSPAの誤解を共有してて、間違った問題を解決するために使ってたら、この文章は100%正しいよ。でも、SPAはjQueryの時代に登場したもので、Reactの時代じゃないんだ。複雑なアプリを持っていて、大きなjQueryのスパゲッティを読み込んで、アプリの各divをそれぞれのミニアプリとして扱って、小さなネットワークリクエストで全てを同期させてた。これは、古いブラウザで遅い接続のユーザーがデータを変更するたびに、全てのコードをリロードしたくないという実際の問題を解決したんだ。jQueryのおかげでSPAが実現可能になったんだよ。その後、Reactや他のフレームワークがスパゲッティ感を減らして、実際に普及したんだ。時には怪しい理由でね。でも、SPAの最も強い主張は、キャッシュできる大きなコードバンドルを一度の読み込みで提供する解決策として使うことなんだ。ユーザーの期待されるセッション時間が長いときに、その複雑さの苦労をする価値があるからね。

たくさんの雑なjQueryモジュールが本当にSPAの viable optionだったかは分からないな。人々はそれを試みたけど、SPAの時代はbackbone.jsから始まったと言えるよ。

低帯域幅や不安定な接続(攻撃的なキャッシングと組み合わせて)は、SPAを支持する最も強い理由の一つだよ(アプリケーションのAに重点を置いて、ウェブサイトではなくね)。良好な接続があるときにアプリのフロントエンド全体を訪れて(キャッシュして)、その後のアプリの使用は最小限の帯域幅で進められるんだ。

これって本当?古いSPAって言うと、ブラウザで動くJavaアプリを思い浮かべるんだよね。それは確実にjQueryよりも古いよ。(この質問をダウンボートするためにこのサイトを使うの、なんか面白い。)

でっかいjQueryスパゲッティを読み込むって言ってるけど、俺は早い段階からスコープを制限するためにIIFEみたいなJSデザインパターンを使って、コードを整理して構造化するのに時間をかけたんだ。モジュールの遅延読み込みやミニファイもね。とにかく、俺の経験では、AngularJSが構造化されたフロントエンドアプリケーションを作るための最大の試みだったと思うし、Java開発者にはすごく受けてた(Angularは今でも人気らしいし)。モジュール化や依存性注入、テストのしやすさが大きなポイントだった。Backboneでアプリを始めたとき(FlexアプリをiPadで動かせなかったから)、機能の大半はバックエンドにあると思ってテストなんていらないって主張してたんだけど、間違ってた。後にAngularJSでの再構築はフロントエンドのテストがかなり重要になったよ。今では、現代のAngularコードの冗長さや複雑さ、間接的な感じにはうんざりしてる。Javaコードも同様だけどね。

余談だけど、jQueryがいつもスパゲッティと結びつけられるのにはうんざりしてる。悪いプログラマーの手にかかれば、どんなTuring完全なシステムもスパゲッティになるんだよ。逆に、デザインを知ってる良いプログラマーの手にかかれば、シンプルでクリアになる。

SPAsが人気の本当の理由は、JavaScriptが新しいVisual Basicになって、何も知らない開発者が何百万もいるからだと思う。こういう市場の力は「帯域幅の最適化」よりもずっと大きな影響を与えるよ。俺の証拠はシンプルで、今まで見たSPAアプリは普通のHTMLよりも2桁遅いことが多かった。実際には帯域幅の利点なんてほとんどない。理論的にはあるけど、出会うアプリは半分のデータベースを流して、JSコードで数十バイトを選び出すだけ。ここでもこの議論の中にその意見があるよ![1] 別の視点として、もしトップ100のサイトで莫大な帯域幅コストがかかっているなら、アプリをSPAに変えるのは経済的に意味があるかもしれない。でも実際には、小さなプロジェクトが初日からSPAで始まって、帯域幅のコストやパフォーマンスが影響することはほとんどないよ。ギガビットイーサネットでしかアクセスされない内部アプリも見たことがある。静的コンテンツがSPAとして表示されるのは、俺にはちょっと狂ってると思う。[1] 「ユーザーがカタログ全体をダウンロードする方が、はるかに良いUXだ」出典: https://news.ycombinator.com/item?id=44688834

もし現代的なCI/CDパイプラインがあるところで働いているなら、1日に何度もデプロイするたびに、その大きなJSバンドルを再構築してキャッシュを無効にしてる可能性が高いよ。HTTP/2はブラウザに採用されて10年くらい経つし、そのマルチプレクシングのおかげで大きな単一バンドルのパッケージングは関係なくなってる。大きなバンドルのパッケージングを使うSPAは、現代のブラウザやサーバーの機能を活かせてないね。

SPAは、アプリが複雑な状態を必要とする時にはいいよね。ネストされたタブが複数あったり、モーダルがあったり、動的にデータを読み込む複数の相互リンクされたセレクト入力があったり、ユーザーのアクションに応じてデータを遅延読み込みして更新するチャートやグラフがあったりする場合ね。ある程度の複雑さを超えると、データをその場で読み込む必要が出てきて(ページ読み込み時に全てを読み込むのではなく)、SPAを避けることはできなくなるんだ。SPAを作ることを選ぶのは、いつでも避けられるような気まぐれな決断じゃないこともある。時には、アプリの複雑さが分からないから、最初からSPAにする人もいるんだよね。そうすれば、後で出てくるかもしれない要件に対応できるかどうか心配しなくて済むから。一番最初の仕事の一つは、マルチページのEdTech「ウェブサイト」をSPAに作り直すことだったんだけど、マルチページサイトは非常に制限が多くて遅くて、複雑なユースケースには向いてなかったんだ。オーバーレイ機能がたくさんあって、それを別ページにするのは意味がなかったし。複雑な状態はURLに保持しなきゃいけなかったし、アクセス制御も微妙だった(HTMLを提供するよりも、リモートAPIコールでデータを混ぜ合わせる方が安全で、監視もしやすい)。SPAに対する批判の多くは、実はReactのような特定のフロントエンドフレームワークに関するものだと思う。多くの開発者は、スクロールバーをリセットするみたいな理由でReactが好きじゃないんだよね。Reactは、DOMを回避しようとするハックそのものだから。DOMは常に扱いにくくて拡張不可能だという前提で作られたけど、実際はそうじゃなかった。今では、カスタムウェブコンポーネントを使えば、DOMは直接扱うのがかなり簡単になったけど、この情報はReactの人気のせいで抑えられているみたい。Reactを含む多様なフロントエンドフレームワークで何年も働いてきたけど、Webコンポーネントの開発者体験は比べ物にならないほど優れているよ。期待通りに動くし、変なレンダリングのグリッチやタイミングの問題、掘り下げないといけない変な落とし穴もない。複雑なネストされたコンポーネントも作れるし、速いし、レンダリング順序も完全にコントロールできる。Webコンポーネントの中から属性を監視することで、自分の反応性を簡単に実装できる。得られる柔軟性と信頼性は、Reactのようなフレームワークとは比較にならないし、何もダウンロードする必要もないし、ライブラリをバンドルする必要もない(もしバンドルするなら、どのようにバンドルするか、どの程度までバンドルするかを選べるし、スクリプトやモジュールの事前読み込みを細かく制御できる)。コードもイディオマティックだよ。

読み込み後に本当に小さなネットワークリクエストを持つことと引き換えに。これが実際にどういうケースで、HTMLを送るのとは大きく違うのか、例を見てみたいな。私が関わったほとんどのSPAは、読み込み後に何十回も大きなリクエストをして、最初から同じ最終HTMLを送るよりもずっと遅くなっちゃう。JSONがHTMLよりも魔法のように圧縮されるって言えないし、HTMLはすごく圧縮がうまくいくからね。ネットワークの懸念がSPAをより良い選択にするという議論の多くは、実際にはプロパガンダか、実践ではうまくいかない迷信だと思う。

この議論はもう飽き飽きだし、無知だね。linear.appをSPAフレームワークなしで作ってみてよ。「ネイティブCSSトランジションがクライアントサイドルーティングの強い主張を静かに殺した」という考えは、せいぜい疑わしいよ。

これはちょっと unfair だと思う。LinearはSPAの中でも特別だし、普通じゃないよ。「SPAを禁止して、ブラウザからJavaScriptを取り除け」なんて誰も言ってないし。Linearの速さは「オフラインファースト」から来てるけど、同じようにやってる一般的な製品を挙げてみてほしい。そんなの普通じゃないから。チケットを買いたいときは、ほとんどのウェブサイトがSSRで、必要なところだけSPAにしてほしいな。フォーラムやニュースサイト、ブログ、情報サイトなんかもそう。SSRで開発した方がいいものがたくさんあって、CSSでSPAっぽくする方が、実際にSPAにするよりも良いと思う。

誰もSPAに場所がないとは言ってないけど、99%のウェブサイトはSPAである必要がないよ。

このSEOコンサルタントの著者がどんな世界に住んでるのか分からないよ。著者はNextとNuxtを、自分の処方に逆らうフレームワークの例として挙げてるけど、それは全然違う。1. Nextは西側で大勝利したんだ。めちゃくちゃ大きな勝利だよ。人々が新しいReactアプリについて話すとき、無意識にNextを指してる。Vue側ではNuxtがデフォルトの勝者で、NuxtはVueのNextなんだ。つまり、デフォルトで、反射的に人々はNextとMPAを選んでるってこと。極端な振り子の動きを修正したいなら、SPAを試してみるように人々に言うべきだよ。過去8年間はMPAへの熱心な推進があった。FacebookのドキュメントもNextを指していて、Create React Appを完全に非推奨にしてる。これはFacebookがNextに戦いを譲ってることでもある。2. 人々がNextの複雑さについて文句を言うとき、それは最先端のMPA戦略の難しさについて文句を言ってるんだ。SPAは逆に、何年も前から時が止まってるストーリーだよ。ほぼ10年?3. MPAをやるのは、SPAをやるよりもずっと難しい。サーバーとクライアントの区別をもっと厳密に観察しなきゃいけないし、同じページがサーバーとクライアントでレンダリングされている場合があるからね。4. SPAを書いていて、MPAのようにユーザーがナビゲートできるエンドポイントにデータを読み込むようにしたいなら、それはあなたの責任だよ。利点とコストは全て含めてね。クライアントナビゲーションをほぼ瞬時にするために、先読みでデータを読み込むこともできるよ。5. 魅力的なSEO対応のフロントエンドプロパティがあるなら、その裏には多くのチームが内部アプリやダッシュボードを支えてる。そこに多くのReact開発者が雇われてるんだ。アプリの最初の「フレーム」を完璧に出荷したいからって、無駄に負担を背負う必要はないよ。

戦争があったの?初耳だわ。「Nextが勝った」と言うのは「Reactが勝った」と言うのと同じ。何も勝ってないし、みんなが群衆が支持したと思ったものに飛びついただけ。盲目の者同士はお互いを導けないよ。Angularやミニマル、フレームワークなしにこだわってる人たちは、みんな何を話してるのか本当に不思議がってる。FacebookのドキュメントもNextに直結してるし、スタートアップやSVはお互いを持ち上げ合ってる(アフィリエイトみたいなもん)。でも、それには何の意味もない。Nextは多分ゴミフレームワークだけど、それが人々の生計に関わってる。人を定義するものを消すのは本当に難しいよ(そう、あなたの履歴書はあなたそのもの)。

SPAはページ遷移のためのものじゃないよ。TFAはページ間の派手な遷移が重要だと言ってるけど(間違い!)、自分たちの先入観を挑戦することなく「CMO」や「ブランドマネージャー」を責めてるだけ。SPAがもたらす価値を探るべきだと思う。- クライアントサイドのロジックに優れたフレームワーク(インタラクティビティ) - 関心の分離(プレゼンテーションロジックとバックエンド) - 開発者体験の向上 => 開発スピードの向上 => みんながハッピー こういう記事は、私みたいなコメントがアルゴリズムに影響を与えて多くの人の目に留まるけど、そもそもこんな記事が注目されるべきじゃないよね。

それがキャッチーで繰り返しやすいから、彼の広い主張(SEO)にぴったりなんだよね。皮肉なのは、私はページ遷移なしでたくさんのSPAを作ってきたから(それが必要な要件じゃなかったから)、ページ遷移が簡単だから追加し始めたってこと。

私にとって、SPAの約束は流動性とは関係なく、別のデータAPIと別のフロントエンド(ネイティブでもウェブでも両方でも)を持つことに関係してる。それが理由で、クライアントサイドレンダリングとSSRを混ぜるのは好きじゃない。どちらか一方でやってほしい。

SPAのポイントはページ遷移じゃなかった。良いページ遷移をする主要なSPAを一つも挙げられないよ、君は?みんなただコンテンツを置き換えるだけ。人気のSPAフレームワークを例に挙げると、Next.jsではルートの読み込み方のせいでページ遷移をするのがほぼ不可能なんだ。私はNext.jsに適切なページ遷移を追加したから、それがどれだけ大変だったか知ってる。私が見えるSPAの良い理由は二つある。1. あなたのアプリは多分インタラクティビティが必要だし、ほとんどのアプリはHTMLとCSSだけじゃ済まない。ReactとHTMLの不気味な組み合わせでアプリを書くのは楽しくないし、特にグローバルステートを扱うときはね。2. ページの構造を事前に読み込むことで、その後のデータの読み込みやリクエストがスムーズになる。スナッピーなローディング画面を得るのは、500ms何も表示されずにクリックするよりも良いし、100ms未満だと逆のことが言える。ページ全体を置き換える必要がないことで、フロントエンドのパフォーマンスが向上するけど、今のところウェブプラットフォームだけではそれに匹敵するものはない。Basecampは、フルSPAにせずにかなり複雑なウェブアプリを作るために多くの投資をしてきたけど、30秒くらいクリックして回ってみると、SPAやネイティブアプリに比べてパフォーマンスでは全然かなわないことがわかる。そうは言っても、私はウェブがもっとウェブらしく動くようになってほしいと思ってる。この奇妙なレイヤーの上ではなくね。Next.jsやSPAが何年もかけて追加してきた複雑さは、よりレスポンシブだけど時には構築が面倒なアプリや巨大なバンドルを生んでる。まだHTMLだけではSPAのパフォーマンスには追いつけないと思う。

「SPA」とは何で、「MPA」とは何なの?俺はNextJSのサイトを持ってるんだけど(個人のウェブサイトで、俺の苗字を知っててイギリスにいるなら見つけられるかも)、ほぼすべてをサーバーサイドでレンダリングしてる。技術的にはまだSPAなんだけど、JavaScriptをオンにするとRSCを読み込んでクライアントサイドのナビゲーションをするからね。JavaScriptをオフにするとどうなるか?クライアント専用のコンポーネント(例えば100%クライアントレンダリングのQRコードジェネレーター)にはフォールバックが表示されて、他のものはすべて完璧に(ちょっと遅くなるけど)読み込まれてレンダリングされるよ。すべてHTMLにレンダリングされてて、サーバーでコンポーネントをレンダリングしない方が実際には手間がかかるんだ。プログレッシブエンハンスメント万歳!

また「SEO」だとか、コロナ後に仕事に就いたランダムなウェブ開発者がSPAを誤解して文句を言ってるのを見たら、マジで爆発しそう。2000年代からウェブアプリを開発してきた者として、SPAの起源は彼が挙げた「SPAの虚偽の約束」とはほとんど関係がなくて、主に2000年代後半から2010年代初頭の企業が「モバイルファースト」を目指したからだと言っておくよ。これって、デスクトップもどこかにあったってことを意味していて、フロントエンドとバックエンドを完全に分離するシステムを設計していたんだ。以前、ウェブ開発者がフロントエンドと言っていたのは、基本的にはサーバーサイドでレンダリングされたHTMLテンプレートで、クライアントサイドで少しだけjQueryが動いているようなものだった。今では、モバイルとデスクトップのウェブアプリがビジネスロジックやデータベースを共有する必要が出てきたから、Roy Fieldingの博士論文を読んでRESTを再発見する必要があった。これによって、今やすべての企業がサービス指向アーキテクチャに移行し、バックエンドAPIをオープンインターネットに公開するようになった。これで、モバイルアプリやブラウザで動くSPAが同じAPIを共有できるようになったんだ。これはコスト削減のための手段でもあった。この時期は、Ruby on RailsやDjangoのようなフルスタックウェブアプリフレームワークが徐々に衰退していく時期とも重なっていて、数年間、これらのフレームワークはAPI専用アプリケーションをサポートする良い方法がなかった。Djangoはその時点で1.0にも達していなかったし。この頃、NodeJSが本格的に盛り上がり始めたんだ。人々がサーバーサイドでJSを使うことに慣れてくると、ビジネスロジックをより強力なデスクトップブラウザやスマホに押し込むことができるってことに気づく人が増えた。これが、今人々が「エッジデバイス」と呼ぶアプリケーションホストなんだ。これがSPAの真の動機だよ。