2011-02-07 16 views
9

मैंजावास्क्रिप्ट का उपयोग कर एचटीएमएल या एचटीएमएल का निर्माण?

मूल 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 बार

मेरा प्रश्न है।

अधिक फायदेमंद क्या है:

  1. मार्कअप सर्वर साइड बनाएँ, वास्तविक एचटीएमएल लौट आते हैं।
  2. जानकारी के साथ जेसन डेटा लौटें और सूची क्लाइंट पक्ष बनाएं।


इस चर्चा के प्रयोजन के लिए हमें कुछ स्थिरांक

  • सर्वर लोड कोई मुद्दा नहीं है मान लें
  • दिए गए डेटा के लिए है (हम एक उच्च प्रदर्शन सर्वर का उपयोग कर रहे हैं) केवल प्रदर्शन उद्देश्यों (मैनिपुलेट नहीं किया जाना चाहिए)
  • हम जावास्क्रिप्ट सक्षम किए बिना उपयोगकर्ताओं में फैक्टरिंग नहीं कर रहे हैं।
  • हम किसी भी ब्राउज़र में बाँटे नहीं कर रहे हैं < इंटरनेट एक्सप्लोरर 7

उत्तर

8

वेब विकास के दौरान अधिकांश बार, आपको यह तय करना होगा कि आपके लिए और क्या महत्वपूर्ण है।

यदि आप प्रदर्शन के बाद ही हैं, तो इससे कोई फर्क नहीं पड़ता कि, यह आपके सर्वर पर सभी रेंडर एक्शन करने और बस HTML कोड देने के लिए तेज़ है। लेकिन बदले में, ज्यादातर बार लचीलापन प्लस खर्च होता है, आपको तार पर अधिक ट्रैफिक मिल गया है।

दूसरी ओर, उदाहरण के लिए जेएसओएन डेटा भेजना और क्लाइंट पर रेंडर सामान करना, तार पर बहुत कम यातायात है, लेकिन यह क्लाइंटसाइड पर अधिक CPU लोड है। ब्राउज़र्स (डीओएम + ईसीएमएस्क्रिप्ट) ने पिछले वर्षों और महीनों में बहुत अधिक प्रदर्शन बढ़ाया है, इसलिए यह बहुत सारे अनुप्रयोग हैं।

लेकिन यह कहानी का अंत नहीं है। JSON अनुकूलित है, लेकिन अत्यधिक अनुकूलित नहीं है। फिर यदि आप प्रदर्शन के बाद वास्तव में हैं तो आपको डेटा का अपना परिवहन बनाना होगा।उदाहरण के लिए

|box1|item1|item2 

कम कोड तो JSON अंकन

'{"box1": ["item1", "item2"]}' 
निश्चित रूप से

यह वह जगह है अति विशिष्ट है, लेकिन यह यातायात के बहुत से बचाता है अगर हम वास्तव में बड़ी जा रहे हैं। मैं निकोलस सी जाकास द्वारा पुस्तक को उच्च प्रदर्शन जावास्क्रिप्ट की अनुशंसा करता हूं। इस विषय के बारे में उत्कृष्ट किताब।

+0

+1 एक प्रदर्शन परिप्रेक्ष्य से महान जवाब। मैं यह भी जोड़ना चाहता हूं कि एचटीएमएल और जेएसओएन के बीच का निर्णय यह भी निर्भर करता है कि डेटा स्थिर और विशुद्ध रूप से प्रदर्शन उद्देश्यों के लिए है या फिर आप इसे बाद में कुशल बनाना चाहते हैं या नहीं। –

1

मैं कहेंगे इसे सर्वर साइड .... जे एस ...

+0

क्या आप प्रारंभिक पृष्ठ लोड समय का जिक्र कर रहे हैं? जावास्क्रिप्ट डाउनलोड करने के संबंध में। अधिकांश उच्च प्रदर्शन वेब अनुप्रयोग कंप्रेसर का उपयोग करते हैं, यह कैशिंग और उच्च इंटरनेट गति के साथ मिलकर इन दिनों लगभग पूरी तरह से इसे एक कारक के रूप में अस्वीकार करता है। – Hailwood

+0

उहम। हां आप ठीक हैं। जब मैं अपने जवाब पर पुनर्विचार करता हूं, तो मुझे ^^ –

2

निजी तौर पर अपने पृष्ठ लोडिंग समय बढ़ सकता है के रूप में , मैं इसे सर्वर की तरफ बनाउंगा और एचटीएमएल वापस कर दूंगा। सबसे बड़ा कारण यह है कि अन्यथा आपकी साइट किसी भी व्यक्ति के लिए बेकार है जिसने जावास्क्रिप्ट अक्षम किया है। यह खोज इंजनों के लिए काफी हद तक अदृश्य भी होगा।

+0

बंद करना चाहिए था, मुझे यह महसूस हो रहा है कि यह सब गतिशील रूप से लोड हो गया है। –

+0

