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


1432

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

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

Node.js प्रलेखन के अनुसार :

मापांक

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

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

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

जवाबों:


1590

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

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

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

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

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

const m = require('./mymodule');
m.myFunc1();

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

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


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

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

के बाद:

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

119
अच्छा जवाब - मुझे ऐसा लगता है कि '
एक्सपोज़

2
@ApopheniaOverload - आप एक फ़ाइल से कई उजागर तरीकों के लिए "Export.func1, export.func2, आदि" कर सकते हैं।
नरकटैन अगस्ट

73
मॉड्यूल की आवश्यकता होनी चाहिए var m = आवश्यकता ('./ mymodule'); , डॉट और स्लैश के साथ। इस तरह Node.js जानते हैं कि हम एक स्थानीय मॉड्यूल का उपयोग कर रहे हैं।
गुई प्रेमोंसा

7
उपयोग करने के लिए सुनिश्चित करें: आवश्यकता ('./ मॉड्यूल_नाम') सिंटैक्स क्योंकि, कुछ नाम के साथ कुछ अन्य नोड.जेएस मॉड्यूल हो सकते हैं और अपने स्वयं के मॉड्यूल को चुनने के बजाय, यह नोड के साथ स्थापित किया गया है।
सजीद

3
@UpTheCreek में एक मॉड्यूल द्वारा 'एक्सपोर्ट' होने के रूप में उजागर किए गए सार्वजनिक प्रतीकों का जिक्र करने की एक लंबी परंपरा है, जो कई प्रोग्रामिंग सिस्टम और दशकों में वापस आती है। यह नोड डेवलपर्स द्वारा आविष्कार किया गया एक नया शब्द नहीं था।
मार्क रीड

218

यह पहले ही उत्तर दिया जा चुका है लेकिन मैं कुछ स्पष्टीकरण जोड़ना चाहता था ...

आप दोनों का उपयोग कर सकते exportsहैं और module.exportsइस तरह से अपने आवेदन में आयात के कोड के लिए:

var mycode = require('./path/to/mycode');

आपके द्वारा उपयोग किया जाने वाला मूल उपयोग मामला (उदाहरण के लिए एक्सप्रेसजेएस उदाहरण कोड) यह है कि आप exportsएक .js फ़ाइल में उस ऑब्जेक्ट पर गुण सेट करते हैं जिसे आप उपयोग करके आयात करते हैं।require()

एक सरल गणना उदाहरण में, आपके पास हो सकता है:

(Counter.js):

var count = 1;

exports.increment = function() {
    count++;
};

exports.getCount = function() {
    return count;
};

... तो अपने आवेदन में (web.js, या वास्तव में किसी भी .js फ़ाइल):

var counting = require('./counter.js');

console.log(counting.getCount()); // 1
counting.increment();
console.log(counting.getCount()); // 2

सरल शब्दों में, आप आवश्यक फ़ाइलों को एक एकल ऑब्जेक्ट को लौटाने वाले फ़ंक्शंस के रूप में सोच सकते हैं, और आप उन ऑब्जेक्ट्स में गुण (स्ट्रिंग्स, संख्याएँ, सरणियाँ, फ़ंक्शंस, कुछ भी) जोड़ सकते हैं जो उन्हें सेट करके लौटाए गए हैं exports

कभी-कभी आप चाहते हैं कि एक require()कॉल से लौटी हुई वस्तु एक ऐसा फ़ंक्शन हो जिसे आप कॉल कर सकते हैं, न कि केवल गुणों के साथ एक ऑब्जेक्ट। उस स्थिति में भी आपको module.exportsइस तरह सेट करने की आवश्यकता है :

(Sayhello.js):

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

(App.js):

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

निर्यात और मॉड्यूल.exports के बीच का अंतर यहाँ इस उत्तर में बेहतर बताया गया है


मैं दूसरे फ़ोल्डर से कुछ मॉड्यूल की आवश्यकता कैसे कह सकता हूं, जो कुछ रूट फ़ोल्डर के रूप में मेरा नहीं है?
gal

