2015-05-06 17 views
7

मैं समझने की कोशिश कर रहा हूं कि jQuery स्वयं को कैसे सेट करता है।JQuery लाइब्रेरी मॉड्यूल निर्यात

शुरुआत में ठीक है jQuery स्वचालित रूप से एक फ़ंक्शन को कॉल करता है, जो एक मॉड्यूल निर्यात करता है।

सेटअप कैसे काम करता है?

यहाँ कुछ अधिक विस्तृत उप सवाल जो अधिक सामान्य सवाल का जवाब दे सकता है:

  • module.exports पर function(w) को पुनरावर्ती कॉल का उपयोग क्या है?
  • noGlobal चर का उपयोग क्या है?
  • वास्तव में factory कहां स्थापित है और इसका प्रकार क्या है?
  • factory तर्क क्यों एक तर्क के साथ और दो के साथ भी कहा जा सकता है?
  • global तर्क क्या है? (मैं चाहता हूँ में C++ की तरह एक प्रकार वहाँ थे ...)

(function(global, factory) { 

    if (typeof module === "object" && typeof module.exports === "object") { 
     // For CommonJS and CommonJS-like environments where a proper `window` 
     // is present, execute the factory and get jQuery. 
     // For environments that do not have a `window` with a `document` 
     // (such as Node.js), expose a factory as module.exports. 
     // This accentuates the need for the creation of a real `window`. 
     // e.g. var jQuery = require("jquery")(window); 
     // See ticket #14549 for more info. 
     module.exports = global.document ? 
      factory(global, true) : 
      function(w) { 
       if (!w.document) { 
        throw new Error("jQuery requires a window with a document"); 
       } 
       return factory(w); 
      }; 
    } else { 
     factory(global); 
    } 

    // Pass this if window is not defined yet 
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) { 

उत्तर

15

module.exports पर function(w) को पुनरावर्ती कॉल का उपयोग क्या है?

यह एक रिकर्सिव कॉल नहीं है, एक स्थगित प्रारंभिक कार्य अधिक है। कुछ सामान्य जेएस वातावरण में, जैसे कि नोड.जेएस, वैश्विक वस्तु में document संपत्ति नहीं है, जबकि ब्राउज़र और वेबपैक जैसे अन्य लोग करते हैं।

jQuery को document संपत्ति प्रारंभ करने की आवश्यकता है, इसलिए यह पहली बार जांचने के लिए जांच करें कि वैश्विक वस्तु में document संपत्ति है या नहीं। यदि ऐसा होता है, तो यह सामान्य रूप से प्रारंभ होता है, ब्राउज़र में कॉमनजेएस वातावरण को खुश करता है। यदि ऐसा नहीं होता है, तो यह एक फ़ंक्शन देता है जिसे बाद में jQuery प्रारंभ करने के लिए उपयोग किया जा सकता है। बाद में इस काम को नकली खिड़की पर बुलाया जा सकता था, जो जेएसडम की तरह कुछ बना रहा था।


noGlobal चर का उपयोग क्या है?

noGlobal चर का उपयोग यहां किया जाता है।

Excerpt from jQuery:

// Expose jQuery and $ identifiers, even in 
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 
// and CommonJS for browser emulators (#13566) 
if (typeof noGlobal === strundefined) { 
    window.jQuery = window.$ = jQuery; 
} 

अनिवार्य रूप से, अगर noGlobalundefined है, jQuery ही वैश्विक window वस्तु के लिए जोड़ देगा। ऐसा करने का एकमात्र समय यह है कि यदि यह किसी कॉमनजेएस लोडर द्वारा लोड किया गया है, तो वैश्विक वस्तु, जैसे ब्राउज़र या वेबपैक पर document संपत्ति के साथ। नीचे दी गई कॉल है जहां noGlobalundefined नहीं है।

factory(global, true) 

कहाँ factory वास्तव में सेट किया गया है और इसके प्रकार क्या है?

factory चर एक function है, और यह यहाँ घोषित किया जाता है:

function(window, noGlobal) { 

यह दूसरी IIFE में पारित तर्क है।


क्यों factory तर्क एक तर्क के साथ और साथ ही दोनों के साथ कहा जाता है प्राप्त कर सकते हैं?

क्योंकि जावास्क्रिप्ट।

जावास्क्रिप्ट में, किसी फ़ंक्शन के साथ घोषित किए गए तर्कों की संख्या से मेल खाने की कोई आवश्यकता नहीं है। किसी भी छोड़े गए तर्कों का मूल्य undefined है।


global तर्क शामिल करने के लिए माना जाता है? (मेरी इच्छा है कि सी ++ में एक प्रकार की तरह ...)

यह जावास्क्रिप्ट पर्यावरण के लिए वैश्विक वस्तु को शामिल करने वाला माना जाता है। ब्राउज़र में, इस ऑब्जेक्ट को window के रूप में जाना जाता है, और नोड में, इस ऑब्जेक्ट को global के रूप में जाना जाता है। दोनों वातावरण में, वैश्विक दायरे में this का उपयोग करके वैश्विक वस्तु को हल किया जाएगा, जो भी वैश्विक नाम है।

हालांकि, कुछ तृतीय-पक्ष रैपरों के कारण जो jQuery को प्रारंभ करने के दायरे को बदल सकते हैं, jQuery पहले जांच करेगा कि window ऑब्जेक्ट उपलब्ध है या नहीं है और इसका उपयोग करें। यदि उपयोग नहीं किया जाता है, तो यह this का उपयोग करने के लिए डिफ़ॉल्ट होगा।

typeof window !== "undefined" ? window : this 

एक और प्रश्न

: जहां डब्ल्यू तर्क से आ रही है?

वैश्विक वस्तु एक document शामिल नहीं करता है, यह एक समारोह है कि एक तर्क, w स्वीकार करता है देता है। यह ऑब्जेक्ट window-document के साथ ऑब्जेक्ट की तरह होगा जिसे jsdom जैसी चीज़ के साथ बनाया जा सकता है।

+0

एक और सवाल: डब्ल्यू तर्क कहां से आ रहा है? – Beginner

+0

@ बेगिनर जब वैश्विक ऑब्जेक्ट में 'दस्तावेज़' नहीं होता है, तो यह एक फ़ंक्शन देता है जो एक तर्क स्वीकार करता है, 'w'। यह ऑब्जेक्ट 'दस्तावेज़' जैसी ऑब्जेक्ट होगी जिसमें 'दस्तावेज़' है जिसे jsdom जैसी चीज़ के साथ बनाया जा सकता है। –

+0

क्या इसका मतलब है डब्ल्यू एक वैश्विक चर है जो इस मामले में उपलब्ध है कि कोई दस्तावेज़ उपलब्ध नहीं है? – Beginner

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