Cũng giống như trong Python, tôi luôn luôn tìm thấy bản thân tôi đang cố 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ó. Nó đã cho tôi một chút để phát triển kể từ khi truy cập thông tin mô-đun của người gọi không phải là straighforward, nhưng nó là thú vị để xem làm thế nào nó có thể được thực hiện.
Vì vậy, ý tưởng là gọi mô-đun và hỏi xem mô-đun người gọi có phải là mô-đun chính hay không. Chúng ta phải tìm ra mô-đun của hàm người gọi. Cách tiếp cận đầu tiên của tôi là 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 để hoạt động. module.parent
trỏ đến mô-đun mà tải chúng tôi vào bộ nhớ, chứ không phải người gọi cho 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ì điều đó là tốt. 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ử cái gì khác. Giải pháp của tôi là để tạo ra một vết đống và nhận được tên module 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
}
Impossible để quên :-)
Nguồn
2017-10-26 20:10:34
Bản sao có thể có của [node.js tương đương với python's nếu \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'] (http://stackoverflow.com/question/4981891/node-js-equivalent-of-pythons-if-name-main) – GingerPlusPlus