NodeJS 节点. js,需要.main ===模块

vfh0ocws  于 2023-02-12  发布在  Node.js
关注(0)|答案(4)|浏览(167)

在Node.JS文档中,我发现了一句话
当一个文件直接从Node.js运行时,require.main被设置为它的模块。这意味着可以通过测试require.main === module来确定一个文件是否已经直接运行。
我想问什么是main在这里,我找不到这个main的定义在源代码中,任何人都可以帮助,谢谢!

s3fp2yjn

s3fp2yjn1#

require是一个函数。.main是该函数的一个属性,因此您可以引用require.main。您所引用的文档部分说明您可以编写如下代码:

if (require.main === module) {
     // this module was run directly from the command line as in node xxx.js
} else {
     // this module was not run directly from the command line and probably loaded by something else
}

上面代码中的module是传递给node.js加载的所有模块的变量,因此代码基本上表示如果require.main是当前模块,则当前模块是从命令行加载的模块。
设置该属性的代码如下:www.example.com网站。https://github.com/nodejs/node/blob/master/lib/internal/modules/cjs/helpers.js#L44.

sy5wg1nm

sy5wg1nm2#

当使用Node.js运行ECMAScript Modules时,require.main不可用。从节点13.9.0开始,没有一种简洁的方法来确定一个模块是直接运行的还是由另一个模块导入的。import.meta.main值可能允许将来进行这样的检查(如果您认为这有意义,请评论the modules issue)。
作为一种解决方法,可以通过比较import.meta.url值与process.argv[1]来检查当前ES模块是否直接运行。例如:

import { fileURLToPath } from 'url';
import process from 'process';

if (process.argv[1] === fileURLToPath(import.meta.url)) {
  // The script was run directly.
}

这不处理在没有.js扩展名的情况下调用脚本(例如node script代替node script.js)。要处理这种情况,可以从import.meta.urlprocess.argv[1]中删除任何扩展名。
es-main package(注意:I am the author)提供了一种检查ES模块是否直接运行的方法,说明了它可以运行的不同方式(有或没有扩展)。

import esMain from 'es-main';

if (esMain(import.meta)) {
  // The script was run directly.
}
0x6upsns

0x6upsns3#

我回答得很晚了,但我把它留在这里供参考。
1.当一个文件是一个程序的入口点时,它就是主模块。例如,node index.js OR npm startindex.js就是主模块&我们应用程序的入口点。
1.但是我们可能需要把它作为一个模块来运行,而不是作为一个主模块来运行。如果我们像这样requireindex.js,就会发生这种情况:
node -e "require('./index.js')(5,6)"
我们可以用两种方法检查一个文件是否是主模块。

  1. require.main === module
  2. module.parent === null
    假设我们有一个简单的index.js文件,当它是主模块时,它是console.log(),当它不是主模块时,它导出一个求和函数:
if(require.main === module) {
 // it is the main entry point of the application
 // do some stuff here
 console.log('i m the entry point of the app')
} else{
 // its not the entry point of the app, and it behaves as 
 // a module
 module.exports = (num1, num2) => {
   console.log('--sum is:',num1+num2)
  }
 }

检查上述条件的方法:

  1. node index.js--〉将打印i m the entry point of the app
  2. node -e "require('./index.js')(5,6)"--〉将打印--sum is: 11
aamkag61

aamkag614#

对于ECMAScript模块或扩展名为.mjs的文件,我使用它的一个更简单的版本:

if (import.meta.url.endsWith(process.argv[1])) {
  // run the app
}

相关问题