如何在模块内以编程方式确定 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>
假设我有一个模块:
// 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>