2012-09-02 16 views
74

यह वेब लोगों के लिए एक बेवकूफ सवाल हो सकता है। लेकिन मैं इस पर थोड़ा उलझन में हूँ। अब, मेरे पास एक एप्लीकेशन है जहां मैं विभिन्न कार्यों को करने के लिए कुछ जावास्क्रिप्ट फ़ाइलों का उपयोग कर रहा हूं। अब, मैं सभी फ़ाइलों को गठबंधन और छोटा करने के लिए जावास्क्रिप्ट bundler का उपयोग कर रहा हूं। तो, रनटाइम पर केवल एक app.min.js फ़ाइल होगी। अब, Requirejs का उपयोग रनटाइम पर मॉड्यूल या फ़ाइलों को लोड करने के लिए किया जाता है। तो, सवाल यह है कि यदि मेरे पास पहले से ही एक ही फाइल में सभी चीजें हैं, तो क्या मुझे आवश्यकताएं चाहिए? या उपयोग केस परिदृश्य क्या है जहां मैं requjs और/या बंडलर का उपयोग कर सकता हूं?आवश्यकताएँ का उपयोग कब करें और बंडल जावास्क्रिप्ट का उपयोग कब करें?

यदि कोई और विवरण आवश्यक है तो कृपया मुझे बताएं।

+1

मुझे नहीं लगता कि आपको दोनों की आवश्यकता क्यों होगी। क्या आपको लगता है कि आप करेंगे? – nnnnnn

+2

यह एक भ्रम है। कब उपयोग करें? या बस एक लेने की जरूरत है? – kunjee

उत्तर

27

यह कई कुशल जावास्क्रिप्ट डेवलपर्स के बीच एक गर्म प्रतिस्पर्धात्मक मुद्दा है। कई अन्य भाषाओं में "संकलन" चरण होता है जहां पूरे कार्यक्रम को तैनाती के लिए बंडल किया जाता है (जेबॉस की .WAR फाइलें ध्यान में आती हैं)। प्रोग्रामर जो अधिक पारंपरिक पृष्ठभूमि से आते हैं अक्सर इस दृष्टिकोण का पक्ष लेते हैं।

जावास्क्रिप्ट ने हाल के वर्षों में इस तरह की वृद्धि देखी है कि सटीक सर्वोत्तम प्रथाओं को चार्ट करना मुश्किल है, लेकिन जो जावास्क्रिप्ट की अधिक कार्यात्मक प्रकृति की सराहना करते हैं वे अक्सर मॉड्यूल लोडिंग दृष्टिकोण (जैसे require.js उपयोग) पसंद करते हैं।

मैंने Frame.js लिखा जो requ.js की तरह बहुत काम करता है, इसलिए मेरी पूर्वाग्रह मॉड्यूल लोडर दृष्टिकोण की ओर है।

सीधे अपने प्रश्न का उत्तर देने के लिए, हाँ, यह एक या दूसरे है।

जो आपकी स्क्रिप्ट को एक फ़ाइल में पैक करने के लिए बहस करते हैं, उनका मानना ​​है कि यह अधिक संपीड़न को सक्षम बनाता है और इस प्रकार यह अधिक कुशल होता है। मेरा मानना ​​है कि पैकेजिंग के दक्षता फायदे ज्यादातर मामलों में नगण्य हैं क्योंकि: (1) मॉड्यूल लोड समय पूरे सत्र में वितरित किए जाते हैं, (2) व्यक्तिगत मॉड्यूल लगभग उसी प्रतिशत तक संपीड़ित किया जा सकता है, (3) व्यक्तिगत मॉड्यूल द्वारा कैश किया जा सकता है सर्वर और राउटर अलग से, और (4) केवल स्क्रिप्ट लोड होने पर ही लोड हो जाते हैं अंततः आप कुछ उपयोगकर्ताओं के लिए कम कोड लोड करते हैं और समग्र रूप से अधिक कोड लोड करते हैं।

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

+5

जबकि मैं फ़ाइलों को अलग से रखने के लाभों को समझता हूं, मुझे लगता है कि बंडलिंग आवश्यक HTTP कनेक्शन की संख्या को भी कम कर देता है। चूंकि ब्राउज़र और सर्वर में पाइपलाइनिंग अधिक व्यापक रूप से उपलब्ध हो जाती है, इससे कम मायने रखता है, लेकिन वर्तमान में यह एक बहुत बड़ा सौदा है। –

+4

यदि ऐप बड़ा है तो http कनेक्शन ओवरहेड जल्दी से माउंट कर सकता है। हमारे ऐप के लिए, जब हम इसे अनपॅक किए गए मोड में चलाते हैं और प्रत्येक जेएस फ़ाइल को व्यक्तिगत रूप से लोड करते हैं, तो पृष्ठ को लोड करने में लगभग 15-30 सेकंड लगते हैं। पैक मोड में यह लगभग एक सेकंड है। –

+0

