良い質問。特に、Backbone.js のようなものがより一般的になってきている時代に。
順を追って見ていきましょう。
まず、HTML ではなく JSON を生成するためのサーバーの負荷は、おそらくほぼ同じです。ほとんどのリソースは、データ オブジェクトを HTML または JSON に変換することには使用されませんが、クライアント リクエストの受け入れ、フレームワークのロード、この場合は CakePHP のロード、リクエストのルーティング、さらにいくつかのコンポーネントのロード、データベース接続のセットアップに使用されます。 、それにクエリを投げ、結果を受け入れ、それらを配列/オブジェクトに変換してから、そのデータをビューの文字列(JSONまたはHTML)に出力し始めます。問題は、PHP のようなサーバー側言語は、物事をループして値を文字列に出力することにあまり感銘を受けませんが、問題なく実行できます。
実際には、JSON を出力し始めると、パフォーマンスの差はそれほど大きくなりません。少なくとも、ほとんどのものには十分ではありません。
JSON を使用するのは、複雑な機能がある場合です。たとえば、更新が必要な小さなコンポーネントやデータがたくさんある tweetdeck のフィードのようなもの。単一のツイート、ツイートのリスト、フォロワー数など。HTML の完全なセットを毎回再ダウンロードするよりも、これらの小さな情報をロードする方が理にかなっています。変更される可能性のあるものがたくさんあるため、JSON とクライアント側のテンプレートを使用します。
ただし、ブログ、電子商取引の Web サイト、Wiki などの「通常の」アプリケーションでは、このような細かい設定は必要ありません。その場合、AJAX を使用します (定義を使用)。
いくつかの理由は、JSON を返すビューを最初に作成してからクライアント側のテンプレートを作成してこれらをレンダリングするよりも、HTML ビューを作成する方が簡単で開発者にとって使いやすいためです。サーバー側のテンプレートでは、特定の条件のチェック、ループの作成、必要に応じた追加データのフェッチなどを簡単に行うことができます。とにかく、それはあなたのパフォーマンスにそれほど影響を与えません。
もう 1 つの理由は、フォールバックとして、サーバー側で静的 HTML を使用して非 AJAX ページもレンダリングできることです。したがって、クライアントが AJAX を使用できる場合は、AJAX を介してコンテンツをロードし、'' のコンテンツを取得した HTML の '' に置き換えますが、使用可能な AJAX がない場合は、リダイレクトするだけです。そのページ。これで、javascript クライアントと非 javascript クライアントの両方がサポートされるようになりました。サーバー側とクライアント側のテンプレートでもこれを実現できますが、それには二重の作業が必要になるか、Mustache のようなものを使用する必要があります。
これに加えて、JSON を使用してすべてのレンダリングをクライアントで行うことの欠点は、ページのレンダリングに必要な情報の一部がユーザーの手に渡るはずがないことです。サーバー側でレンダリングする前に、コードで何らかのチェックを実行する、クレジット カード データ、社会保障番号、実名などを想像できます。クライアント側で同じチェックを行うには、すべてをクライアントに送信する必要があり、それをユーザーに渡す必要があります。もちろん、これを実行してクライアントに送信する前にサーバー側ですべてのデータを処理することはできません。
総括する:
私にとって、サーバー側またはクライアント側の HTML レンダリング間のパフォーマンスは、実際にはそれほど明白ではありません。私は多くの JSON を使用しますが、通常はビューに関連しないものに使用します。AJAX 呼び出しで何かを保存し、JSON でステータス レポートを返すようなものです。などを実行できますif data.status == 'awesome'
。しかし、通常の Web サイトを完全に AJAX にする場合は、pjax (以下) のようなものを使用して、サーバーから HTML の一部をロードします。私の目には、javascript は既存の HTML で処理を行うべきであり、あまり結合されるべきではありません。多数の小さなデータを同時に追跡する必要がある、非常に複雑でリアルタイムのアプリケーションを構築する場合は例外があります。そのため、クライアント側のテンプレートはその場所を持ちますが、どこにでもあるわけではありません。
pjax を見てください。これは、サーバー側からページ上の要素に HTML の一部を動的にロードするための JavaScript ライブラリです。
http://pjax.heroku.com/
DHH は、Hacker News のスレッドに、Basecamp を使用したセットアップの方法と内容について返信しました。主にサーバー側のスクリプトで、クライアント MVC はほとんどありません。
https://news.ycombinator.com/item?id=3603898
別の興味深いリンク。LinkedIn は、パフォーマンス上の理由からクライアント側のテンプレートを使用する方法について説明しています。
http://engineering.linkedin.com/frontend/leaving-jsps-dust-moving-linkedin-dustjs-client-side-templates