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

安德鲁·M·安德鲁斯三世

假设我有一个模块:

// 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向浏览器发送信号的方法,即主模块(又称“顶层”)自行加载其依赖项(子模块)。


部分解决方案:

创建一个顶级模块,该模块可以导入其他所有内容并通过“副作用”操作页面,并避免通过脚本标签导入其他模块。此外,我建议您避免在非顶级模块中产生副作用,而应将重点放在出口上。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何确定是否通过脚本src导入或加载了javascript模块?

如何以编程方式知道模块是否为核心模块?

确定是否通过NodeJS模块直接调用脚本

以编程方式加载Common Lisp模块

如何在ipyhon中将脚本作为模块导入?

如何在 Angular 中从节点模块导入单个脚本

在Julia中以编程方式/动态方式导入模块

如何在Python中以编程方式调用函数也以编程方式指定模块?

如何在@INC之外导入未以.pm结尾的perl模块?

NodeJS是否支持“导入”样式模块加载?

在Angular 8+中以编程方式加载模块(是否已支持Ivy?)

在Angular 8+中以编程方式加载模块(是否已支持Ivy?)

如何在测试脚本中从项目中加载模块?

脚本编译后如何在python中重新加载模块?

如何以编程方式更新节点模块

如何在Angular 9中通过变量加载动态模块?

如何重新加载所有导入的模块?

如何从加载了imp的模块中“导入*”?

从“ <模块>导入*”后如何重新加载?

在Angular 2中以编程方式加载和卸载模块

重新加载导入的模块

如何确定Xcode是否支持模块?

如何以编程方式(在Shell脚本中)确定是否有更改?

如何以编程方式确定是否存在未提交的更改?

是否可以从模块中将〜/ go / src /导入本地包?

以编程方式检测命令是否可以作为模块运行

在JavaScript中,是否可以在<script> </ script>标记中导入JS模块而不加载外部文件?

如何检查是否已导入python模块?

如何在Julia中以编程方式确定未参数化的类型名称?