@ बॉक्स 9 आप सही हैं।इसके अलावा, अगर किसी खोज इंजन को इस पृष्ठ पर पहली जगह मिल गई तो मैं बदतर हो जाऊंगा! – Hailwood

+0

@ बॉक्स 9 और @ हैलवुड - दोनों अच्छे अंक हैं, इसलिए मेरे कारण शायद लागू नहीं होते हैं, लेकिन मैं यहां भी उत्तर छोड़ दूंगा क्योंकि यह अधिक सामान्य स्थिति पर लागू हो सकता है (भले ही आपकी स्थिति के लिए विशेष रूप से नहीं) –

1

पेज लोडिंग समय मेरे निर्णय में कारक नहीं होगा अगर मैं आप थे। मैं सोचूंगा कि इसे बनाए रखना कितना आसान होगा। मुझे लगता है कि इसे सर्वरसाइड करना चीजों को बहुत आसान बना देगा। अपने जावास्क्रिप्ट के लिए पार्स करने के लिए टेम्पलेट्स की आवश्यकता नहीं है।

3

यदि आप गहन AJAX कार्यों को करने की योजना बना रहे हैं, जैसे नए रिकॉर्ड जोड़ना, उन्हें फ्लाई पर संपादित करना आदि, तो मैं आपको एक खाली पृष्ठ लोड करने का सुझाव देता हूं, जो एक स्क्रिप्ट को कॉल करता है जो शब्दकोशों की एक सरणी देता है JSON, और उसके बाद हाल ही में jQuery में लागू Template (बीटा) सिस्टम का उपयोग कर, या एक स्वयं को कार्यान्वित करें, जिसमें छुपा तत्व है, कक्षाओं के साथ टैग किए गए स्पैन/divs/tds के साथ, और क्लोनिंग और प्रत्येक बार एक नया रिकॉर्ड आने पर इसे भरना।

दूसरी तरफ, यदि आप इस स्थिर को रखने जा रहे हैं, तो बस HTML का उपयोग करें।

इस प्रकार मैं templating का प्रबंधन करता हूं। यह एक प्रभावी तरीका है क्योंकि डीओएम तत्व डीओएम पेड़ में मौजूद हैं, और तत्वों को शामिल करने वाली स्ट्रिंग को पार्स करने से क्लोनिंग कम महंगी होती है।

<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

लिंक जो डीओएम में तत्व जोड़ने के कुशल तरीकों का आगे वर्णन करता है http://dev.opera.com/articles/view/efficient-javascript/?page=3 – subhaze

1

ऐसा लगता है कि आप एक तकनीकी प्रश्न के विशिष्ट उत्तर नहीं, बल्कि एक राय मांग रहे हैं। तो मेरी राय यहाँ है।

इन दिनों प्रवृत्ति वेब अनुप्रयोगों की ओर है, और अधिक क्लाइंट-साइड कार्यक्षमता और ऑफ़लाइन कार्यक्षमता के साथ। इसलिए, मैं इसे क्लाइंट साइड करता हूं और जेएसओएन भेजता हूं। यह भी अधिक स्केलेबल है क्योंकि सर्वर की तरफ कम काम करता है।

1

चूंकि आप सर्वर-साइड लोड के बारे में चिंतित नहीं हैं और CPU चक्रों को छोड़ने के लिए, आगे बढ़ें और अपने बैकएंड को काम का बड़ा हिस्सा दें। आवेदन स्नैपियर होगा और तेजी से प्रतिक्रिया देगा। हालांकि, आपको नेटवर्क उपयोग को ध्यान में रखना होगा। जेएसओएन तारों को आगे और पीछे फेंकना बेहद कुशल है और नेटवर्क लोड को कम करता है, लेकिन क्लाइंट को और अधिक काम करने की आवश्यकता होती है। जैसा कि इस चर्चा में कहा गया है, ब्राउज़र इन दिनों बेहद तेज़ हैं। क्रोम, एफएफ 4 और आईई 9 में जावास्क्रिप्ट कार्यान्वयन कुछ सबसे तेज़ हैं जिन्हें हमने कभी देखा है।

मेरा सुझाव है कि आपके आवेदन के साथ एक छोटा बेंचमार्क करना है, और देखें कि यह कैसा प्रदर्शन करता है। लोड के तहत चीजों को देखने के लिए कई अनुरोधों के साथ दो प्रकारों को हिट करने का प्रयास करें। यह वास्तव में आपके विशेष आवेदन पर निर्भर करेगा।

+0

एक छोटा बेंचमार्क, उदा। दो स्क्रिप्ट बनाएं, एक जो जावास्क्रिप्ट का उपयोग करके सूची का निर्माण करेगा, दूसरा जो केवल आवश्यक संपर्क विवरण जोड़ देगा। क्या कर सकता है, आप एक सुरक्षित बेंचमार्क के रूप में कितने चक्र कहेंगे? – Hailwood

संबंधित मुद्दे