2012-06-11 19 views
37

हम विकास के दौरान RequJS और AMD से प्यार करते हैं, जहां हम एक मॉड्यूल संपादित कर सकते हैं, हमारे ब्राउज़र में पुनः लोड कर सकते हैं, और परिणाम तुरंत देख सकते हैं। लेकिन जब हमारे मॉड्यूल को उत्पादन परिनियोजन के लिए एक फ़ाइल में संयोजित करने का समय आता है, तो जाहिर है कि एक एएमडी लोडर अभी भी मौजूद है, चाहे वह लोडर आवश्यक है या उसके छोटे साथी "बादाम" जैसा कि यहां बताया गया है:समेकित RequJS एएमडी मॉड्यूल को लोडर की आवश्यकता क्यों है?

http://requirejs.org/docs/faq-optimization.html#wrap

मेरा भ्रम है: लोडर क्यों आवश्यक है? जब तक आपके पास बहुत ही असामान्य परिस्थितियां न हों जो आपके मॉड्यूल के अंदर require() कॉल करने के लिए आवश्यक बनाती हैं, तो ऐसा लगता है कि एएमडी मॉड्यूल की एक श्रृंखला लोडर उपस्थिति के बिना समेकित की जा सकती है। सबसे आसान संभव उदाहरण निम्नलिखित की तरह मॉड्यूल की एक जोड़ी होगी।

ModA.js:

define([], function() { 
    return {a: 1}; 
}); 

ModB.js:

define(['ModA'], function(A) { 
    return {b : 2}; 
}); 

इन दो मॉड्यूल को देखते हुए ऐसा लगता है कि एक concatenator बस निम्न पाठ बोझ नहीं उत्पादन सर्वर उत्पादन कर सकता है, और या अतिरिक्त बैंडविड्थ या कंप्यूशन के साथ ब्राउज़र या तो RequJS या बादाम द्वारा आवश्यक है।

मैं एक concatenator कि पैदा करता है की कल्पना (और मैं उपयोग कर रहा हूँ शेवरॉन-उद्धरण «,» दिखाने के लिए जहां दो मॉड्यूल के स्निपेट के ऊपर सम्मिलित किया गया है):

यह अब तक के रूप में मैं कर सकते हैं देखें, कम से कम बाहरी गोंद जावास्क्रिप्ट के साथ, एएमडी के अर्थशास्त्र को सही ढंग से पुन: उत्पन्न करेगा। क्या ऐसा कोई संयोजक उपलब्ध है? यदि नहीं, तो क्या मैं यह सोचने के लिए मूर्ख बनूंगा कि मुझे एक लिखना चाहिए - क्या वास्तव में बहुत कम कोड बेस हैं जिनमें define() के साथ लिखे गए सरल और साफ मॉड्यूल शामिल हैं और जिन्हें कभी भी require() कॉल की आवश्यकता नहीं है जो बाद में कोड के एसिंक्रोनस फ़ेच को लातें?

+1

आपने इस समस्या को कैसे हल किया? मैंने पाया कि बादाम का उपयोग करके, न्यूनतम फ़ाइल 3k से अधिक है तो समेकित फ़ाइल (9 के बनाम 6 के)। – Naor

उत्तर

14

एक एएमडी ऑप्टिमाइज़र के पास डाउनलोड होने वाली फ़ाइलों की संख्या से अधिक अनुकूलित करने का दायरा है, यह स्मृति में लोड मॉड्यूल की संख्या को भी अनुकूलित कर सकता है।

उदाहरण के लिए, यदि आपके पास 10 मॉड्यूल हैं और उन्हें 1 फ़ाइल में अनुकूलित कर सकते हैं, तो आपने स्वयं को 9 डाउनलोड सहेजे हैं।

यदि पृष्ठ 1 सभी 10 मॉड्यूल का उपयोग करता है तो यह बहुत अच्छा है। लेकिन क्या होगा यदि पेज 2 केवल 1 का उपयोग करता है? एक मॉड्यूल require 'डी तक एक एएमडी लोडर' फैक्ट्री फ़ंक्शन 'के निष्पादन में देरी कर सकता है। इसलिए, पृष्ठ 2 निष्पादित करने के लिए केवल एक 'फैक्ट्री फ़ंक्शन' ट्रिगर करता है।

