Как и в Python, я всегда пытаюсь вспомнить, как написать этот проклятый фрагмент кода. Поэтому я решил создать для него простой модуль. Мне потребовалось немного времени для разработки, так как доступ к информации модуля вызывающего абонента не прост, но было интересно посмотреть, как это можно сделать.
Таким образом, идея состоит в том, чтобы вызвать модуль и спросить его, является ли модуль вызывающего абонента основным. Мы должны выяснить модуль функции звонящего. Мой первый подход был вариантом принятого ответа:
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
}
Невозможно забыть :-)