首页 > 解决方案 > 多个模块是否被视为单独的宏任务?

问题描述

想象一下,我有两个看起来像这样的模块:

<script type=“module” src="../js/module1.js"></script>
<script type=“module” src="../js/module2.js"></script>

它们都没有相互导入。

如果module1在之前执行module2,这是否意味着何时module1从调用堆栈中弹出(并且在微队列被清空并且可能完成一些渲染之后)调用堆栈将为空 - 可能允许module2被推送到它上面?基本上,module1&module2被视为两个独立的宏任务还是被视为一个大脚本?

标签: javascripthtmles6-modules

解决方案


是的,它们基本上被视为两个“宏任务”,即使它还不是事件循环的真正一部分,所以它们并不是真正排队的“任务”。

您的脚本元素是module没有async属性的脚本,我们属于处理模型的这一步,它将在文档完成解析时将其添加到将执行的脚本列表中,该列表将在处理“结束”时清空.
我们要查看的下一点是“运行模块脚本”算法,作为执行脚本的一部分,它将在前一个脚本执行结束或脚本准备就绪之间的任何最后一个被调用块算法。

从这个“运行模块脚本”算法中,我们可以看到浏览器最后必须

  1. 使用设置运行脚本后进行清理。

运行算法本身后的清理

[...]执行微任务检查点。.

因此,如果它们确实被视为两个独立的任务,这非常像。

关于绘画,它可能实际上发生,因为在解析结束时,在执行这些脚本时,浏览器必须

  1. 旋转事件循环,直到第一个script...

并且在旋转事件循环时浏览器确实可以绘制。


推荐阅读