यदि प्रत्येक मॉड्यूल require 'डी होने पर 100kb स्मृति का उपभोग करता है, तो एक एएमडी फ्रेमवर्क जिसमें रनटाइम ऑप्टिमाइज़ेशन है, हमें पेज 2 पर 900kb स्मृति भी बचाएगा।

इसका एक उदाहरण 'बॉक्स के बारे में' शैली संवाद हो सकता है। जहां इसका बहुत ही निष्पादन आखिरी सेकंड तक देरी हो रही है क्योंकि इसे 99% मामलों में उपयोग नहीं किया जाएगा। जैसे (ढीला jQuery वाक्य रचना में):

aboutBoxBtn.click(function() { 
    require(['aboutBox'], function (aboutBox) { 
     aboutBox.show(); 
    } 
}); 

आप जे एस वस्तुओं और 'बॉक्स के बारे में' के साथ डोम संबद्ध बनाने की कीमत को बचाने जब तक आप यकीन है कि यह आवश्यक है कर रहे हैं।

अधिक जानकारी के लिए, इस पर आवश्यकता के लिए Delay executing defines until first require देखें।

+1

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

+0

मेमोरी उपयोग के बारे में आपका उदाहरण अक्सर I/O ओवरहेड द्वारा भ्रमित किया जाता है - ऐसा लगता है कि बॉक्स के बारे में ऐसा कुछ ऐसा लगता है जैसे यह पहले लोड करने के लिए एक जीत होगी, लेकिन शुरुआत को स्थगित कर देगा ताकि आप बड़ी इंटरैक्टिव विलंबता हिट के बिना मेमोरी और सेटअप को सहेज सकें। –

+0

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

1

एकमात्र असली लाभ यह है कि यदि आप अनुभागों में मॉड्यूल का उपयोग करते हैं तो मॉड्यूल को स्वतंत्र रूप से कैश करने का लाभ होता है।

0

यदि आप उत्पादन के लिए एक बड़ी फ़ाइल में requ.js के साथ कोड संकलित करते हैं, तो आप पूरी तरह से आवश्यकता को बदलने के लिए almond.js का उपयोग कर सकते हैं।

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

सावधान रहो के restrictions बादाम आदेश

0

काम करने में लगाता है कोई कारण नहीं है वहाँ इस तरह के एक प्रस्ताव के रूप में एक निर्माण उपकरण हो नहीं सकता है।

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

मुझे विश्वास है कि ऑप्टिमाइज़र में स्वचालित रूप से अंतर्निहित (या बादाम) को निर्मित फ़ाइल में शामिल करने की सुविधा है, ताकि आपको केवल एक डाउनलोड होना पड़े। यह आपके इच्छित उपकरण के आउटपुट से बड़ा होगा, लेकिन अन्यथा वही।

अगर वहाँ एक निर्माण उपकरण है जो उत्पादन आप के लिए पूछ रहे हैं की तरह का उत्पादन किया गया था, यह तुल्यकालिक require, संगतता वापसी के बजाय exports का उपयोग करते हैं, और किसी भी अन्य CommonJS के मामले में, और अधिक सावधान रहना करने के लिए होगा विशेषताएं।

* यह कुछ साल पहले था। 2010, मुझे लगता है।

** लेकिन अभी यह प्रतीत नहीं होता है।

1

मुझे वही ज़रूरत थी, इसलिए मैंने उस उद्देश्य के लिए एक सरल एएमडी "कंपाइलर" बनाया जो बस यही करता है। आप इसे https://github.com/amitayh/amd-compiler

पर ध्यान दें, कृपया ध्यान दें कि इसमें कई सुविधाएं गायब हैं, लेकिन यह नौकरी (कम से कम मेरे लिए) है। कोडबेस में योगदान करने के लिए स्वतंत्र महसूस करें।

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