通过 <script src=""> 加载 JavaScript ES6 模块并在 <script> 标签中导入所有导出是否相同?

问题描述

无法理解我刚刚在 the Deno manual section on the deno bundle command 末尾阅读的两个示例之间的区别:

捆绑包也可以在网络浏览器中加载。捆绑包是一个 自包含的 ES 模块,因此 type 的属性必须设置为 “模块”。例如:

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

或者你可以将其导入到另一个 ES 模块中使用:

<script type="module">
  import * as website from "website.bundle.js";
</script>

我的印象是这两种形式都达到了相同的效果(即“fetched and executed immediately,before the browser continues to parse the page”),当遵循脚本或想要缩小内容范围时使用后者是导入的(例如,如 this answer 中所示)。


这可能被认为是其他问题的重复(见列表底部),但这些答案对我帮助不大,而且辅助资料似乎也没有表明我的假设是否正确。 (另一方面,我很有可能忽略了一些明显的东西,不得不提高我的阅读理解能力......)

解决方法

我的印象是两种形式都能达到相同的效果

是的,这两个效果是一样的

(即“在浏览器继续之前立即获取并执行 解析页面"),

不,默认情况下,任何带有 <scripttype="module" 都会 defer,因此加载不会阻止解析。然后,在解析之后和 DOMContentLoaded 触发之前,所有延迟的脚本都会按照它们出现的顺序执行。

后者在脚本跟随或 想要缩小进口的范围(例如,如此处所见) 回答)。

您想使用哪个还取决于捆绑包中完成的工作。如果捆绑包仅包含库,并且不会产生任何副作用(即与页面交互、渲染等),那么您可能需要导入它以便您可以使用这些函数。

如果它确实有副作用(即渲染到 DOM 的 React 应用程序),并且是自包含的,那么只包含标签就足以让它开始

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...