在 Python 中,可以通过如下的代码来判断,当前的文件是否是入口文件:
if __name__ == "__main__":
print("entry file")
Node.js 中也可以写类似的判断,上面的 Python 代码等价于:
if (require.main === module) {
console.log('entry file');
}
这样,当程序是作为入口文件被运行的时候,可以在 if
语句内直接运行业务代码;而如果这个文件是作为 API 被别的文件加载的,那么就只会暴露 API 接口,运行的部分交给使用者自行完成。
几点说明:
- 这里,
require.main
是一个Module
(也就是module
的类型,等价于module.constructor
)。而module
则是 Node.js 在加载 JavaScript 文件的时候提供的,参考Module.prototype._compile
函数调用的wrapSafe
函数(见这里); - 对于 Node.js 来说,这里的
require.main
就是命令行加载的文件,比如运行node xxx.js
命令,那么xxx.js
生成的 Module 就是这里的require.main
;而对于 Electron 来说,每一个 render 进程加载的 HTML 文件就是对应的require.main
模块; - 从 Node.js 代码可知,这里的
require.main
等价于process.mainModule
(见这里)。