2011-02-07 8 views
9

Iリストを構築するために連絡先に関するデータを返すのですHTMLを返すか、javascriptを使用してHTMLをビルドしますか?

基本的なHTMLが

{repeat:20} 
<div class="contact"> 
    <a rel="123">FirstName LastName</a> 
    <div class="info"> 
    {repeat:5} 
    <div> 
     <div class="infoLabel">Age:</div> 
     <div class="infoPiece">56</div> 
    </div> 
    {endrepeat} 
    </div> 
</div> 
{endrepeat} 

のように見える{繰り返し:20}コードのブロックが20回繰り返される実際のコード
ではありません

私の質問です。

よりbenificialどのようなものです:

  1. 実際のHTMLを返し、マークアップサーバー側を作成します。
  2. 情報とともにJsonデータを返し、リストクライアント側を構築します。この議論の目的のために


は、返されたデータがためである
  • (我々は、高性能サーバを使用している)私たちは

    • サーバーの負荷が問題ではない、いくつかの定数を仮定してみましょう表示目的のみ(操作しないでください)
    • JavaScriptを有効にしていないユーザーは含まれていません。
    • 私たちはどんなブラウザで加味されていない<のInternet Explorer 7
  • 答えて

    8

    ウェブ開発のほとんどの時代では、あなたにとってより重要なことを決める必要があります。

    パフォーマンスの直後であっても、サーバー上ですべてのレンダリング処理を実行してHTMLコードを配信するだけで高速に処理できます。しかしこれは順番に、ほとんどの時間はフレキシビリティに加えて、あなたは電線を通じてより多くのトラフィックを持っています。

    一方、JSONデータをインスタンスに送信してクライアント上でレンダリングするだけでは、トラフィックが大幅に減少しますが、クライアントサイドではCPU負荷が増えます。ブラウザ(DOM + ECMAscript)は、過去数年にわたってパフォーマンスが大幅に向上しています。そのため、アプリケーションの多くは何ですか。

    しかし、これはストーリーの終わりではありません。 JSONは最適化されていますが高度に最適化されていません。また、パフォーマンス後にの場合は、独自のデータ転送を作成する必要があります。インスタンス

    |box1|item1|item2 
    

    のために以下のコードは、当然のJSON表記

    '{"box1": ["item1", "item2"]}' 
    

    これは非常に特異的であるが、私たちは本当に大きなつもりなら、それは大量のトラフィックを保存しています。 Nicholas C. Zakasの書籍高性能なJavascriptをお勧めします。このトピックに関する執筆の本。

    +0

    +1パフォーマンスの観点からは素晴らしい答えです。また、HTMLとJSONの間の決定は、データが静的で表示目的のみであるかどうか、後で操作するかどうかによっても異なります。 –

    1

    私は何と言うだろう、それサーバー側.... JSは...

    +0

    初期ページの読み込み時間を参照していますか? Javascriptをダウンロードすることに関して。ほとんどの高性能Webアプリケーションでは圧縮器が使用されていますが、これはキャッシングと高いインターネット速度を組み合わせることで、これをほぼ完全に否定することができます。 – Hailwood

    +0

    uhm。ええ、そうです。私の答えを考え直すと、私は黙っていたはずです^^ –

    2

    個人的にあなたのページの読み込み時間が増加する可能性がありますよう、私はそれをサーバー側に作成し、HTMLを返します。最も大きな理由は、あなたのサイトがjavascriptが無効になっている人には役に立たないということです。また、エンジンを検索することもほとんど目に見えません。

    +0

    私はこれがすべてとにかく動的に読み込まれていると感じています。 –

    +0

    @ Box9あなたは正しいです。また、検索エンジンが最初にこのページへの道を見つけた場合、私はむしろ心配しています! – Hailwood

    +0

    @ Box9と@Hailwood - どちらも良い点なので、私の理由はおそらく適用されませんが、より一般的な状況に適用される可能性があるので、答えはここに残しておきます(特にあなたの状況ではなくても) –

    1

    私があなたであった場合、ページの読み込み時間は私の判断に影響しません。私はそれがいかに簡単に維持されるだろうと思うだろう。私はそれをサーバサイドで行うことは事態をより簡単にするだろうと思う。あなたのJavaScriptを解析するためのテンプレートを持つ必要はありません。

    3

    新しいレコードを追加したり、編集したりするなど、集中的なAJAXタスクを実行する予定の場合は、空のページを読み込んで、辞書の配列を返すスクリプトを呼び出してくださいjQueryで実装されたTemplate(ベータ版)システムを使用するか、隠し要素を持つ、spans/divs/tdsクラスをタグ付けして新しいレコードが到着するたびにクローンを作成します。

    一方、この静的なままにする場合は、HTMLを使用してください。

    これは私がテンプレートを管理する方法です。これは、DOM要素がDOMツリーに存在し、要素を含む文字列を解析するよりも安価であるため、効率的な方法です。

    <html> 
        <head> 
         <script type="text/javascript"> 
          $(function() { 
    
           $contactTemplate = $("#contact_template") 
           function makeContactElement(data) { 
            var $newElem = $contactTemplate.clone(true) 
    
            $newElem.attr("data-id", data.id) 
            $newElem.find(".name").text(data.firstName + " " + data.lastName) 
    
            for(var i in data.info) { 
             $newElem.find(".info").append(makeInfoElement(data.info[i])) 
            } 
    
            return $newElem 
           } 
    
           $infoTemplate = $("#info_template") 
           function makeInfoElement(data) { 
            var $newElem = $infoTemplate.clone(true) 
    
            $newElem.find("infoLabel").text(info.label) 
            $newElem.find("infoPiece").text(info.piece) 
    
            return $newElem 
           } 
    
           $.getJSON('/foo.bar', null, function(data) { 
            for(var i in data) { 
             $("#container").append(makeInfoElement(data[i])) 
            } 
           }) 
          }) 
         </script> 
         <style type="text/css"> 
          .template { display: none; } 
         </style> 
        </head> 
        <body> 
    
         <div id="container"> 
         </div> 
    
         <!-- Hidden elements --> 
    
         <div id="contact_template" class="contact template"> 
          <a rel="123" class="name"></a> 
          <div class="info"></div> 
         </div> 
    
         <div id="info_template" class="template"> 
          <div class="infoLabel"></div> 
          <div class="infoPiece"></div> 
         </div> 
        </body> 
    </html> 
    

    新しいレコードを作成するときに、単に情報を持つデータオブジェクトを記入し、あなたはすべての要素の流れがジェネリックになることを確認します。

    .clone(true)を使用すると、ライブイベントをバインドする代わりに汎用イベントを作成するためのドアが開きます。これは高価です。例えば

    、レコードを削除するボタンを作りたい場合:

    <script ...> 
    ... 
    $("#contact_template .delete").click(function() { 
        var id = $(this).parents("contact").attr("data-id") 
        $.post('/foo.bar', { action: delete, id: id }, function() { ... }) 
        return false 
    }) 
    </script> 
    ... 
    <div id="contact_template" class="contact template"> 
        <a href="#" class="delete">Delete</a> 
    </div> 
    

    幸運!

    +1

    さらに、DOMに要素を追加する効率的な方法を説明するリンクhttp://dev.opera.com/articles/view/efficient-javascript/?page=3 – subhaze

    1

    技術的な質問に対する具体的な回答ではなく、意見を求めているようです。だから私の意見です。

    最近の傾向として、クライアント側の機能とオフライン機能が増えているWebアプリケーションがあります。したがって、クライアント側でJSONを送信します。これは、サーバー側の作業が少なくて済むため、スケーラビリティにも優れています。

    1

    サーバー側の負荷が心配されていないため、CPUサイクルに余裕があるので、バックエンドに大量の作業をさせてください。アプリケーションはよりスマートになり、より速く応答します。ただし、ネットワーク使用率を念頭に置いておく必要があります。 JSON文字列を前後にスローすることは非常に効率的で、ネットワークの負荷を軽減しますが、クライアントはより多くの作業を行う必要があります。このディスカッションで述べたように、ブラウザは非常に高速です。 Chrome、FF4、IE9のJavaScript実装は、私たちが今までに見た中で最も速いものです。

    私の提案は、そのままアプリケーションで小さなベンチマークを行い、そのパフォーマンスを確認することです。負荷がかかっているものを見るために、多くの要求で2つのバリエーションをヒットしてみてください。それは実際にあなたの特定のアプリケーションに依存します。

    +0

    小さなベンチマーク。 2つのスクリプトを作成します.1つはjavascriptを使用してリストを作成し、もう1つは必要な連絡先の詳細を追加します。あなたは安全なベンチマークとしてどのくらいのサイクルを言いますか? – Hailwood

    関連する問題