2013-06-11 8 views
33

मेरे पास RequJS का उपयोग करके साइट पर एकाधिक पृष्ठ हैं, और अधिकांश पृष्ठों में अद्वितीय कार्यक्षमता है। वे सभी सामान्य मॉड्यूल (jQuery, बैकबोन, और अधिक) साझा करते हैं; उनमें से सभी के पास अपने स्वयं के अद्वितीय मॉड्यूल भी हैं। मैं सोच रहा हूं कि r.js का उपयोग करके इस कोड को अनुकूलित करने का सबसे अच्छा तरीका क्या है। मैं आवश्यकताजेएस और बादाम के दस्तावेज और उदाहरणों के विभिन्न हिस्सों द्वारा सुझाए गए कई विकल्पों को देखता हूं - इसलिए मैं उन संभावनाओं की निम्नलिखित सूची के साथ आया हूं जो मैं देखता हूं, और मैं पूछ रहा हूं कि कौन सी सबसे अधिक अनुशंसा की जाती है (या यदि कोई और बेहतर तरीका है) :अधिक कुशल मल्टीपाज RequJS और बादाम सेटअप

  1. अनुकूलन पूरी साइट के लिए एक एकल जे एस फ़ाइल, Almond का उपयोग कर, जो एक बार लोड और फिर कैश की गई रहें। इस सबसे सरल दृष्टिकोण का नकारात्मक पक्ष यह है कि मैं प्रत्येक पृष्ठ कोड पर लोड हो रहा हूं जिसे उपयोगकर्ता को उस पृष्ठ की आवश्यकता नहीं है (यानी अन्य पृष्ठों के लिए विशिष्ट मॉड्यूल)। प्रत्येक पृष्ठ के लिए, लोड किया गया जेएस से बड़ा होगा होना चाहिए।
  2. प्रत्येक पृष्ठ के लिए एक एकल जेएस फ़ाइल अनुकूलित करें, जिसमें सामान्य और पृष्ठ-विशिष्ट मॉड्यूल दोनों शामिल होंगे। इस तरह से मैं प्रत्येक पृष्ठ की फ़ाइल में बादाम को शामिल कर सकता हूं और केवल प्रत्येक पृष्ठ पर एक जेएस फ़ाइल लोड करूंगा - जो पूरी साइट के लिए एक एकल जेएस फ़ाइल से काफी छोटा होगा। हालांकि, मुझे लगता है कि नकारात्मक मॉड्यूल ब्राउज़र में कैश नहीं किया जाएगा, है ना? प्रत्येक पृष्ठ के लिए उपयोगकर्ता जाता है कि उसे बड़ी संख्या में jQuery, बैकबोन, आदि (सामान्य मॉड्यूल) को फिर से डाउनलोड करना होगा, क्योंकि उन पुस्तकालयों में प्रत्येक अद्वितीय सिंगल-पेज जेएस फ़ाइल के बड़े हिस्से होंगे। (यह RequireJS multipage example का दृष्टिकोण प्रतीत होता है, सिवाय इसके कि उदाहरण बादाम का उपयोग नहीं करता है।)
  3. सामान्य मॉड्यूल के लिए एक जेएस फ़ाइल अनुकूलित करें, और फिर प्रत्येक विशिष्ट पृष्ठ के लिए एक और अनुकूलित करें। इस तरह उपयोगकर्ता सामान्य मॉड्यूल की फ़ाइल को कैश करेगा, और पृष्ठों के बीच ब्राउज़िंग, केवल एक छोटी पेज-विशिष्ट जेएस फ़ाइल लोड करना होगा। इस विकल्प के भीतर मैं इसे समाप्त करने के दो तरीके देखता हूं, RequJS कार्यक्षमता को शामिल करने के लिए: ए। data-main सिंटैक्स या सामान्य <script> टैग का उपयोग करके सभी पृष्ठों पर सामान्य मॉड्यूल से पहले फ़ाइल requ.js लोड करें - बादाम का उपयोग न करें। इसका मतलब है कि प्रत्येक पृष्ठ में तीन जेएस फाइलें होंगी: require.js, सामान्य मॉड्यूल, और पेज-विशिष्ट मॉड्यूल। बी। ऐसा लगता है कि this gist बादाम को प्रत्येक अनुकूलित फ़ाइल में प्लग करने के लिए एक विधि का सुझाव दे रहा है ---- इसलिए मुझे requ.js लोड नहीं करना पड़ेगा, लेकिन इसके बजाय मेरे सामान्य मॉड्यूल और मेरे पेज-विशिष्ट मॉड्यूल दोनों में बादाम शामिल होगा। क्या वह सही है? क्या यह requ.js को आगे लोड करने से अधिक कुशल है?

किसी भी सलाह के लिए धन्यवाद जो आप इसे बाहर ले जाने के सर्वोत्तम तरीके के रूप में पेश कर सकते हैं।

उत्तर

34

मुझे लगता है कि आपने अपने स्वयं के प्रश्न का स्पष्ट रूप से उत्तर दिया है।

उत्पादन के लिए, हम करते हैं - साथ ही साथ अधिकांश कंपनियां मैंने विकल्प 3 के साथ काम किया है।

