问题描述
想象一下,我有两个看起来像这样的模块:
<script type=“module” src="../js/module1.js"></script>
<script type=“module” src="../js/module2.js"></script>
它们都不相互导入。
如果module1
在module2
之前执行,那是否意味着当module1
从调用堆栈中弹出时(以及在清空微队列并可能完成某些渲染之后)调用堆栈将为空-可能允许module2
继续执行吗?基本上,module1
和module2
被视为两个单独的宏任务还是被视为一个大脚本?
解决方法
是的,尽管它们实际上还不是事件循环的一部分,但它们基本上被视为两个“宏任务”,因此它们并没有真正排在原本应该排队的“任务”中。
您的脚本元素是module
个没有async
属性的脚本,我们属于处理模型的this step,它将添加到list of scripts that will execute when the document has finished parsing中,它将得到在处理的"the end"处清空。
我们要研究的下一点是"run a module script"算法,该算法将在上一个脚本执行结束或脚本准备就绪之间的任何最后一个被称为“ {{3}”, }算法。
通过这种Execute the script block算法,我们可以看到浏览器最终必须
Clean up after running script算法本身也可以
[...] clean up after running。
因此,很像它们确实被视为两个单独的任务。
关于绘画,它实际上可能会发生,因为在解析perform a microtask checkpoint.时,执行这些脚本时,浏览器必须
- the end直到第一个
script
...
并且Spin the event loop浏览器确实可以绘画。