【发布时间】:2012-02-10 11:17:49
【问题描述】:
我刚刚开始使用 node.js,我对 Python 有一些经验。在 Python 中,我可以检查 __name__ 变量是否设置为 "__main__",如果是,我会知道我的脚本正在直接运行。在这种情况下,我可以运行测试代码或以其他方式直接使用该模块。
node.js 中有类似的东西吗?
【问题讨论】:
我刚刚开始使用 node.js,我对 Python 有一些经验。在 Python 中,我可以检查 __name__ 变量是否设置为 "__main__",如果是,我会知道我的脚本正在直接运行。在这种情况下,我可以运行测试代码或以其他方式直接使用该模块。
node.js 中有类似的东西吗?
【问题讨论】:
您可以使用module.parent 来确定当前脚本是否被另一个脚本加载。
例如
a.js:
if (!module.parent) {
console.log("I'm parent");
} else {
console.log("I'm child");
}
b.js:
require('./a')
运行node a.js会输出:
I'm parent
运行node b.js会输出:
I'm child
【讨论】:
module.main,类似
require.main === module(官方推荐nodejs.org/api/modules.html)。
module.parent 似乎比比较 require.main 和 module 更直观。
module.parent 自节点 14.6.0 起已弃用 - 请参阅 nodejs.org/api/deprecations.html#DEP0144。正如stackoverflow.com/a/21311382/398713 所说,检查require.main === module 现在是推荐的方法。
接受的答案很好。为了完整起见,我从the official documentation 添加了这个:
当一个文件直接从 Node 运行时,require.main 被设置为它的module。也就是说你可以通过测试直接判断一个文件是否已经运行过
require.main === module
对于文件"foo.js",如果通过node foo.js 运行,则为true,但如果通过require('./foo') 运行,则为false。
因为module提供了一个filename属性(一般相当于__filename),所以可以通过检查require.main.filename获得当前应用的入口点。
【讨论】:
!module.parent 和 require.main === module 两个选项都有效。
如果您有兴趣了解更多详情,请阅读my detailed blog post about this topic。
【讨论】:
module.parent 自节点 14.6.0 起已弃用 - 请参阅 nodejs.org/api/deprecations.html#DEP0144。就像stackoverflow.com/a/21311382/398713 所说,检查require.main === module 现在是推荐的方法。