2017-08-01 10 views
5

मैं नोड.जे.एस. पर कुछ ऑनलाइन ट्यूटोरियल के माध्यम से जा रहा हूं। क्या मैं समझ गया कि, require(./file-path) समारोह का उपयोग करने पर, नोड है कि फाइल की विषय-वस्तु हो जाता है और एक तुरंत लागू समारोहहमें मॉड्यूल.एक्सपोर्ट को पैरामीटर के रूप में पास करने की आवश्यकता क्यों है क्योंकि हम पहले से ही पैरामीटर के रूप में मॉड्यूल पास कर रहे हैं?

(function(exports, require, module, __filename, __dirname) { 
    // content 
}()) 

अंदर लपेटता मैं exports और module.exports के बीच का अंतर समझ में आ रहा है। उपरोक्त प्रश्न को खोजने पर इंटरनेट पर मैं यही देख सकता हूं। लेकिन मेरा सवाल क्या है, हमें रैपिंग आईआईएफई में module.exports और module पास करने की आवश्यकता क्यों है? हम अकेले मॉड्यूल पास कर सकते थे और फिर module.exports प्राप्त कर सकते थे। क्या ऐसा करने पर कोई फायदा है? आम तौर पर जब हम किसी ऑब्जेक्ट को फ़ंक्शन पर पास करते हैं, तो हमें अतिरिक्त रूप से object.property पास नहीं करना पड़ता है।

उत्तर

3

उत्तर है: ऐतिहासिक कारण।

आप सही हैं, हम केवल module और exports की आवश्यकता नहीं होगी, लेकिन यह अभी भी पीछे की संगतता के लिए है।

यह ऐसा समय होता था जब मॉड्यूल रैपर को हर पैच रिलीज में काफी बदल दिया गया था।

नोड 0.1.11 में मॉड्यूल आवरण था:

var wrapper = "function (__filename) { "+ 
       " var onLoad; "+ 
       " var onExit; "+ 
       " var exports = this; "+ 
       content+ 
       "\n"+ 
       " this.__onLoad = onLoad;\n"+ 
       " this.__onExit = onExit;\n"+ 
       "};\n"; 

देखें: https://github.com/nodejs/node/blob/v0.1.11/src/node.js#L167#L177

आप exports देख सकते हैं this कि आवरण समारोह के साथ बुलाया गया था के रूप में ही किया गया था। आप इसे एक नई वस्तु के साथ स्वैप नहीं कर सके और आप इसमें कुछ आरक्षित कुंजी भी नहीं जोड़ पाए - उदा। आप __onExit नामक संपत्ति को सुरक्षित रूप से निर्यात नहीं कर सके।

तो 0.1.12 में यह था:

var wrapper = "function (__filename, exports) { " + content + "\n};"; 

देखें: https://github.com/nodejs/node/blob/v0.1.12/src/node.js#L243-L245

यहाँ exports एक वस्तु तर्क के रूप में आपूर्ति की थी, लेकिन आप एक नया उद्देश्य के साथ यह स्वैप नहीं कर सकता है, आप केवल उस ऑब्जेक्ट से गुण जोड़ या निकाल सकते हैं जो आपको मिला है।

तो 0.1.13 इस संबंध के लिए पहले, require और include था अर्थात्:

var wrapper = "function (__filename, exports, require, include) { " + content + "\n};"; 

देखें: https://github.com/nodejs/node/blob/v0.1.13/src/node.js#L225-L227

तो 0.1.14 में __module (अंडरस्कोर से) के लिए पहली बार था आवरण (और कहा कि include गिरा):

var wrapper = "var __wrap__ = function (__module, __filename, exports, require) { " 
      + content 
      + "\n}; __wrap__;"; 

देखें: https://github.com/nodejs/node/blob/v0.1.14/src/node.js#L280-L284

और 0.1।16 आवरण में एक module तर्क (कोई अंडरस्कोर के साथ) के लिए पहली बार था:

var wrapper = "var __wrap__ = function (exports, require, module, __filename) { " 
      + content 
      + "\n}; __wrap__;"; 

देखें: https://github.com/nodejs/node/blob/v0.1.16/src/node.js#L444-L448

यह उस के बाद कई बार बदल गया है लेकिन इस बार कि module बनाने की शुरुआत की हो गई है exports किसी भी अधिक है लेकिन अभी भी एक उपयोगी शॉर्टकट आवश्यक नहीं है, तो आप उपयोग करने की अनुमति:

exports.a = 1; 
exports.b = 2; 
exports.c = 3; 

के बजाय:

0,123,
module.exports.a = 1; 
module.exports.b = 2; 
module.exports.c = 3; 

हालांकि व्यवहार में अगर वहाँ था कोई exports तो एक आम तौर पर लिखना होगा:

const exports = module.exports; 
exports.a = 1; 
exports.b = 2; 
exports.c = 3; 

या अधिक होने की संभावना:

:

module.exports = { 
    a: 1, 
    b: 2, 
    c: 3, 
}; 

या, स्थैतिक विश्लेषण उपकरणों में कुछ जांच के लिए

const a = 1; 
const b = 2; 
const c = 3; 
module.exports = { a, b, c }; 

ऐसा करने के कई तरीके हैं, यह एक सुंदर है लचीला तंत्र।

+0

मुझे इसे मारो। मुझे याद करने से पहले था। – OrangeDog

2

मूल रूप से यह केवल exports और require था। बाद में, module को निर्यात वस्तु को पूरी तरह से ओवरराइड करने की अनुमति देने के लिए, पीछे की ओर संगत तरीके से जोड़ा गया था (अन्य चीजों के साथ)।

+0

मुझे देखने दो कि क्या मुझे परिवर्तन मिल सकता है। मुझे लगता है कि यह कहीं v0.6 के आसपास है। – OrangeDog

+0

बाद में जब उन्होंने मॉड्यूल जोड़ा, तो उन्होंने मॉड्यूल.एक्सपोर्ट को क्यों नहीं हटाया? वे इसे मॉड्यूल ऑब्जेक्ट से वैसे भी प्राप्त कर सकते हैं। –

+0

@MELWINVINCENT क्योंकि नए प्लेटफ़ॉर्म का उपयोग करके पुराने मॉड्यूल और पुराने मॉड्यूल का उपयोग करके नए मॉड्यूल दोनों को तोड़ दिया होगा। – OrangeDog

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