我可以在node.js中知道我的脚本是直接运行还是被另一个脚本加载?

Hub*_*bro 57 module node.js

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

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

qia*_*iao 90

您可以使用 module.parent来确定当前脚本是否由另一个脚本加载.

例如

a.js:

if (!module.parent) {
    console.log("I'm parent");
} else {
    console.log("I'm child");
}
Run Code Online (Sandbox Code Playgroud)

b.js:

require('./a')
Run Code Online (Sandbox Code Playgroud)

node a.js将输出:

I'm parent
Run Code Online (Sandbox Code Playgroud)

node b.js将输出:

I'm child
Run Code Online (Sandbox Code Playgroud)

  • @Raynos我认为你的意思是`require.main === module`(http://nodejs.org/api/modules.html上的官方推荐). (10认同)
  • 也许它只是我,但检查`module.parent`似乎比将`require.main`与`module`相比更直观. (3认同)
  • 仅供参考,从 Node 14.6.0 开始,`module.parent` 已被弃用 - 请参阅 https://nodejs.org/api/deprecations.html#DEP0144。就像 /sf/answers/1491796771/ 所说,检查 `require.main === module` 现在是推荐的方法。 (2认同)

Dav*_*aun 36

接受的答案很好.我在官方文档中添加了这个完整性:

访问主模块

当文件直接从Node运行时,require.main设置为它module.这意味着您可以通过测试确定文件是否已直接运行

require.main === module
Run Code Online (Sandbox Code Playgroud)

对于一个文件"foo.js",这将是true运行node foo.js,但false如果运行require('./foo').

因为module提供了一个filename属性(通常相当于__filename),所以可以通过检查获得当前应用程序的入口点require.main.filename.


Tho*_*enz 9

两种选择!module.parentrequire.main === module工作.如果您对更多细节感兴趣,请阅读我关于此主题的详细博客文章.