如何知道一段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
我想知道一段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