require.main

Node.js

在 Python 中,可以通过如下的代码来判断,当前的文件是否是入口文件:

if __name__ == "__main__":
  print("entry file")

Node.js 中也可以写类似的判断,上面的 Python 代码等价于:

if (require.main === module) {
  console.log('entry file');
}

这样,当程序是作为入口文件被运行的时候,可以在 if 语句内直接运行业务代码;而如果这个文件是作为 API 被别的文件加载的,那么就只会暴露 API 接口,运行的部分交给使用者自行完成。

几点说明:

  1. 这里,require.main 是一个 Module(也就是 module 的类型,等价于 module.constructor)。而 module 则是 Node.js 在加载 JavaScript 文件的时候提供的,参考 Module.prototype._compile 函数调用的 wrapSafe 函数(见这里);
  2. 对于 Node.js 来说,这里的 require.main 就是命令行加载的文件,比如运行 node xxx.js 命令,那么 xxx.js 生成的 Module 就是这里的 require.main;而对于 Electron 来说,每一个 render 进程加载的 HTML 文件就是对应的 require.main 模块;
  3. 从 Node.js 代码可知,这里的 require.main 等价于 process.mainModule(见这里)。