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

how to programmatically determine, within the module, if javascript module was loaded via script src (not imported)

假设我有一个模块:

// 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()(作为加载的副作用)。

我怎样才能做到这一点?

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

模块可以导出东西,但它们不负责导入器如何(以及哪些)使用它们。

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

模块的代码被评估一次,然后它的导出被传递到导入它的每个地方。

该设计很好,但本质上使模块无法确定有关其导入程序的任何


另一方面,<script type="module"> 语法也不是为此设计的:它是通过 HTML 和 main 向浏览器发送信号的方式(又名“顶级”)模块,自行加载其依赖项(子模块)。


部分解决方案:

制作一个单个顶级模块,导入其他所有内容并通过"side effects"操作页面,避免通过脚本标签导入其他模块。此外,我建议您避免在非顶级模块中产生副作用,而应专注于导出。

如果有人真的想从他们的 HTML 中导入您的模块,他们仍然可以这样做:

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