javascript - 如何知道一段 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;
}
解决方案
常规脚本是在浏览器中执行还是在其他上下文中执行?
在浏览器中,如何:
var anyvar = {};
var inModule = anyvar === window.anyvar;
如果你在一个模块中,你没有在窗口上声明任何东西......
在 NodeJS 中,你可以对 global 或 this 做类似的事情:
let inModule = this === module.exports..
还没有尝试过..但我猜应该可以...
测试后,仅检查this === undefined
就足以测试您是在模块内执行还是在模块外执行..
在模块内部,这是未定义的(根据规范)。在全局范围内 this 指向全局 this,它是浏览器上下文中的窗口对象...
推荐阅读
- css - 背景图像没有显示css
- flutter - 如何在 Flutter 中接听电话或播放视频时自动停止音频播放?
- d3.js - 如何在d3地图中显示县提示?
- mysql - 我们如何在创建临时表块内的变量中使用声明和使用选择计数
- reactjs - 如何将 set 与字符串一起使用
- python - Python - 我们可以使用变量的值作为不同变量名称的一部分
- c++ - 带有可变参数的嵌套宏在 GCC 中编译,但在 MSVC 中不编译
- python - 在 Python 中,为什么最低(最小)浮点值的有效数字与最大的不同?
- templates - html 模板和 css 主题/突出显示的完全本地定制
- laravel - Laravel 更新查询使用