Node.js - एक रचनाकार के रूप में मॉड्यूल.एक्सपोर्ट का उपयोग


120

Node.js मैनुअल के अनुसार:

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

उदाहरण दिया गया है:

// file: square.js
module.exports = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

और इस तरह इस्तेमाल किया:

var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());

मेरा प्रश्न: उदाहरण एक वस्तु के रूप में वर्ग का उपयोग क्यों नहीं करता है? निम्नलिखित मान्य है और क्या यह उदाहरण को और अधिक "वस्तु उन्मुख" बनाता है?

var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());

1
आपका उदाहरण एक सिंटैक्स त्रुटि है। नाम बदलने के बाद squareकरने के लिए अब मौजूद नहीं है। Squarenew square()
सुकीमा

3
क्षमा करें, यह एक टाइपो था। ठीक कर दिया। मेरा इरादा ऊपरी मामले से शुरू होने वाले ऑब्जेक्ट / फंक्शन नाम को दिखाना था और उदाहरण के लिए कम मामले से शुरू होने वाला नाम।
नरेश

4
मुझे उतना ही लगा, इसीलिए मैंने अपना उत्तर उस तरह लिखा जैसे मैंने किया था। मैं सिर्फ यह कहना चाहता था कि मुझे खुशी है कि अन्य लोग भी इसी तरह से मॉड्यूल देख रहे हैं। मैं अक्सर नए कीवर्ड का उपयोग करता हूं और अपने मॉड्यूल्स को एक कंस्ट्रक्टर फ़ंक्शन को निर्यात करने के लिए व्यवस्थित करता हूं। मुझे लगता है कि यह पठनीयता और समाधान की अवधारणा को आसान बनाता है। मैं एक नज़र में बता सकता हूं कि मैं किस तरह के निर्माण का उपयोग करने का इरादा कर रहा हूं। कुदोस मेरी तरह सोचने के लिए;)
सुकिमा

जवाबों:


173

कॉमनजेएस मॉड्यूल निर्यात की गई संपत्तियों को परिभाषित करने के दो तरीके देते हैं। किसी भी स्थिति में आप एक ऑब्जेक्ट / फ़ंक्शन लौटा रहे हैं। क्योंकि फ़ंक्शंस जावास्क्रिप्ट में प्रथम श्रेणी के नागरिक हैं, वे ऑब्जेक्ट्स की तरह कार्य कर सकते हैं (तकनीकी रूप से वे ऑब्जेक्ट हैं)। उस newकीवर्ड के उपयोग के बारे में आपके प्रश्न का एक सरल उत्तर है: हाँ। मैं समझाता हूँ ...

मॉड्यूल निर्यात करता है

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

मॉड्यूल कैसे परिभाषित किया जाता है, इसका छद्म कोड उदाहरण:

var theModule = {
  exports: {}
};

(function(module, exports, require) {

  // Your module code goes here

})(theModule, theModule.exports, theRequireFunction);

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

कंस्ट्रक्टर के साथ की आवश्यकता है

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

तो निम्नलिखित पूरी तरह से अच्छा कोड है और मैं व्यक्तिगत रूप से इसे प्रोत्साहित करता हूं:

// My module
function MyObject(bar) {
  this.bar = bar;
}

MyObject.prototype.foo = function foo() {
  console.log(this.bar);
};

module.exports = MyObject;

// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"

गैर-निर्माणकर्ताओं के लिए आवश्यकता

समान कार्य गैर-निर्माता के लिए जाता है जैसे कार्य:

// My Module
exports.someFunction = function someFunction(msg) {
  console.log(msg);
}

// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"

2
क्या मुझे शॉर्ट के लिए ('./ my-object.js') ("फोबार") की आवश्यकता हो सकती है? या एक अलग उपयोग के मामले के लिए आवश्यकता ('मॉड्यूल') (परम) सिंटैक्स है?
हम्पस अह्लग्रेन

1
कुछ भी नहीं रोक रहा है, यह सब सिर्फ जावास्क्रिप्ट है। तो हाँ आप छोटे वाक्यविन्यास का उपयोग कर सकते हैं।
सुकीमा

3
एक मॉड्यूल को कैसे परिभाषित किया जाता है इसका छद्म-कोड उदाहरण Node.js मॉड्यूल सिस्टम की मेरी समझ को पूरी तरह से साफ़ कर चुका है। धन्यवाद!
निटैक्स

130

मेरी राय में, नोड के कुछ उदाहरण काफी विपरीत हैं।

आप वास्तविक दुनिया में ऐसा कुछ देखने की उम्मीद कर सकते हैं

// square.js
function Square(width) {

  if (!(this instanceof Square)) {
    return new Square(width);
  }

  this.width = width;
};

