Sama seperti di Python, saya selalu menemukan diri saya mencoba mengingat bagaimana menulis potongan kode sialan ini. Jadi saya memutuskan untuk membuat modul sederhana untuk itu. Butuh sedikit waktu untuk saya kembangkan karena mengakses informasi modul pemanggil tidak mudah, tetapi menyenangkan melihat bagaimana hal itu bisa dilakukan.
Jadi idenya adalah memanggil modul dan bertanya apakah modul pemanggil adalah yang utama. Kita harus mencari tahu modul fungsi pemanggil. Pendekatan pertama saya adalah variasi dari jawaban yang diterima:
module.exports = function () {
return require.main === module.parent;
};
Tapi itu tidak dijamin berhasil. module.parent
menunjuk ke modul yang memuat kita ke dalam memori, bukan yang memanggil kita. Jika itu adalah modul pemanggil yang memuat modul pembantu ini ke dalam memori, itu tidak masalah. Tetapi jika tidak, kita tidak berdaya. Jadi kita perlu mencoba sesuatu yang lain. Solusi saya adalah menghasilkan jejak stack dan mendapatkan nama modul pemanggil dari sana:
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;
};
Sekarang kita bisa melakukan:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
Atau lebih mudah dibaca:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
Mustahil untuk dilupakan :-)