एक पैक, कैश की गई फ़ाइल दर्जनों या सैकड़ों फाइलों को लाने से स्पष्ट रूप से बहुत तेज़ है, जिसे आप वास्तव में कभी भी लोड नहीं कर सकते थे, या उन्हें लोड करने में कितना समय लगता है। इसलिए ग्राहक पर सब कुछ डंप करना बेहतर है। ज्यादातर मामलों में यह एकल फ़ाइल 1 एमबी आकार को किसी भी तरह से पारित नहीं करने जा रही है, संभवतः न्यूनतम और gzipped होने के बाद बहुत कम है। तो, एकल फ़ाइल एफटीडब्ल्यू। – vsync

46

आम तौर पर आप केवल विकास के दौरान अपने लोडिंग फॉर्म में RequJS का उपयोग करते हैं। एक बार साइट पूरी हो जाने और तैनाती के लिए तैयार हो जाने पर, आप कोड को छोटा कर देते हैं। यहां लाभ यह है कि RequJS जानता है कि आपकी निर्भरता वास्तव में क्या है, और इस प्रकार कोड को सही क्रम में आसानी से छोटा कर सकता है। यहां बताया गया है यह RequireJS website पर कहते है:

एक बार जब आप विकास कर समाप्त कर लें और अपने अंत उपयोगकर्ताओं के लिए अपने कोड को तैनात करना चाहते हैं, तो आप जावास्क्रिप्ट एक साथ फ़ाइलें गठबंधन और यह कम करें करने के लिए अनुकूलक का उपयोग कर सकते हैं। उपर्युक्त उदाहरण में, यह main.js और सहायक/util.js को एक फ़ाइल में जोड़ सकता है और परिणाम को कम कर सकता है।

+4

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैं पूरी तरह से ठोकर खाई क्योंकि मुझे इसी तरह के संदेह थे। तो, एक फॉलोअप प्रश्न, यदि आपको कोई फर्क नहीं पड़ता - अगर हम अंततः तैनाती के लिए सब कुछ एक फ़ाइल में बंडल करते हैं तो मेरा पूरा एप्लिकेशन टुकड़े टुकड़े (मांग पर) के बजाय एक शॉट में लोड होता है। एएमडी के लिए यह विरोधाभासी नहीं है? –

+5

हां यह एक अर्थ में है। लेकिन एएमडी अधिक सैद्धांतिक है, जहां requjs असली दुनिया के प्रदर्शन के मुद्दों से भी चिंतित है। प्रत्येक मॉड्यूल को अलग-अलग लोड करना निश्चित रूप से क्लीनर और अधिक शुद्ध है, लेकिन हमेशा के लिए ले जाएगा :) –

+1

मैंने यह सवाल भी देखा है http://stackoverflow.com/questions/20515679/requirejs-to-bundle-or-not-to- बंडल/20518314? noredirect = 1 # 20518314। शायद दो दृष्टिकोणों के बीच एक मध्य बिंदु? –

11

यह आपके आवेदन पर निर्भर करता है। यदि आप केवल मामूली जावास्क्रिप्ट (100kb से कम minified) के साथ सर्वर-साइड ऐप बना रहे हैं तो कुल बंडलिंग के लिए जाएं, तो आप शायद ठीक होने जा रहे हैं।

लेकिन यदि आप जावास्क्रिप्ट ऐप बना रहे हैं और इसमें एक टन कोड है, तो आपकी ज़रूरतें अलग-अलग होंगी।

उदाहरण के लिए, मेरे ऐप में मैं सभी कोर फाइलों को बंडल करता हूं। JQuery, अंडरस्कोर, रीढ़ की हड्डी, मेरी मुख्य ऐप फ़ाइलें, मेरा उपयोगकर्ता लॉगिन सिस्टम, मेरा लेआउट सिस्टम, मेरी सूचनाएं और चैट सिस्टम है, सभी मेरी बड़ी प्रारंभिक फ़ाइल का हिस्सा हैं।

लेकिन मेरे पास कई अन्य मॉड्यूल भी हैं जो प्रारंभिक बंडल का हिस्सा नहीं हैं, जो उनके बाद लोड होते हैं।

फ़ोरम, विकी, wysiwyg, रंग पिकर, ड्रैग/ड्रॉप, कैलेंडर, और कुछ एनीमेशन फ़ाइलें दूसरी श्रेणी का हिस्सा हैं। आपको आमतौर पर उपयोग किए जाने वाले कार्यों के बारे में उचित निर्णय लेने की आवश्यकता होती है और तुरंत देरी की आवश्यकता होती है।

यदि मैं तुरंत सब कुछ शामिल करता हूं तो मैं जावास्क्रिप्ट के एक मेगापिक्सल से ऊपर हो सकता हूं, जो पागल हो जाएगा और प्रारंभिक बूट को अस्वीकार्य रूप से धीमा कर देगा।

दूसरी श्रेणी initSuccess घटना प्रारंभिक फ़ाइल से आग के बाद डाउनलोड करना शुरू कर देती है।

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