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

nic*_*ojs 6 javascript ecmascript-6 es6-modules

我想知道一段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; 
}
Run Code Online (Sandbox Code Playgroud)

nic*_*ojs 1

感谢约翰·戈特的回答中的讨论,我认为我们已经找到了一种方法。

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

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