पाइथन की तरह, मैं हमेशा अपने आप को यह याद रखने की कोशिश करता हूं कि इस गॉडडैम कोड स्निपेट को कैसे लिखा जाए। इसलिए मैंने इसके लिए एक सरल मॉड्यूल बनाने का फैसला किया। मुझे कॉल करने के लिए मॉड्यूल की जानकारी तक पहुँचने के बाद से विकसित करने में थोड़ा समय लगा, लेकिन यह देखना मजेदार था कि यह कैसे किया जा सकता है।
तो विचार एक मॉड्यूल को कॉल करना है और यह पूछना है कि क्या कॉलर मॉड्यूल मुख्य है। हमें कॉलर फ़ंक्शन के मॉड्यूल का पता लगाना होगा। मेरा पहला दृष्टिकोण स्वीकृत उत्तर की भिन्नता थी:
module.exports = function () {
return require.main === module.parent;
};
लेकिन वह काम करने की गारंटी नहीं है। module.parent
मॉड्यूल को इंगित करता है जो हमें मेमोरी में लोड करता है, न कि हमें कॉल करने वाला। यदि यह कॉलर मॉड्यूल था जो इस सहायक मॉड्यूल को मेमोरी में लोड करता है, तो यह ठीक है। लेकिन अगर यह नहीं था, तो हम असहाय हैं। इसलिए हमें कुछ और प्रयास करने की जरूरत है। मेरा समाधान एक स्टैक ट्रेस उत्पन्न करना और वहां से कॉलर के मॉड्यूल का नाम प्राप्त करना था:
module.exports = function () {
// generate a stack trace
const stack = (new Error()).stack;
// the third line refers to our caller
const stackLine = stack.split("\n")[2];
// extract the module name from that line
const callerModuleName = /\((.*):\d+:\d+\)$/.exec(stackLine)[1];
return require.main.filename === callerModuleName;
};
अब हम कर सकते हैं:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
या अधिक पठनीय:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
भुलाना असंभव है :-)