यहाँ समाधान 3 के फायदे हैं, और यही कारण है कि मुझे लगता है कि आप इसे उपयोग करना चाहिए:

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

    • आप प्रत्येक पृष्ठ के लिए कम से कम डेटा भेजने:

    यहाँ समाधान 2 के लिए एक दिलचस्प फायदा है। यदि आपके बहुत से आगंतुक एक समय हैं, उदाहरण के लिए लैंडिंग पृष्ठ में - यह आपकी सबसे अच्छी शर्त है। रूपांतरण उन्मुख परिदृश्यों में लोडिंग समय को महत्व में अतिसंवेदनशील नहीं किया जा सकता है।

  • क्या आपके आगंतुक दोहराते हैं? some studies सुझाव देता है कि 40% आगंतुक खाली कैश के साथ आते हैं।

अन्य विचार:

  • तो अपने दर्शकों के सबसे एक ही पृष्ठ पर जाएँ - पर विचार विकल्प 2 विकल्प 3 साइटों जहाँ औसत उपयोगकर्ताओं को एकाधिक पृष्ठों पर जाने के लिए अच्छा है, लेकिन अगर उपयोगकर्ता का दौरा एक पृष्ठ और वह सब कुछ देखता है - यह आपकी सबसे अच्छी शर्त है।

  • यदि आपके पास जावास्क्रिप्ट का बहुत है। उपयोगकर्ता दृश्य संकेत देने के लिए इसमें से कुछ को लोड करने पर विचार करें, और फिर बाकी को एक असुरक्षित तरीके से असीमित रूप से लोड करें (स्क्रिप्ट टैग इंजेक्शन के साथ, या यदि आप इसे पहले से उपयोग कर रहे हैं तो सीधे आवश्यकता के साथ)। यूआई में कुछ 'ध्यान देने योग्य' लोगों को देखने के लिए सीमा सामान्यतः लगभग 100 मिमी है। इसका एक उदाहरण जीमेल की 'लोडिंग ...' है।

  • यह देखते हुए कि HTTP कनेक्शन Keep-Alive HTTP/1.1 में डिफ़ॉल्ट रूप से या HTTP/1.0 में अतिरिक्त शीर्षलेख के साथ, कई फाइलें भेजना 5-10 साल पहले की तुलना में कम समस्या है। सुनिश्चित करें कि आप HTTP/1.0 क्लाइंट के लिए अपने सर्वर से Keep-Alive शीर्षलेख भेज रहे हैं।

कुछ सामान्य सलाह और पठनीय सामग्री:

  • JavaScript minification बहुत जरूरी है, इस अच्छी तरह से करता है, उदाहरण के लिए r.js और का उपयोग करने में अपने विचार प्रक्रिया यह सही था। r.js भी combines जावास्क्रिप्ट जो सही दिशा में एक कदम है।
  • जैसा कि मैंने सुझाव दिया, defering जावास्क्रिप्ट वास्तव में भी महत्वपूर्ण है, और लोडिंग समय में काफी सुधार कर सकता है।निष्पादन निष्पादन आपके लोडिंग समय देखें बहुत महत्वपूर्ण है, वास्तव में तेजी से लोड होने से कुछ परिदृश्यों में बहुत महत्वपूर्ण है।
  • कुछ भी सीडीएन से लोड हो सकता है जैसे बाहरी संसाधनों जैसे एक सीडीएन से लोड होना चाहिए। आजकल कुछ लाइब्रेरी लोग जो jQuery का उपयोग करते हैं, वे बहुत बोली (80 केबी) हैं, उन्हें कैश से लाने से आपको वास्तव में फायदा हो सकता है। आपके उदाहरण में, मैं आपकी साइट से बैकबोन, अंडरस्कोर और jQuery लोड करता हूं, बल्कि, मैं उन्हें एक सीडीएन से लोड करता हूं।
+1

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

+0

http://stackoverflow.com/questions/2180391/why-should-i-use-googles-cdn-for-jquery http://www.sitepoint.com/7-reasons-to-use-a-cdn/ http://www.johnchow.com/how-to-use-a-content-delivery-network-cdn-to-make-your-blog-load-much-faster/। यदि यह आपकी समस्या हल करता है, तो कृपया इसे स्वीकार करने पर विचार करें। –

+0

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

1

FYI करें, मैं विकल्प 3 उपयोग करने के लिए, https://github.com/requirejs/example-multipage-shim

में उदाहरण मुझे यकीन है कि क्या यह सबसे कारगर है नहीं कर रहा हूँ निम्नलिखित पसंद करते हैं।

  • केवल require.config r.js अनुकूलन के दौरान (एक ही स्थान पर विभिन्न पुस्तकालयों पर) कॉन्फ़िगर करने
  • , तो जो मॉड्यूल हैं तय की जरूरत है:

    हालांकि, मैं यह convienient क्योंकि लगता है सामान्य

14

मैंने इन 3 प्रकार के अनुकूलन को प्रदर्शित करने के लिए उदाहरण भंडार बनाया।

यह r.js का उपयोग करने के तरीके के बारे में बेहतर समझने में हमारी सहायता कर सकता है।

https://github.com/cloudchen/requirejs-bundle-examples

0

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

  1. यह सबसे तार्किक है।
  2. यह सबसे कैशिंग का उपयोग करता है, सभी सामान्य कार्यक्षमता एक बार लोड हो जाती है। कम से कम यातायात लेना और एकाधिक पृष्ठों को सर्फ करते समय सबसे तेज़ लोडिंग समय उत्पन्न करना। एकाधिक पृष्ठों के लोड होने का समय महत्वपूर्ण है और जब आप लोड कर रहे अन्य संसाधनों की तुलना में आपकी तरफ यातायात महत्वपूर्ण नहीं हो सकता है, तो ग्राहक वास्तव में तेज़ लोड समय की सराहना करेंगे।

मैंने इसके लिए बहुत बेहतर विकल्प सूचीबद्ध किए हैं।

0

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

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