シングルページアプリケーション
サーバ側でクライアントのページの状態を記憶しておく方法である。リクエストを受けるとサーバは変更を伴う具体的なHTMLやJavaScriptを返し(クライアント側はこれでDOMの一部を更新する)、同時にサーバの状態を更新する。ロジックはほとんどサーバ側で実行され、HTMLも通常サーバ側で生成される。いくつかの方法では、サーバはブラウザをシミュレートし、イベントを受け取ると、シミュレートした状態がクライアントに自動的に伝播するようにして変更を実行する。
この方法はサーバのメモリやプロセッサ資源が多く必要である。しかし、アプリケーションがすべてサーバ側で実装されること、またカスタムの通信をクライアントと持たないためサーバ内のデータや状態が同一のメモリ空間で共有できることから、開発モデルが単純化されるという利点がある。
AngularJS、Ember.js、Meteor.js、Vue.js、ReactなどのJavaScriptフレームワークはSPAの原則を採用している。
AngularJSは、完全なクライアントサイドのフレームワークである。双方向データバインディングに基づくテンプレートを採用している(データバインディングとは、モデルが変化したら自動的にビューも変化させ、ビューが変化したらモデルも変化させる仕組みをいう)。HTMLテンプレートはブラウザによってコンパイルされ、生成されたHTMLがビューとしてレンダリングされる。従来のサーバサイドプログラミングではコントローラやモデルといった概念はサーバ側で作用していたが、AngularJSではそれらをクライアント側で持つため、サーバと通信することなくページを生成することが可能である。
Ember.jsは、MVCアーキテクチャに基づくクライアントサイドのフレームワークである。リッチオブジェクトモデル、宣言型の双方向データバインディング、Computed Properties、Handlebars.
SPAはサーバベースのアプリケーションよりも最初のページの読み込みが遅くなる。これはビューをレンダリングする前にフレームワークとアプリケーションコードを読み込まなければならないためである。サーバベースのアプリケーションであれば必要なHTMLを取得するだけでよいため、通信にかかる時間は短い。
キャッシングや遅延ロードモジュールなど、SPAの最初の読み込みを高速化する方法はいくつかある。しかし依然として、フレームワークとアプリケーションコードの少なくとも一部をダウンロードし、かつ多くの場合においてブラウザ上に何らかの表示をするためにAPIによるデータ取得が必要である、という事実は変わらない。このパフォーマンスと待ち時間の問題は、「いま払うか、あとで払うか」というトレードオフであり、開発者が決定しなければならないものである。