Giống như trong Python, tôi luôn thấy mình cố gắng nhớ cách viết đoạn mã chết tiệt này. Vì vậy, tôi quyết định tạo ra một mô-đun đơn giản cho nó. Tôi phải mất một chút để phát triển vì việc truy cập thông tin mô-đun của người gọi không phải là khó khăn, nhưng thật vui khi thấy nó có thể được thực hiện như thế nào.
Vì vậy, ý tưởng là gọi một mô-đun và hỏi nó nếu mô-đun người gọi là mô-đun chính. Chúng ta phải tìm ra mô-đun của chức năng người gọi. Cách tiếp cận đầu tiên của tôi là một biến thể của câu trả lời được chấp nhận:
module.exports = function () {
return require.main === module.parent;
};
Nhưng điều đó không được đảm bảo để làm việc. module.parent
chỉ vào mô-đun đã tải chúng tôi vào bộ nhớ, không phải là mô-đun gọi chúng tôi. Nếu đó là mô-đun người gọi đã tải mô-đun trợ giúp này vào bộ nhớ, thì tốt thôi. Nhưng nếu không, chúng tôi bất lực. Vì vậy, chúng ta cần phải thử một cái gì đó khác. Giải pháp của tôi là tạo ra một dấu vết ngăn xếp và lấy tên mô-đun của người gọi từ đó:
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;
};
Bây giờ chúng ta có thể làm:
if (require("./is-main-module")()) { // notice the `()` at the end
// do something
} else {
// do something else
}
Hoặc dễ đọc hơn:
const isMainModule = require("./is-main-module");
if (isMainModule()) {
// do something
} else {
// do something else
}
Không thể nào quên :-)