javascript - Node.js module.exports का उद्देश्य क्या है और आप इसका उपयोग कैसे करते हैं?




(9)

संदर्भ लिंक इस तरह है:

exports = module.exports = function(){
    //....
}

exports या module.exports , जैसे फंक्शंस या वैरिएबल के गुण, बाहर उजागर किए जाएंगे

कुछ ऐसा है जो आपको अधिक ध्यान देना चाहिए: निर्यात को override न करें।

क्यूं कर ?

क्योंकि निर्यात केवल मॉड्यूल.एक्सपोर्ट का संदर्भ है, आप निर्यात पर गुण जोड़ सकते हैं, लेकिन यदि आप निर्यात को ओवरराइड करते हैं, तो संदर्भ लिंक टूटा जाएगा।

अच्छा उदाहरण :

exports.name = 'william';

exports.getName = function(){
   console.log(this.name);
}

खराब उदाहरण :

exports = 'william';

exports = function(){
     //...
}

यदि आप केवल एक ही फ़ंक्शन या चर का खुलासा करना चाहते हैं, तो इस तरह:

// test.js
var name = 'william';

module.exports = function(){
    console.log(name);
}   

// index.js
var test = require('./test');
test();

इस मॉड्यूल ने केवल एक समारोह का खुलासा किया और नाम की संपत्ति बाहर के लिए निजी है।

Node.js module.exports का उद्देश्य क्या है और आप इसका उपयोग कैसे करते हैं?

मुझे इस पर कोई जानकारी नहीं मिल रही है, लेकिन यह नोड.जेएस का एक महत्वपूर्ण हिस्सा प्रतीत होता है क्योंकि मैं इसे अक्सर स्रोत कोड में देखता हूं।

नोड.जेएस दस्तावेज के अनुसार:

मॉड्यूल

वर्तमान module एक संदर्भ। विशेष module.exports में। निर्यात निर्यात वस्तु के समान है। अधिक जानकारी के लिए src/node.js देखें।

लेकिन यह वास्तव में मदद नहीं करता है।

module.exports वास्तव में क्या करता है, और एक साधारण उदाहरण क्या होगा?


एक मॉड्यूल कोड की एक इकाई में संबंधित कोड encapsulates। मॉड्यूल बनाते समय, इसे सभी संबंधित कार्यों को फ़ाइल में ले जाने के रूप में व्याख्या किया जा सकता है।

मान लीजिए कि हैलो.जेएस फ़ाइल है जिसमें दो फ़ंक्शन शामिल हैं

sayHelloInEnglish = function() {
  return "Hello";
};
sayHelloInSpanish = function() {
  return "Hola";
};

हम केवल एक समारोह लिखते हैं जब कोड की उपयोगिता एक से अधिक कॉल होती है।

मान लीजिए कि हम फ़ंक्शन की उपयोगिता को एक अलग फ़ाइल में बढ़ाना चाहते हैं, वर्ल्ड.जेएस कहते हैं, इस मामले में एक फाइल निर्यात करने से चित्र में आता है जिसे मॉड्यूल.एक्सपोर्ट्स द्वारा प्राप्त किया जा सकता है।

आप नीचे दिए गए कोड द्वारा दोनों फ़ंक्शन को निर्यात कर सकते हैं

var anyVariable={
 sayHelloInEnglish = function() {
      return "Hello";
    };
  sayHelloInSpanish = function() {
      return "Hola";
    }; 
}
module.export=anyVariable;

अब आपको उन कार्यों का उपयोग करने के लिए केवल google.js inorder में फ़ाइल नाम की आवश्यकता है

var world= require("./hello.js");

ध्यान दें कि नोडजेएस मॉड्यूल तंत्र कॉमनजेएस मॉड्यूल पर आधारित है जो कई अन्य कार्यान्वयन जैसे कि आवश्यकताजेएस , लेकिन स्प्राउटकोर , कॉच डीबी , वकांडा , ओरिएंटबीबी , अरंगोबीबी , रिंगोजेएस , टीएजेएस , सिल्कजेएस , कर्ल.जेएस , या यहां तक ​​कि एडोब फोटोशॉप ( PSLib माध्यम से) में PSLib )। आप here ज्ञात कार्यान्वयन की पूरी सूची पा सकते हैं।

जब तक आपका मॉड्यूल नोड विशिष्ट विशेषताओं या मॉड्यूल का उपयोग न करे, तब तक मैं आपको module.exports बजाय exports का उपयोग करके प्रोत्साहित exports module.exports जो कि module.exports मानक का हिस्सा नहीं है , और फिर अधिकतर अन्य कार्यान्वयन द्वारा समर्थित नहीं है।

