如何知道一段JS是在ES Module中执行还是在正则脚本中执行?

How to know whether a piece of JS is executed in an ES Module or a regular script?

我想知道一段JavaScript是在ES模块中执行还是在简单的脚本中执行

这是我到目前为止尝试过的:

function isEsm1() {
  try {
    // Script gives a syntax error during parsing when script is not an esm
    return Boolean(import.meta.url); 
  } catch(err) {
    return false;
  }
}

function isEsm2() {
  // will always return false, because `eval` always seems to be executed in regular script context
  try {
    return eval('Boolean(import.meta.url)'); 
  } catch(err) {
    return false;
  }
}


function isEsm3() {
  // Of course doesn't work, but had to try 
  return 'meta' in import; 
}

正则脚本是在浏览器中执行还是在其他上下文中执行?

在浏览器中,怎么样:

var anyvar = {};
var inModule = anyvar === window.anyvar;

如果您在一个模块中,则您没有在 window...

上声明任何内容

在 NodeJS 中,您可以使用 global 或此执行类似的操作:

let inModule = this === module.exports..

还没试过..但我想应该可以...

测试后,只需检查 this === undefined 就足以测试您是在模块内还是模块外执行..

在模块内部,这是未定义的(根据规范)。在全局范围内,this 指向全局 this,在浏览器上下文的情况下,它是 window 对象...

感谢 John Gorter 的回答中的讨论,我认为我们找到了方法。

console.log('In module: ' + (this === undefined));

就这么简单。在一个模块内(并且只在一个模块内(我希望如此)),this 将是 undefined。我在此处的 v8 文档中找到了它:https://v8.dev/features/modules#intro