私は主にサーバー レンダリング アプリケーションと主にクライアント レンダリング アプリケーションの両方に取り組んできました。各タイプには、独自の長所と短所があります。ただし、どちらかを選択する必要があるという考えは、誤った二分法です。リソースがあれば、両方を組み合わせて両方の長所を活かすことができます。
純粋にクライアント側のフレームワークには 4 つの主な課題があります。
- SEOと分析
- キャッシング
- メモリー
- レイテンシー
SEO
Node.JS を使用しているため、サーバー上のクライアント側フレームワークを使用して googlebot と会社の静的ページを出力するだけで、SEO の問題を軽減できます。最近、Google は単一ページ アプリケーション用の便利な Analytics API を作成しましたが、マスター テンプレートの最後に数行を追加するだけでは、少し手間がかかります。
キャッシング
キャッシュは、Web アプリケーションを高速化するための非常に重要な方法です。少量のデータの場合、クライアントのメモリまたは localStorage にデータをキャッシュする方が高速な場合がありますが、ストレージ スペースは非常に限られています (現在約 5MB)。さらに、localStorage でキャッシュの無効化を行うのは非常に困難です。
メモリー
記憶は、私が見落とすために心から支払ったものです。いつの間にか 200MB 以上の RAM を占有するアプリケーションを作成してしまっていました。最適化で半分にできるかもしれませんが、サーバー上ですべてレンダリングした場合、20 MB 以上かかるとは思えません。
レイテンシー
レイテンシも見逃しやすいです。たとえば Drupal では、ページごとに約 50 から 100 の SQL クエリが実行されます。データベース サーバーがアプリケーション サーバーのすぐ隣にある場合、待ち時間を気にする必要はなく、これらすべてのクエリを数百ミリ秒未満で実行できます。クライアント側のアプリケーションは、通常、1 つの AJAX リクエストを作成するのに 100 ミリ秒かかります。これは、これらの往復を最小限に抑えるためにサーバー側 API の設計に多くの時間を費やす必要があることを意味しますが、その時点で、サーバーは HTML を生成するために必要なすべてのデータを既に持っています。適切な RESTful インターフェイスと通信するクライアント側アプリケーションは、注意しないと非常に遅くなる可能性があります。
37 Signals は最近、新しいバージョンの Basecamp に実装したハイブリッド クライアント/サーバー アーキテクチャについてブログに掲載しました。このハイブリッド アプローチでは、サーバーを使用して HTML をレンダリングしますが、クライアントで PJAX などを利用して、ページ全体の更新をなくします。効果は本当に速く、私が推奨するものです。