2011-02-07 26 views
9

Sto tornando dati sui contatti per costruire una listaRestituisci HTML o crea HTML usando javascript?

l'HTML di base assomiglia

{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} 

La {ripetere: 20} non è codice vero e proprio
quel blocco di codice viene ripetuto 20 volte

La mia domanda è.

Per di più benificial:

  1. creare il lato server di markup, restituire il codice HTML vero e proprio.
  2. Restituisci i dati Json con le informazioni e crea l'elenco lato client.


Ai fini di questa discussione supponiamo alcune costanti

  • carico Server non è un problema (stiamo usando un server ad alte prestazioni)
  • I dati restituiti è per solo a scopo di visualizzazione (da non manipolare)
  • Non stiamo prendendo in considerazione gli utenti senza javascript abilitato.
  • Non siamo il factoring in qualsiasi browser < Internet Explorer 7

risposta

8

Come la maggior parte delle volte durante lo sviluppo web, è necessario decidere cosa è più importante per te.

Se sei solo dopo le prestazioni, non importa cosa, è ovviamente più veloce eseguire tutte le azioni di rendering sul server e fornire semplicemente il codice HTML. Ma questo a sua volta, la maggior parte delle volte costa più flessibilità, hai più traffico sul filo.

D'altra parte, solo l'invio di dati JSON per esempio e il rendering di roba sul client, è molto meno traffico sul filo, ma è più carico della CPU sul clientide. I browser (DOM + ECMAscript) hanno aumentato le prestazioni molto negli ultimi anni e mesi, quindi è ciò che fanno molte applicazioni.

Ma questa non è la fine della storia. JSON è ottimizzato, ma non altamente ottimizzato. Anche in questo caso se si è davvero dopo le prestazioni è necessario creare il proprio trasporto di dati.Per esempio

|box1|item1|item2 

è meno codice, allora la notazione JSON

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

Questo naturalmente è altamente specifica, ma consente di risparmiare un sacco di traffico se vogliamo davvero grande. Raccomando il libro Javascript ad alte prestazioni di Nicholas C. Zakas. Libro eccellente su questo argomento.

+0

+1 Ottima risposta dal punto di vista delle prestazioni. Voglio anche aggiungere che la decisione tra HTML e JSON dipende anche dal fatto che i dati siano statici e puramente a scopo di visualizzazione, o se lo si voglia manipolare in un secondo momento. –

1

direi farlo lato server .... come JS potrebbe aumentare il tempo di page-loading ...

+0

Ti riferisci al tempo di caricamento iniziale della pagina? Per quanto riguarda il download del Javascript. La maggior parte delle applicazioni web ad alte prestazioni utilizzano compressori, questo, combinato con il caching e l'alta velocità di Internet, in questi giorni lo negano quasi completamente come un fattore. – Hailwood

+0

uhm. Si hai ragione. quando ripenso alla mia risposta, dovrei stare zitto ^^ –

2

Personalmente , Lo creerei lato server e restituirò l'html. La più grande ragione è che altrimenti il ​​tuo sito è inutile per chiunque abbia disabilitato javascript. Sarebbe anche in gran parte invisibile ai motori di ricerca.

+0

Ho la sensazione che tutto questo sia caricato dinamicamente comunque. –

+0

@ Box9 sei corretto.Inoltre, se un motore di ricerca ha trovato un modo per questa pagina in primo luogo sarei piuttosto preoccupato! – Hailwood

+0

@ Box9 e @Hailwood - entrambi buoni punti, quindi probabilmente non si applicano le mie ragioni, ma lascerò qui la risposta comunque poiché potrebbe applicarsi alla situazione più generale (anche se non specificamente per la tua situazione) –

1

Il tempo di caricamento della pagina non influisce sulla mia decisione se fossi in te. Penserei a quanto sarebbe facile da mantenere. Penso che farlo da serveride renderebbe le cose molto più semplici. Non è necessario disporre di modelli per il tuo javascript da analizzare.

3

Se stai pianificando di eseguire attività AJAX intensive, aggiungendo nuovi record, modificandoli al volo, ecc., Ti suggerisco di caricare una pagina vuota, che chiama uno script che restituisce una serie di dizionari per JSON, e quindi usando il sistema Template (beta) implementato recentemente in jQuery, oppure implementalo tu stesso, avendo un elemento nascosto, con spans/div/tds taggati con classi, e clonandolo e riempiendolo ogni volta che arriva un nuovo record.

D'altra parte, se hai intenzione di mantenere questa statica, basta usare HTML.

Ecco come gestisco il template. Questo è un modo efficiente perché gli elementi DOM esistono nella struttura DOM e la clonazione è meno costosa dell'analisi di una stringa che contiene gli elementi.

<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> 

Poi, quando si crea un nuovo record, basta compilare un oggetto di dati con le informazioni, e sarete sicuri che tutto il flusso elemento sarà generico.

L'utilizzo di .clone(true) apre la porta per creare eventi generici invece di associare un evento dal vivo, che è più costoso.

Ad esempio, se si vuole fare un pulsante per eliminare un record:

<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> 

Buona fortuna!

+1

Link che descrive ulteriormente i modi efficienti di aggiungere elementi al DOM http://dev.opera.com/articles/view/efficient-javascript/?page=3 – subhaze

1

Sembra che tu stia chiedendo un'opinione, non una risposta specifica a una domanda tecnica. Quindi, ecco la mia opinione.

La tendenza in questi giorni è verso le applicazioni web, con più funzionalità lato client e funzionalità off-line. Pertanto, lo farei dal lato client e invierò JSON. Questo è anche più scalabile dal momento che il lato server fa meno lavoro.

1

Dato che non ti preoccupare del carico sul lato server e risparmi i cicli della CPU, vai avanti e lascia che il backend faccia il grosso del lavoro. L'applicazione sarà più veloce e risponderà più velocemente. Devi tenere a mente l'utilizzo della rete, tuttavia. Lanciare le stringhe JSON avanti e indietro è estremamente efficiente e riduce il carico di rete, ma richiede al cliente di fare più lavoro. Come affermato in questa discussione, i browser sono estremamente veloci in questi giorni. Le implementazioni di JavaScript in Chrome, FF4 e IE9 sono tra le più veloci che abbiamo mai visto.

Il mio suggerimento è di fare un piccolo punto di riferimento con la vostra domanda così com'è, e vedere come si comporta. Prova a colpire le due varianti con molte richieste per vedere le cose sotto carico. Dipenderà veramente dalla tua particolare applicazione.

+0

Un piccolo benchmark, ad es. crea due script, uno che costruirà la lista usando javascript, un altro che aggiungerà semplicemente i dettagli di contatto richiesti. Potrebbe fare, quanti cicli diresti come un punto di riferimento sicuro? – Hailwood