@ user301639 आप फ़ाइल सिस्टम पदानुक्रम को पार करने के लिए संबंधित पथ का उपयोग कर सकते हैं। requireआपके द्वारा निष्पादित फ़ोल्डर के सापेक्ष शुरू होता node app.jsहै। मैं आपको स्पष्ट उत्तर प्राप्त करने के लिए स्पष्ट कोड + फ़ोल्डर संरचना उदाहरणों के साथ एक नया प्रश्न पोस्ट करने की सलाह देता हूं।
जेड वॉटसन

1
मुझे इसे काम करने के लिए अपने माड्यूल.एक्सपोर्ट का उदाहरण देना था। फ़ाइल: var sayHello = require('./ex6_module.js'); console.log(sayHello());और मॉड्यूल:module.exports = exports = function() { return "Hello World!"; }
जेसन Lydon

1
वेतन वृद्धि उदाहरण वास्तव में अच्छा मिला और मैंने इसका उपयोग हर बार अपने मन को ताज़ा करने के लिए किया है जो मैं निर्यात के साथ कर रहा हूं।
मुनिश्रे

module.exports = exports = function(){...}2 exportsसिर्फ एक चर सही है? दूसरे शब्दों में, यह हो सकता हैmodule.exports = abc = function()
Jeb50

60

नोट NodeJS मॉड्यूल तंत्र पर आधारित है कि CommonJS जो जैसे कई अन्य कार्यान्वयन में समर्थित हैं मॉड्यूल RequireJS , लेकिन यह भी SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js , या यहाँ तक कि एडोब फोटोशॉप (के माध्यम से PSLib )। आप ज्ञात कार्यान्वयन की पूरी सूची यहां पा सकते हैं ।

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

एक अन्य NodeJS विशिष्ट विशेषता यह है कि जब आप 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!"

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


35

यदि आप एक नई वस्तु के संदर्भ में exportsऔर / या modules.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जीत की तरह दिखता है )

// 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() {}; 

29

मॉड्यूल। निर्यात संपत्ति या निर्यात वस्तु एक मॉड्यूल को आवेदन के साथ साझा किया जाना चाहिए का चयन करने की अनुमति देता है

यहां छवि विवरण दर्ज करें

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


18

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

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

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

मॉड्यूल निर्यात आरेख

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


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();

यह मॉड्यूल केवल एक फ़ंक्शन को उजागर करता है और नाम की संपत्ति बाहर के लिए निजी है।


6

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

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

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

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

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

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

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

कहते हैं कि आपने एक मॉड्यूल बनाया है। जेएस मॉड्यूल,

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

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

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

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

त्रुटि: मॉड्यूल जोड़ नहीं पा रहा है

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

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

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

एक और बात, आप NODE_PATH को सेट न करके इसके अलावा भी चला सकते हैं। अपने नोडज कमांड प्रॉम्प्ट पर वापस जाएं:

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

चूँकि हम वर्तमान निर्देशिका में यह कहकर मार्ग प्रदान कर रहे हैं कि यह ./सफलतापूर्वक चलना चाहिए।


1
क्या यह निर्यात या निर्यात है?
रुद्रशिव r६

मदद के लिए धन्यवाद :)
जम्पमैन

3

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

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

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

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

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

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

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

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

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

धन्यवाद अगर इसने आपको मेरा उत्तर स्वीकार करने में मदद की है तो कृपया :)
शांतनु मदने

1
पार्टी पाल से थोड़ा देर से :)
बेन टालियाडोरोस

@BenTaliadoros मुझे भी लगता है कि वह देर हो चुकी है और मुझे भी लगता है कि उसकी किसी भी वस्तु में कई त्रुटियां हैं। ऊपर की पंक्ति sayHelloInSpanish पद्धति अर्धविराम (?) के साथ समाप्त नहीं होनी चाहिए और यह कहना चाहिए कि फ़ंक्शन गलत है। इस वस्तु के साथ सभी चीजें गलत हैं। मैं उनके उत्तर को संपादित करूँगा
दिव्य

1
संपादन अक्षम है। इस जवाब में अल्फागोग ने और क्या संपादन किया ??
दिव्य

