首页 > 解决方案 > 如何知道一段 JS 是在 ES Module 中执行还是在常规脚本中执行?

问题描述

我想知道一段 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; 
}

标签: javascriptecmascript-6es6-modules

解决方案


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

在浏览器中,如何:

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

如果你在一个模块中,你没有在窗口上声明任何东西......

在 NodeJS 中,你可以对 global 或 this 做类似的事情:

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

还没有尝试过..但我猜应该可以...

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

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


推荐阅读