एक अन्य नोडजेएस विशिष्ट सुविधा तब होती है जब आप इस धागे में जेड वाटसन द्वारा प्रदान किए गए अंतिम उदाहरण की तरह गुणों और विधियों को जोड़ने के बजाय exports लिए किसी नए ऑब्जेक्ट का संदर्भ निर्दिष्ट करते हैं। मैं व्यक्तिगत रूप से इस अभ्यास को हतोत्साहित करता हूं क्योंकि यह कॉमनजेएस मॉड्यूल तंत्र के परिपत्र संदर्भ समर्थन को तोड़ देता है। तब यह सभी कार्यान्वयनों द्वारा समर्थित नहीं है और जेड उदाहरण को और अधिक सार्वभौमिक मॉड्यूल प्रदान करने के लिए इस तरह लिखा जाना चाहिए (या एक समान):

(Sayhello.js):

exports.run = function() {
    console.log("Hello World!");
}

(App.js):

var sayHello = require('./sayhello');
sayHello.run(); // "Hello World!"

या ES6 सुविधाओं का उपयोग कर

(Sayhello.js):

Object.assign(exports, {
    // Put all your public API here
    sayhello() {
        console.log("Hello World!");
    }
});

(App.js):

const { sayHello } = require('./sayhello');
sayHello(); // "Hello World!"

