【问题标题】:Can I know, in node.js, if my script is being run directly or being loaded by another script?我可以知道,在 node.js 中,我的脚本是直接运行还是被另一个脚本加载?
【发布时间】:2012-02-10 11:17:49
【问题描述】:

我刚刚开始使用 node.js,我对 Python 有一些经验。在 Python 中,我可以检查 __name__ 变量是否设置为 "__main__",如果是,我会知道我的脚本正在直接运行。在这种情况下,我可以运行测试代码或以其他方式直接使用该模块。

node.js 中有类似的东西吗?

【问题讨论】:

标签: node.js module


【解决方案1】:

您可以使用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

【讨论】:

  • 绝对完美。看起来也比 Python 干净得多
  • 也可以使用module.main,类似
  • @Raynos 我想你的意思是require.main === module(官方推荐nodejs.org/api/modules.html)。
  • 也许只有我一个人,但检查 module.parent 似乎比比较 require.mainmodule 更直观。
  • 仅供参考,module.parent 自节点 14.6.0 起已弃用 - 请参阅 nodejs.org/api/deprecations.html#DEP0144。正如stackoverflow.com/a/21311382/398713 所说,检查require.main === module 现在是推荐的方法。
【解决方案2】:

接受的答案很好。为了完整起见,我从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获得当前应用的入口点。

【讨论】:

  • 已接受的答案现已弃用,因此这是最好的答案
【解决方案3】:

!module.parentrequire.main === module 两个选项都有效。 如果您有兴趣了解更多详情,请阅读my detailed blog post about this topic

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多