如何在模块内以编程方式确定是否通过脚本src(未导入)加载了javascript模块

问题描述 投票:0回答:1

假设我有一个模块:

// module.js
export default function greet() { console.info( 'hello' ); }

如果模块通过以下方式加载:

<script type=module>
import greet from './module.js';
...
</script>

然后,我希望调用代码能够自行调用greet(),而无需自动调用它(正常情况)。

但是,如果模块通过以下方式加载:

<script type=module src="./module.js"></script>

然后,我希望模块立即调用greet()(作为加载的副作用)。

我该如何完成?

javascript browser es6-modules
1个回答
0
投票

不幸的是,这个问题与您先前的问题有相似的答案:不可能。

模块可以导出事物,但是它们对进口商如何使用(以及以何种方式使用)不负责。

模块被创建为独立且可重用,即使在同一页面上也无需重新评估:

对该模块的代码进行一次评估,然后将其导出传递到每个导入它的位置。

这种设计很好,但是从根本上来说,模块无法确定有关其进口商的[[任何内容。


另一方面,<script type="module">语法也不是为此目的而设计的:这是通过HTML向浏览器发送

main

(又名“ top-level”)模块的方式,自行加载其依赖项(子模块)。
部分解决方案:

制作

single

顶级模块,该模块将导入其他所有内容并通过“副作用”操作页面,并避免通过脚本标签导入其他模块。此外,我建议您避免在非顶级模块中产生副作用,而应专注于导出。而且,如果有人真的想从他们的HTML导入您的模块,他们仍然可以这样做:

<script type="module"> import greet from './module.js'; greet(); </script>

© www.soinside.com 2019 - 2024. All rights reserved.