2015-02-05 9 views
5

मैं अपनी परियोजनाओं में से एक में अपने मॉड्यूल लोड करने के लिए RequJS का उपयोग करता हूं। मैं require कॉल (और define नहीं) का उपयोग करके मॉड्यूल की आवश्यकता के लिए वेब के विभिन्न तरीकों को देखता हूं।आवश्यकता जेएस 'को असीमित कॉल की आवश्यकता कब है? यह तुल्यकालिक कब है?

मान लें कि मेरे पास "JQuery" नामक एक मॉड्यूल है और मैं इसकी आवश्यकता चाहूंगा। के रूप में मैं उदाहरण में देखा था दो तरीके संभव हो रहे हैं:

  1. यह:

    require(["JQuery"], function($){ 
        $.doSomething(); 
    }) 
    
  2. और यह:

    var $ = require("JQuery"); 
    $.doSomething(); 
    

मेरा प्रश्न है, तो है भार के रूप में async है RequJS दस्तावेज का कहना है कि यह दूसरा सम्मेलन कैसे काम कर सकता है? मैं यह सुनिश्चित करने के लिए कैसे कह सकता हूं कि $ परिभाषित किया गया है और दूसरी पंक्ति से पहले पहली पंक्ति पूरी हो गई है?

उत्तर

8

RequireJS हमेशा एसिंक्रोनस रूप से मॉड्यूल को लोड करता है, लेकिन यह require का एक रूप है कि तुल्यकालिक लग रहा है की अनुमति देते हैं। आपका दूसरा स्निपेट वास्तव में कुछ वाकई महत्वपूर्ण कोड खो रहा है। (इसके अलावा, jQuery के लिए मॉड्यूल नाम jquery पर हार्डकोड किया गया है। आप एक कॉन्फ़िगरेशन लिख सकते हैं जो आपको jQuery के रूप में संदर्भित करने की अनुमति देता है लेकिन कोई बिंदु नहीं है।) require कॉल का यह रूप मॉड्यूल के अंदर उपयोग करने के लिए डिज़ाइन किया गया है:

define(['jquery'], function (require) { 
    var $ = require("jquery"); 
    $.doSomething(); 
}); 

नोट define के पहले तर्क के रूप में निर्भरता के अलावा:

define(function (require) { 
    var $ = require("jquery"); 
    $.doSomething(); 
}); 

RequireJS ऊपर कोड के साथ क्या करता है यह इस रूप में बदल यह निष्पादित करने से पहले है। जब RequJS कोड निष्पादित करता है, तो यह निर्भरता पाता है, jquery लोड करता है और फिर अनाम कार्य को कॉल करता है। require("jquery") उस समय तक मॉड्यूल पहले ही लोड हो चुका है। दिन के अंत में require पर कॉल करें सिंक्रोनस दिखता है, मॉड्यूल की लोडिंग के लिए यह अभी भी असंकालिक रूप से होता है।

क्या आप इस सिंक्रोनस फॉर्म require का उपयोग define कॉल के बाहर कर सकते हैं? केवल अगर आप असफलताओं के साथ ठीक हैं। यह require कॉल विफल हो जाएगा यदि मॉड्यूल पास हो गया है तो पहले ही लोड नहीं हुआ है। आप कुख्यात त्रुटि मिलती है: एक define में

Module name ... has not been loaded yet for context: ... 

इसका इस्तेमाल करते हुए जैसे मैं ऊपर दिखाए गए हैं सुरक्षित है।या फिर मुझे लगता है कि तुम कर सकते हो:

require(['jquery'], function (require) { 
    var $ = require("jquery"); 
    $.doSomething(); 
}); 

जो होगा काम लेकिन मैन्युअल रूप से निर्भरता दोहराने की बात क्या है। (मामले में आप आश्चर्य है, RequireJS एक मैं उसी तरह यह बदल देती है एक define कॉल के रूप में मैं ऊपर दिखाए गए हैं में यहाँ मेरी उदाहरण में है की तरह एक कॉलबैक के साथ एक require कॉल को बदलने नहीं है।)

+0

धन्यवाद। अब यह सब स्पष्ट है, कोड दूसरे तरीके से थोड़ा अच्छा और क्लीनर दिखता है जैसा कि मैंने इसे देखा है। :) – Er85

0

requ.js दस्तावेज़ों के अनुसार यह एक रैपर है। तो यह असीमित रूप से काम करने के लिए कोड पुनर्निर्माण कर रहा है। इसे कॉमनजेस रैपर कहा जाता है। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं here

0

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

function require(name,cb){ 
    if(cb !== undefined){ 
     requireAsync(name,cb); 
    }else{ 
     requireSync(name); 
    } 
} 
संबंधित मुद्दे