यहाँ एक और अधिक ठोस उदाहरण है।
मैं 60 फाइलों के साथ एक परियोजना में काम कर रहा हूं। हमारे पास इसे चलाने के 2 अलग-अलग तरीके हैं।
एक बड़े संस्करण को लोड करें, 1 बड़ी फ़ाइल। (उत्पादन)
सभी 60 फाइलें लोड करें (विकास)
हम एक लोडर का उपयोग कर रहे हैं, इसलिए हमारे पास वेबपृष्ठ में केवल एक स्क्रिप्ट है
<script src="loader.js"></script>
वह मोड # 1 में डिफॉल्ट करता है (एक बड़ी कॉन्टेनेटेड फाइल को लोड करता है)। मोड # 2 (अलग फ़ाइलों) को चलाने के लिए हम कुछ ध्वज सेट करते हैं। यह कुछ भी हो सकता है। क्वेरी स्ट्रिंग में एक कुंजी। इस उदाहरण में हम बस यही करते हैं
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.js कुछ इस तरह दिखता है
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
बिल्ड स्क्रिप्ट सिर्फ एक .sh फाइल है जो इस तरह दिखती है
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
आदि...
यदि कोई नई फ़ाइल जोड़ी जाती है, तो हम संभवतः मोड # 2 का उपयोग करेंगे क्योंकि हम विकास कर रहे हैं हमें injectScript("somenewfile.js")
लोडर.जेएस में एक पंक्ति जोड़ना होगा
फिर बाद में उत्पादन के लिए हमें अपनी बिल्ड स्क्रिप्ट में somenewfile.js भी जोड़ना होगा। एक कदम हम अक्सर भूल जाते हैं और फिर त्रुटि संदेश प्राप्त करते हैं।
एएमडी पर स्विच करने से हमें 2 फ़ाइलों को संपादित करने की आवश्यकता नहीं है। लोडर.जेएस और सिंक में बिल्ड स्क्रिप्ट रखने की समस्या दूर हो जाती है। का उपयोग कर r.js
याwebpack
यह सिर्फ बनाने के लिए कोड पढ़ सकते हैंlarge-concantinated.js
यह निर्भरता से भी निपट सकता है, उदाहरण के लिए हमारे पास lib1.js और lib2.js इस तरह भरी हुई 2 फाइलें थीं
injectScript("lib1.js");
injectScript("lib2.js");
lib2 के लिए lib1 की आवश्यकता है। इसके अंदर कोड होता है जो कुछ ऐसा करता है
lib1Api.installPlugin(...);
लेकिन जैसे ही इंजेक्शन स्क्रिप्ट को अतुल्यकालिक रूप से लोड किया जाता है, कोई गारंटी नहीं है कि वे सही क्रम में लोड करेंगे। ये 2 स्क्रिप्ट एएमडी स्क्रिप्ट नहीं हैं, लेकिन आवश्यकता के अनुसार उपयोग कर रहे हैं। हम इसे अपनी निर्भरता बता सकते हैं
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
मैं हमारा मॉड्यूल है जो lib1 का उपयोग करता है हम यह करते हैं
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
अब आवश्यकता होती है। js हमारे लिए स्क्रिप्ट को इंजेक्ट करेंगे और यह lib2 को तब तक इंजेक्ट नहीं करेगा जब तक कि lib1 लोड नहीं हो जाता है क्योंकि हमने बताया था कि lib2 lib1 पर निर्भर करता है। यह भी हमारे मॉड्यूल को शुरू नहीं करेगा जो कि lib1 का उपयोग करता है जब तक कि lib2 और lib1 दोनों ने लोड नहीं किया है।
यह विकास को अच्छा बनाता है (कोई निर्माण कदम नहीं, लोडिंग ऑर्डर के बारे में कोई चिंता नहीं) और यह उत्पादन को अच्छा बनाता है (प्रत्येक स्क्रिप्ट के लिए बिल्ड स्क्रिप्ट को अपडेट करने की आवश्यकता नहीं है)।
एक अतिरिक्त बोनस के रूप में हम पुराने ब्राउज़रों के लिए कोड पर बेबल को चलाने के लिए वेबपैक के बैबल प्लगइन का उपयोग कर सकते हैं और फिर से हमें उस बिल्ड स्क्रिप्ट को बनाए रखने की आवश्यकता नहीं है।
ध्यान दें कि यदि क्रोम (हमारी पसंद का ब्राउज़र) ने समर्थन करना शुरू कर दिया है import
वास्तविक के लिए तो हम शायद विकास के लिए उस पर स्विच कर देंगे लेकिन यह वास्तव में कुछ भी नहीं बदलेगा। हम अभी भी एक संक्षिप्त फ़ाइल बनाने के लिए वेबपैक का उपयोग कर सकते हैं और हम इसे सभी ब्राउज़रों के लिए कोड पर बेबल चलाने में उपयोग कर सकते हैं।
यह सब स्क्रिप्ट टैग का उपयोग न करके और AMD का उपयोग करके प्राप्त किया जाता है