सिर्फ स्वरूपण। जब तक इसके कुछ पागल es6 बात मैं भर में नहीं आया, और मुझे यकीन है कि यह नहीं है, तो यह वैध JS नहीं है
बेन टालियाडोरस

2

आशय यह है:

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

विकिपीडिया

मुझे लगता है कि मॉड्यूलर / पुन: प्रयोज्य कोड के बिना बड़े कार्यक्रमों को लिखना मुश्किल हो जाता है। नोडज में हम अपने प्रोग्राम module.exportsको परिभाषित करने और उसके साथ रचना करने के लिए उपयोग करते हुए मॉड्यूलर प्रोग्राम बना सकते हैं require

इस उदाहरण का प्रयास करें:

fileLog.js

function log(string) { require('fs').appendFileSync('log.txt',string); }

module.exports = log;

stdoutLog.js

function log(string) { console.log(string); }

module.exports = log;

program.js

const log = require('./stdoutLog.js')

log('hello world!');

निष्पादित

$ नोड कार्यक्रम ।js

नमस्ते दुनिया!

अब गमागमन कोशिश ./stdoutLog.js के लिए ./fileLog.js


1

मॉड्यूल सिस्टम का उद्देश्य क्या है?

यह निम्नलिखित बातों को पूरा करता है:

  1. हमारी फ़ाइलों को वास्तव में बड़े आकार के ब्लोटिंग से रखता है । इसमें कोड की 5000 लाइनों वाली फाइलें होने के बाद आमतौर पर विकास के दौरान निपटने के लिए वास्तविक रूप से कठिन होते हैं।
  2. चिंताओं के पृथक्करण को लागू करता है। हमारे कोड को कई फ़ाइलों में विभाजित करने से हमें हर फ़ाइल के लिए उपयुक्त फ़ाइल नाम रखने की अनुमति मिलती है। इस तरह हम आसानी से पहचान सकते हैं कि हर मॉड्यूल क्या करता है और इसे कहां ढूंढना है (यह मानते हुए कि हमने एक तार्किक निर्देशिका संरचना बनाई है जो अभी भी आपकी जिम्मेदारी है)।

मॉड्यूल होने से कोड के कुछ हिस्सों को ढूंढना आसान हो जाता है जो हमारे कोड को अधिक बनाए रखता है।

यह कैसे काम करता है?

NodejS निम्नलिखित तरीके से काम करने वाले CommomJS मॉड्यूल सिस्टम का उपयोग करता है:

  1. यदि कोई फ़ाइल कुछ निर्यात करना चाहती है तो उसे module.exportसिंटैक्स का उपयोग करके घोषित करना होगा
  2. यदि कोई फ़ाइल कुछ आयात करना चाहती है तो उसे require('file')सिंटैक्स का उपयोग करके घोषित करना होगा

उदाहरण:

test1.js

const test2 = require('./test2');    // returns the module.exports object of a file

test2.Func1(); // logs func1
test2.Func2(); // logs func2

test2.js

module.exports.Func1 = () => {console.log('func1')};

exports.Func2 = () => {console.log('func2')};

जानने के लिए अन्य उपयोगी बातें:

  1. मॉड्यूल्स कैश्ड हो रहे हैं । जब आप एक ही मॉड्यूल को 2 अलग-अलग फ़ाइलों में लोड कर रहे हैं तो मॉड्यूल को केवल एक बार लोड करना होगा। दूसरी बार जब एक require()ही मॉड्यूल को कॉल किया जाता है तो उसे कैश से खींचा जाता है।
  2. मॉड्यूल सिंक्रोनस में लोड किए जाते हैं । इस व्यवहार की आवश्यकता है, अगर यह अतुल्यकालिक था हम require()तुरंत प्राप्त वस्तु को प्राप्त नहीं कर सकते थे।

-3
let test = function() {
    return "Hello world"
};
exports.test = test;

4
यह उसी तरह का उदाहरण है जैसे स्वीकृत उत्तर में पहला स्निपेट ( return "Hello world"कोई फर्क नहीं पड़ता), लेकिन बिना किसी स्पष्टीकरण के। कृपया उत्तर देने से पहले सुनिश्चित कर लें कि आपका उत्तर विषय में कुछ जोड़ देगा।
बरबस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.