javascript - CommonJs मॉड्यूल सिस्टम में "module.exports" और "निर्यात" के बीच अंतर




node.js (3)

रेनी का जवाब अच्छी तरह से समझाया गया है। उदाहरण के साथ उत्तर में वृद्धि:

नोड आपकी फाइल में बहुत सी चीजें करता है और महत्वपूर्ण में से एक आपकी फाइल को लपेट रहा है। नोडजेस स्रोत कोड "module.exports" के अंदर वापस आ गया है। आइए एक कदम वापस लें और रैपर को समझें। मान लीजिए आपके पास है

greet.js

var greet = function () {
   console.log('Hello World');
};

module.exports = greet;

उपरोक्त कोड को निम्नानुसार नोडजेस स्रोत कोड के अंदर IIFE (तुरंत आमंत्रित फ़ंक्शन अभिव्यक्ति) के रूप में लपेटा गया है:

(function (exports, require, module, __filename, __dirname) { //add by node

      var greet = function () {
         console.log('Hello World');
      };

      module.exports = greet;

}).apply();                                                  //add by node

return module.exports;                                      //add by node

और उपर्युक्त फ़ंक्शन को लागू किया जाता है (.apply ()) और मॉड्यूल.एक्सपोर्ट लौटा दिया। इस समय मॉड्यूल.एक्सपोर्ट्स और निर्यात एक ही संदर्भ को इंगित करते हैं।

अब, कल्पना करें कि आप greet.js को फिर से लिखते हैं

exports = function () {
   console.log('Hello World');
};
console.log(exports);
console.log(module.exports);

आउटपुट होगा

[Function]
{}

कारण यह है: module.exports एक खाली वस्तु है। हमने मॉड्यूल.एक्सपोर्ट्स पर कुछ भी सेट नहीं किया है बल्कि हम export = function .....) को new greet.js में सेट करते हैं। तो, module.exports खाली है।

तकनीकी रूप से निर्यात और मॉड्यूल.एक्सपोर्ट को एक ही संदर्भ को इंगित करना चाहिए (यह सही है !!)। लेकिन हम निर्यात करने के लिए फ़ंक्शन () .... असाइन करते समय "=" का उपयोग करते हैं, जो स्मृति में एक और ऑब्जेक्ट बनाता है। तो, मॉड्यूल.एक्सपोर्ट्स और निर्यात अलग-अलग परिणाम उत्पन्न करते हैं। जब निर्यात की बात आती है तो हम इसे ओवरराइड नहीं कर सकते हैं।

अब, कल्पना करें कि आप फिर से लिखते हैं (इसे उत्परिवर्तन कहा जाता है) greet.js (रीनी उत्तर का जिक्र करते हुए)

exports.a = function() {
    console.log("Hello");
}

console.log(exports);
console.log(module.exports);

आउटपुट होगा

{ a: [Function] }
{ a: [Function] }

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

भ्रम से बचने के लिए निष्कर्ष हमेशा मॉड्यूल.एक्सपोर्ट का उपयोग करता है। उम्मीद है की यह मदद करेगा। हैप्पी कोडिंग :)

इस पृष्ठ पर ( http://docs.nodejitsu.com/articles/getting-started/what-is-require ), यह बताता है कि "यदि आप निर्यात ऑब्जेक्ट को फ़ंक्शन या नई ऑब्जेक्ट पर सेट करना चाहते हैं, तो आपको module.exports ऑब्जेक्ट का उपयोग करें। "

मेरा सवाल है क्यों।

// right
module.exports = function () {
  console.log("hello world")
}
// wrong
exports = function () {
  console.log("hello world")
}

मैं console.logged परिणाम ( result=require(example.js) ) और पहला एक है [Function] दूसरा एक {}

क्या आप इसके पीछे कारण बता सकते हैं? मैंने यहां पोस्ट पढ़ा: मॉड्यूल.एक्सपोर्ट्स बनाम नोड.जेएस में निर्यात । यह सहायक है, लेकिन इस कारण से डिजाइन किए गए कारणों की व्याख्या नहीं करता है। अगर निर्यात का संदर्भ सीधे वापस किया जाए तो क्या कोई समस्या होगी?


साथ ही, एक चीज जो समझने में मदद कर सकती है:

math.js

this.add = function (a, b) {
    return a + b;
};

client.js

var math = require('./math');
console.log(math.add(2,2); // 4;

बढ़िया, इस मामले में:

console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true

इस प्रकार, डिफ़ॉल्ट रूप से, "यह" वास्तव में module.exports के बराबर है।

हालांकि, अगर आप अपना कार्यान्वयन बदलते हैं:

math.js

var add = function (a, b) {
    return a + b;
};

module.exports = {
    add: add
};

इस मामले में, यह ठीक काम करेगा, हालांकि, "यह" मॉड्यूल.एक्सपोर्ट्स के बराबर नहीं है, क्योंकि एक नई वस्तु बनाई गई थी।

console.log(this === module.exports); // false
console.log(this === exports); // true
console.log(module.exports === exports); // false

और अब, आवश्यकता के अनुसार क्या वापस किया जाएगा मॉड्यूल.एक्सपोर्ट के अंदर परिभाषित किया गया था, यह या निर्यात नहीं, अब और नहीं।

ऐसा करने का एक और तरीका यह होगा:

math.js

module.exports.add = function (a, b) {
    return a + b;
};

या:

math.js

exports.add = function (a, b) {
    return a + b;
};

module एक exports संपत्ति के साथ एक सादा जावास्क्रिप्ट वस्तु है। exports एक सादा जावास्क्रिप्ट चर है जो module.exports सेट होता है। आपकी फ़ाइल के अंत में, node.js मूल रूप से 'वापसी' module.exports की require फ़ंक्शन पर होगा। नोड में जेएस फ़ाइल देखने का एक सरल तरीका यह हो सकता है:

var module = { exports: {} };
var exports = module.exports;

// your code

return module.exports;

यदि आप exports पर संपत्ति सेट करते हैं, जैसे exports.a = 9; , जो module.exports.a . module.exports.a को भी सेट करेगा क्योंकि ऑब्जेक्ट्स जावास्क्रिप्ट में संदर्भों के रूप में पास किए जाते हैं, जिसका अर्थ है कि यदि आप एक ही ऑब्जेक्ट में एकाधिक चर सेट करते हैं , तो वे सभी एक ही ऑब्जेक्ट होते हैं; तो फिर exports और module.exports एक ही वस्तु है।
लेकिन यदि आप कुछ नए exports को सेट करते हैं, तो यह अब module.exports सेट नहीं होगा, इसलिए exports और module.exports अब एक ही ऑब्जेक्ट नहीं हैं।





commonjs