पीएस: ऐसा लगता है कि एपसेलरेटर भी कॉमनजेएस मॉड्यूल लागू करता है, लेकिन परिपत्र संदर्भ समर्थन के बिना (देखें: एपसेलरेटर और कॉमनजेएस मॉड्यूल (कैशिंग और सर्कुलर संदर्भ )


Node.js में कुछ डिफ़ॉल्ट या मौजूदा मॉड्यूल हैं जब आप http, sys इत्यादि जैसे node.js को डाउनलोड और इंस्टॉल करते हैं।

चूंकि वे पहले से ही node.js में हैं, जब हम इन मॉड्यूल का उपयोग करना चाहते हैं तो हम मूल रूप से आयात मॉड्यूल की तरह करते हैं, लेकिन क्यों? क्योंकि वे पहले से ही node.js. में मौजूद हैं आयात करना उन्हें node.js से लेने और उन्हें अपने प्रोग्राम में डालने जैसा है। और फिर उनका उपयोग कर रहे हैं।

जबकि निर्यात बिल्कुल विपरीत है, आप जिस मॉड्यूल को चाहते हैं उसे बना रहे हैं, आइए मॉड्यूल add.js कहें और उस मॉड्यूल को node.js में डालें, आप इसे निर्यात करके करते हैं।

यहां कुछ भी लिखने से पहले, याद रखें, module.exports.additionTwo export.additionTwo के समान है

हू, यही कारण है, हम पसंद करते हैं

exports.additionTwo = function(x)
{return x+2;};

पथ से सावधान रहें

आइए कहें कि आपने एक जोड़ा.जेएस मॉड्यूल बनाया है,

exports.additionTwo = function(x){
return x + 2;
};

जब आप इसे अपने NODE.JS कमांड प्रॉम्प्ट पर चलाते हैं:

node
var run = require('addition.js');

यह कहने में त्रुटि होगी

त्रुटि: मॉड्यूल add.js नहीं मिल सकता है

ऐसा इसलिए है क्योंकि node.js प्रक्रिया add.js में असमर्थ है क्योंकि हमने पथ का उल्लेख नहीं किया है। इसलिए, हम NODE_PATH का उपयोग करके पथ सेट कर सकते हैं

set NODE_PATH = path/to/your/additon.js

अब, यह किसी भी त्रुटि के बिना सफलतापूर्वक भागना चाहिए !!

एक और बात, आप nODE_PATH को सेट करके add.js फ़ाइल को भी चला सकते हैं, अपने nodejs कमांड प्रॉम्प्ट पर वापस:

node
var run = require('./addition.js');

चूंकि हम यह कहकर पथ प्रदान कर रहे हैं कि यह वर्तमान निर्देशिका में है ./ इसे सफलतापूर्वक भी चलाया जाना चाहिए।


module.exports प्रॉपर्टी या निर्यात ऑब्जेक्ट एक मॉड्यूल को यह चुनने की अनुमति देता है कि एप्लिकेशन के साथ क्या साझा किया जाना चाहिए

मेरे पास मॉड्यूल_एक्सपोर्ट पर एक वीडियो उपलब्ध here


एकाधिक प्रोग्रामों पर अपने प्रोग्राम कोड को विभाजित करते समय, module.exports को मॉड्यूल के उपभोक्ता को चर और फ़ंक्शन प्रकाशित करने के लिए उपयोग किया जाता है। आपकी स्रोत फ़ाइल में require() कॉल को मॉड्यूल से लोड किए गए संबंधित module.exports साथ प्रतिस्थापित किया गया है।

मॉड्यूल लिखते समय याद रखें

  • मॉड्यूल लोड कैश किए जाते हैं, केवल प्रारंभिक कॉल जावास्क्रिप्ट का मूल्यांकन करता है।
  • मॉड्यूल के अंदर स्थानीय चर और कार्यों का उपयोग करना संभव है, सब कुछ निर्यात करने की आवश्यकता नहीं है।
  • module.exports ऑब्जेक्ट exports module.exports रूप में भी उपलब्ध है। लेकिन एकमात्र फ़ंक्शन लौटने पर, हमेशा module.exports उपयोग module.exports

के अनुसार: "मॉड्यूल भाग 2 - लेखन मॉड्यूल"


यदि आप exports और / या modules.exports लिए किसी नए ऑब्जेक्ट का संदर्भ निर्दिष्ट करते हैं तो कुछ चीजें आपको सावधानी बरतनी चाहिए। exports :

1. मूल exports या module.exports से पहले जुड़े सभी गुण / विधियां निश्चित रूप से खो गई हैं क्योंकि निर्यातित वस्तु अब एक और नया संदर्भ देगी

यह एक स्पष्ट है, लेकिन यदि आप मौजूदा मॉड्यूल की शुरुआत में एक निर्यात विधि जोड़ते हैं, तो सुनिश्चित करें कि मूल निर्यातित वस्तु अंत में किसी अन्य ऑब्जेक्ट का संदर्भ नहीं दे रही है

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. यदि exports या module.exports कोई एक नया मान संदर्भित करता है, तो वे किसी भी वस्तु का संदर्भ नहीं लेते हैं

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. मुश्किल परिणाम। यदि आप दोनों exports और module.exports के संदर्भ को module.exports , तो यह कहना मुश्किल है कि कौन सी एपीआई उजागर हुई है (ऐसा लगता है कि module.exports जीतता है)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 

module.exports वह वस्तु है जो वास्तव में require कॉल के परिणामस्वरूप वापस module.exports है।

exports चर प्रारंभ में उसी ऑब्जेक्ट पर सेट होता है (यानी यह एक शॉर्टंड "उपनाम" है), इसलिए मॉड्यूल कोड में आप आमतौर पर ऐसा कुछ लिखेंगे:

var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

आंतरिक रूप से scoped कार्यों myFunc1 और myFunc2 निर्यात (या "खुलासा") करने के लिए।

और कॉलिंग कोड में आप इसका उपयोग करेंगे:

var m = require('mymodule');
m.myFunc1();

जहां अंतिम पंक्ति दिखाती है कि require का परिणाम कैसे होता है (आमतौर पर) केवल एक सादा वस्तु जिसका गुणों का उपयोग किया जा सकता है।

एनबी: यदि आप exports ओवरराइट करते हैं तो यह अब module.exports संदर्भ नहीं module.exports । इसलिए यदि आप exports लिए एक नया ऑब्जेक्ट (या फ़ंक्शन संदर्भ) असाइन करना चाहते हैं तो आपको module.exports उस नई ऑब्जेक्ट को असाइन करना चाहिए

यह ध्यान देने योग्य है कि exports ऑब्जेक्ट में जोड़ा गया नाम मॉड्यूल के आंतरिक रूप से स्कॉप्ड नाम के समान नहीं होना चाहिए जो आप जोड़ रहे हैं, ताकि आप यह कर सकें:

var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

के बाद:

var m = require('mymodule');
m.shortName(); // invokes module.myVeryLongInternalName

  1. नोड त्वरित प्रोटोटाइप के लिए बहुत अच्छा है लेकिन मैं इसे किसी भी जटिल के लिए कभी भी उपयोग नहीं करता। मैंने एक कंपाइलर के साथ संबंध विकसित करने में 20 साल बिताए और मुझे यकीन है कि इसे याद आती है।

  2. नोड विशेष रूप से कोड को बनाए रखने के लिए दर्दनाक है जिसे आपने थोड़ी देर के लिए नहीं देखा है। जानकारी टाइप करें और संकलन समय त्रुटि पहचान अच्छी चीजें हैं। यह सब क्यों फेंक दो? किस लिए? और डांग, जब कुछ दक्षिण में जाता है तो ढेर का निशान अक्सर पूरी तरह से बेकार होता है।





javascript node.js