Square.prototype.area = function area() {
  return Math.pow(this.width, 2);
};

module.exports = Square;

प्रयोग

var Square = require("./square");

// you can use `new` keyword
var s = new Square(5);
s.area(); // 25

// or you can skip it!
var s2 = Square(10);
s2.area(); // 100

ईएस 6 लोगों के लिए

class Square {
  constructor(width) {
    this.width = width;
  }
  area() {
    return Math.pow(this.width, 2);
  }
}

export default Square;

ईएस 6 में इसका उपयोग करना

import Square from "./square";
// ...

जब एक वर्ग का उपयोग कर, आप चाहिए का उपयोग newयह instatiate के लिए कीवर्ड। बाकी सब वही रहता है।


3
असामान्य रूप से संक्षिप्त संरचना!
क्रिस्टोफ मारोस जूल

1
तो यह आपके <ES6 उदाहरण में लगता है, इसका उपयोग करने newऔर न करने के बीच कोई अंतर नहीं है। लेकिन, यह केवल इसलिए कि आपके पास वह चेक है this instanceof square? यदि हां, तो वास्तव में यह क्या कर रहा है?
आर्किड्स

1
मेरे द्वारा पूछे गए प्रश्न और देखा गया, यदि यह दूसरों के लिए उपयोगी है: कहां importऔर exportपरिभाषित हैं? ये ECMAScript 6 (ES6) में आरक्षित कीवर्ड हैं। ईएस 6 से पहले, मॉड्यूल का प्रबंधन करने के लिए पुस्तकालयों का उपयोग करना पड़ता था। कॉमन जेजेएस लाइब्रेरी के मॉड्यूल्स के बाद नोड का मॉड्यूलेशन तैयार किया गया है। क्या है defaultमें export default Square? यह निर्दिष्ट करता है कि जब आप केवल 'फ़ाइल' आयात करते हैं तो क्या आयात करना है, न कि उस फ़ाइल से विशिष्ट निर्यात। : जब तक वे मौजूद हैं, मैं इन पृष्ठों उपयोगी पाया लिए spring.io/understanding/javascript-modules और exploringjs.com/es6/ch_modules.html
arichards

1

यह सवाल वास्तव में कैसे require()काम करता है के साथ कुछ भी नहीं है । मूल रूप से, आप module.exportsअपने मॉड्यूल में जो भी सेट करते require()हैं, वह इसके लिए कॉल से वापस आ जाएगा ।

यह इसके बराबर होगा:

var square = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

newकॉल करते समय कीवर्ड की कोई आवश्यकता नहीं है square। आप फ़ंक्शन आवृत्ति को स्वयं से नहीं लौटा रहे हैं square, आप अंत में एक नई वस्तु लौटा रहे हैं। इसलिए, आप इस फ़ंक्शन को सीधे कॉल कर सकते हैं।

चारों ओर अधिक जटिल तर्कों के लिए new, इसे देखें: क्या जावास्क्रिप्ट का "नया" कीवर्ड हानिकारक माना जाता है?


3
नए कीवर्ड का उपयोग करने में कुछ भी गलत नहीं है। मुझे इसके चारों ओर FUD से नफरत है।
सुकीमा

1
@ सुकिमा सहमत। : -D मैं इंगित कर रहा हूं कि इस मामले में यह क्यों मायने नहीं रखता है, और अन्य प्रश्नों से जुड़ा हुआ है newताकि अन्य लोग उस पर युद्ध में भाग ले सकें।
ब्रैड

0

उदाहरण कोड है:

मुख्य में

square(width,function (data)
{
   console.log(data.squareVal);
});

निम्नलिखित का उपयोग करने से काम हो सकता है

exports.square = function(width,callback)
{
     var aa = new Object();
     callback(aa.squareVal = width * width);    
}

0

अंत में, नोड जावास्क्रिप्ट के बारे में है। जेएस के पास कुछ पूरा करने का एक तरीका है, एक "कंस्ट्रक्टर" प्राप्त करने के लिए एक ही बात है, महत्वपूर्ण बात यह है कि एक फ़ंक्शन वापस करना है

इस तरह से आप वास्तव में एक नया फ़ंक्शन बना रहे हैं, जैसा कि हमने उदाहरण के लिए वेब ब्राउज़र वातावरण पर JS का उपयोग करके बनाया है।

व्यक्तिगत रूप से मैं प्रोटोटाइप दृष्टिकोण को पसंद करता हूं, जैसा कि सुकीमा ने इस पोस्ट पर सुझाव दिया: Node.js - एक निर्माता के रूप में मॉड्यूल.एक्सपोर्ट का उपयोग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.