Як і в 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
}
Неможливо забути :-)