在 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(见这里)。