2012-08-01 10 views
36

क्या आवश्यक.जेएस के सभी लोड मॉड्यूल तक पहुंचने का कोई तरीका है?requ.js: सभी लोड मॉड्यूल तक पहुंच

पृष्ठभूमि:
मैं स्वचालित रूप से, के बाद उन सभी को लोड किए गए हैं मेरी जावास्क्रिप्ट-मॉड्यूल के एक init() फ़ंक्शन को कॉल require.js + backbone.js: How to structure modules that have an initialize function? देख require.js मैं अपने खुद के मॉड्यूल भंडारण से अधिक लूप में चलाया और प्रत्येक init() समारोह कहा जाता है के बिना करना चाहते हैं।
अब मैं requ.js के साथ ऐसा करना चाहता हूं। मुझे पता है कि प्रत्येक लोड मॉड्यूल (बाहरी पुस्तकालयों सहित) के my_custom_init_function_favoritecolor_petname_love123 को कॉल करना खतरनाक है। मुझे उम्मीद है कि यह सभी मॉड्यूल (और इन मॉड्यूल की आवश्यकताओं) की सूची को मैन्युअल रूप से रखने से कम परेशानी का कारण बन जाएगा। एक मॉड्यूल init() को भूलना मेरे कस्टम फ़ंक्शन नाम वाले किसी तृतीय-पक्ष लाइब्रेरी की तुलना में अधिक संभावना है (हालांकि उत्तरार्द्ध शायद डीबग करना कठिन है)।

या क्या किसी को यह पूरा करने का बेहतर विचार है कि इसे कैसे पूरा किया जाए?

उत्तर

59

हाँ, require.s.contexts._.defined एक वस्तु है जो अपने कुंजी मॉड्यूल नाम हैं और मूल्यों मूल्य कि मॉड्यूल से लौटे शामिल है।

require.s.contexts._.defined सभी मॉड्यूल शामिल हैं (या तो define() या require() ऐसे जावास्क्रिप्ट फ़ाइल कार्यक्रम के प्रारंभिक बिंदु है और RequireJS के लिए data-main का उपयोग कर इंगित किया गया है कि के रूप में)।

+4

रजिस्ट्री के बीच क्या अंतर है और संदर्भ पर परिभाषित किया गया है? मैं संदर्भ पर एक नई वस्तु देखता हूं ._। रजिस्ट्री ऑब्जेक्ट को परिभाषित करने के बाद ('mod', ...), लेकिन संदर्भ पर नहीं ._ परिभाषित किया गया है। आवश्यकता के बाद (['मॉड'], ...) कॉल मैं संदर्भ पर मॉड्यूल देखता हूं ._ परिभाषित। – alexK85

11

बस मेरे RequJS प्रोजेक्ट के भीतर एक समान व्यवहार समाप्त कर दिया। require.s.contexts['_'].registry पंजीकृत मॉड्यूल की सूची रखता है।

मैं मॉड्यूल की सूची प्राप्त करने, फ़िल्टर करने और पुन: सक्रिय करने के लिए Underscore.js का उपयोग कर रहा हूं। हो सकता है कि निम्नलिखित कोड टुकड़ा में सहायक है:

var modules_registered = _.keys(require.s.contexts['_'].registry); 
var modules_to_be_initialized = _.filter(modules_registered, function(module_title) { 
    return module_title.indexOf('modules') > -1; 
}); 

_.each(modules_to_be_initialized, function(module_name) { 
    require([module_name], function(current_module) { 
     current_module.init(); 
    }); 
}); 
1

मैं आलसी हूँ, तो मैं बस ऐसा किया:

var modulesToLoad = Object.keys(require.s.contexts['_'].registry); 
    require(modulesToLoad); 

अन्य उत्तर यहाँ के आधार पर।

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