2012-01-11 10 views
5

मैं एएमडी और RequJS का उपयोग करके डोजो 1.6.1 से अपने प्रोजेक्ट को अपग्रेड कर रहा हूं। इसके नए एएमडी लोडर के साथ Dojo 1.7.1। मुझे पुरानी जावास्क्रिप्ट फाइलों से निपटना है, एएमडी मॉड्यूल के रूप में नहीं लिखा गया है, और उन्हें सही क्रम में लोड करना है।RequJS ऑर्डर प्लगइन और डोजो 1.7.1

इससे पहले कि मैंने RequJS ऑर्डर प्लगइन का उपयोग किया, लेकिन ऐसा लगता है कि यह डोजो एएमडी लोडर के साथ काम नहीं करता है। मुझे लोडर प्रलेखन या डोजो बिल्ड सिस्टम प्रलेखन में इसके बारे में कुछ भी नहीं मिला।

इस बारे में कोई विचार? अगर कोई ऑर्डर प्लगइन नहीं है, तो मुझे डोजो 1.7 के साथ सादे जावास्क्रिप्ट फ़ाइलों को एक साथ कैसे संभालना चाहिए? क्या मुझे उन्हें अलग से संभालने की ज़रूरत है, या लोडर या बिल्ड सिस्टम में इसके लिए कार्यक्षमता है?

+0

का उपयोग आप मॉड्यूल-कम फ़ाइलों या पुरानी शैली तुल्यकालिक मॉड्यूल के बारे में बात कर रहे हैं कर सकते हैं? – hugomg

+0

बस सामान्य जावास्क्रिप्ट फाइलें, जैसे कि jQuery (एएमडी मॉड्यूल के रूप में उपयोग नहीं किया जाता है), जो भी शैली हो सकती है। –

उत्तर

4

मैं सिर्फ अपने आप को इस के बारे में सीख रहा हूँ, लेकिन प्रलेखन मैंने पाया, डॉक्स में वर्णित के अनुसार अपने सामान्य स्क्रिप्ट लोड करते समय निर्दिष्ट करने Generic Script Injection

को संदर्भित करता है {async: 0} की आवश्यकता के लिए एक विन्यास विकल्प के रूप में() ।

require({async:0},['test1.js','test2.js','test3.js'],function(){ 
    //do stuff with reference to loaded scripts 

}); 

मेरे स्थानीय परीक्षण करता है, तो पता चलता है: यह, मेरी समझ के लिए, क्रम में है कि आप

मेरे उदाहरण (स्क्रिप्ट फ़ाइल नाम/पथ युक्त सरणी) दूसरा पैरामीटर में निर्दिष्ट में स्क्रिप्ट लोड करता है मैं कॉन्फ़िगरेशन को {async: 1} में बदलता हूं जो स्क्रिप्ट्स को मैंने जो निर्दिष्ट किया है, उसके लिए एक अलग क्रम में लोड होता है। अब तक मैंने इसे डोजो लोडर कोड में ट्रैक नहीं किया है, लेकिन ऐसा लगता है कि यह समझ में आता है, और काम करता है, और हैक नहीं है।

+0

मैं इस जवाब को स्वीकार कर रहा हूं, क्योंकि यह काम करता है! मैंने इस तरह एक "निर्भरता मॉड्यूल" बनाया है: 'परिभाषित करें (["आवश्यकताएँ"], फ़ंक्शन (आवश्यकताएं) {आवश्यकता ({async: 0}, ["script1.js", "script2.js", "script3.js" ]);}); '। मुझे लगता है कि यह एक अच्छा समाधान है। धन्यवाद! –

+0

हालांकि, एक चेतावनी। मैंने इसकी जांच नहीं की है, लेकिन ऐसा लगता है (कम से कम जब आप उपरोक्त वर्णित एक अलग मॉड्यूल में स्क्रिप्ट लोड करते हैं) स्क्रिप्ट एक पारंपरिक स्क्रिप्ट टैग के माध्यम से लोड होने की तुलना में एक अलग दायरे में लोड की जाती हैं। उदाहरण के लिए, मुझे 'var uglyGlobal = true' को' window.uglyGlobal = true' के साथ बदलना पड़ा। –

+0

'{async: 1} 'कॉन्फ़िगरेशन के लिए स्क्रिप्ट इंजेक्शन विधि डोम में एक इंजेक्शन'

2

मुझे नहीं लगता कि प्लगइन आम तौर पर एएमडी लोडर में संगत होते हैं। यह इष्टतम नहीं है, लेकिन आप शायद डोजो/टेक्स्ट का उपयोग कर सकते हैं! एक eval के साथ। इससे बिल्डटाइम पर सामग्री को रेखांकित किया जाएगा।

+0

क्या आपको इसका मतलब है? 'परिभाषित करें (["टेक्स्ट! myScript", "text! myScript2"], फ़ंक्शन (एस, एस 2) {eval (s); eval (s2)}) ' –

+0

यह काम करता है, और मैं इसे दोहा परीक्षण में उपयोग कर रहा हूं , लेकिन मैं इसे स्वीकार किए गए उत्तर के रूप में चिह्नित करने के लिए अनिच्छुक हूं, यह एक हैक =) –

3

मैं ऊपर दी गई टिप्पणियों में उल्लिखित इस तरह के निर्भरता मॉड्यूल के लिए एक और दृष्टिकोण प्रस्तावित करना चाहता हूं। समस्या यह है कि defineasync पैरामीटर को स्वीकार नहीं करता है। define फ़ंक्शन के अंदर एक साधारण require का उपयोग करना एक रेस स्थिति प्रस्तुत करता है क्योंकि आवश्यक मॉड्यूल का कोड अभी तक निष्पादित नहीं किया गया है।

उदाहरण (गलत):
oldCode.js

 
window.foo = function(){}; 

legacyWrapper.js

 
define(["require"],function(require){ 
    require({async:0},["./oldCode"]); 
}) 

code.js

 
define(["./legacyWrapper"],function(){ 
    window.foo(); //throws exception, foo has not been loaded yet. 
}) 

(jsFiddle demo)

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

 
define(["require","dojo/Deferred"],function(require,Deferred){ 
    var def = new Deferred(); 
    require({async:0}, 
      ["./moduleA", 
      "./moduleB", 
      "./moduleC", 
      "./moduleD"], 
      function(){ 
     def.resolve(); 
    }); 
    return def; 
}) 

moduleA में परिभाषित पहुँच गुण के लिए, आप अब

 
require(["legacyDeps"],function(legacyDeps){ 
    legacyDeps.then(function(){ 
     //It's save to assume that all legacy modules have been loaded here. 
    }); 
});