2013-03-25 8 views
29

मैं दोनों require.js और jQuery की वर्तमान स्थिर रिलीज उपयोग कर रहा हूँ के साथ jQuery लागू करने के लिए और मैं इस समय इससही रास्ता require.js

requirejs.config({ 
paths: { 
    'jQuery': 'vendor/jquery', 
} 
}); 

require(['jQuery'], function(jQuery) { 
    log(jQuery); // working 
}); 

तरह jQuery शामिल कर रहा हूँ मैं क्या नहीं मिलता है वह यह है कि मैं वास्तव में, के रूप में यह अभी भी (भी अन्य मॉड्यूल में) काम करेंगे स्पष्ट रूप से वापस jQuery देने की जरूरत नहीं है:

require(['jQuery'], function(// nothing here) { 
    log(jQuery); // working 
}); 

अब मैं यकीन नहीं है अगर यह यह करने का सही तरीका क्या है, इसलिए भी कि का उपयोग करते हुए jQuery के संदर्भ के लिए $ डॉलर का संकेत काम नहीं करता है!

+2

यदि आप एएमडी का समर्थन करने वाले jQuery पर नवीनतम संस्करण में हैं, तो आप इस लिंक का अनुसरण कर सकते हैं: http://developer.telerik.com/featured/jquery-using-only-what-you-need/ –

उत्तर

40

महत्वपूर्ण बिंदुओं मैं इसे देखना के रूप में:

  1. jQuery जब इस्तेमाल किया साथ RequireJS नामित मॉड्यूल 'jQuery' (सभी छोटे अक्षर) के रूप में पंजीकृत करता है। आपके उदाहरण में आप इसे 'jQuery' के रूप में उपयोग करने का प्रयास कर रहे हैं, जो चीजों को थोड़ा उलझन में डालता है क्योंकि यह एक वैश्विक फ़ंक्शन का नाम भी है जो लोड होने पर पंजीकृत होता है (बिंदु # 2 देखें)।
  2. डिफ़ॉल्ट रूप से, jQuery वैश्विक कार्यों "$" और "jQuery" का उपयोग करके खुद को पंजीकृत करता है, यहां तक ​​कि जब AMD/RequJS के साथ उपयोग किया जाता है। यदि आप इस व्यवहार को बंद करना चाहते हैं तो आपको NoConflict फ़ंक्शन को कॉल करना होगा।
  3. आप नीचे दिए गए उदाहरण में दिखाए गए अनुसार, कोई भी कॉनफ्लिक्ट कॉल में jQuery के लिए अपने RequJS संदर्भ को लपेट सकते हैं।

    requirejs.config({ 
        paths: { 
         'jquery': 'vendor/jquery', 
        } 
    }); 
    
    define('jquery-private', ['jquery'], function (jq) { 
        return jq.noConflict(true); 
    }); 
    
    require(['jquery-private'], function(jq) { 
        console.log(jq);  // working 
        console.log($);  // undefined 
        console.log(jQuery); // undefined 
    }); 
    

उपयोग करने के लिए अन्य मॉड्यूल मैप करने के लिए कैसे के बारे में भी my answer in this question देखें: जहां तक ​​मेरा बता सकते हैं, यह सिफारिश की दृष्टिकोण आप अन्य मॉड्यूल जो वैश्विक $ या jQuery की जरूरत नहीं है जब है निजी (नो कॉन्फ्लिक्ट) संस्करण।

अधिक पृष्ठभूमि के लिए, jQuery के स्रोत कोड से इन पंक्तियों जो सब कुछ का कारण हैं मैं ऊपर वर्णित देखें:

// Expose jQuery to the global object 
    window.jQuery = window.$ = jQuery; 

    // Expose jQuery as an AMD module, but only for AMD loaders that 
    // understand the issues with loading multiple versions of jQuery 
    // in a page that all might call define(). The loader will indicate 
    // they have special allowances for multiple jQuery versions by 
    // specifying define.amd.jQuery = true. Register as a named module, 
    // since jQuery can be concatenated with other files that may use define, 
    // but not use a proper concatenation script that understands anonymous 
    // AMD modules. A named AMD is safest and most robust way to register. 
    // Lowercase jquery is used because AMD module names are derived from 
    // file names, and jQuery is normally delivered in a lowercase file name. 
    // Do this after creating the global so that if an AMD module wants to call 
    // noConflict to hide this version of jQuery, it will work. 
    if (typeof define === "function" && define.amd && define.amd.jQuery) { 
     define("jquery", [], function() { return jQuery; }); 
    } 

अद्यतन:Use with jQuery section of the RequireJS site ऊपर जानकारी के अनुसार अपडेट किया गया है। ऑप्टिमाइज़र सहित चरण-दर-चरण के लिए this answer भी देखें। बस फिर से जोर देना चाहते हैं कि यह नो कॉन्फ्लिक्ट दृष्टिकोण केवल सभी आपके प्लगइन एएमडी संगत हैं।

+0

मैंने यह किया और मेरी अधिकांश स्क्रिप्ट काम करते हैं, लेकिन कुछ में, $ .fn अपरिभाषित है, भले ही $ ठीक लगता है ... कोई विचार क्यों? – catbadger

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