WHATWG HTML规范:非解析器插入脚本的3.3.2循环多元素执行案例问询
要让步骤3.3.2的循环一次性执行多个脚本元素,核心是让「将尽快按顺序执行的脚本列表」中存在多个**已初始化(initialized)且非解析器插入(non parser-inserted)**的脚本,且触发循环的时机刚好覆盖这些脚本。最典型的场景有两种:
动态插入多个
async=false的脚本,加载完成顺序与插入顺序不一致
先创建并插入脚本A(src指向加载较慢的资源),紧接着插入脚本B(src指向加载较快的资源),同时给两个脚本显式设置async=false(动态插入的脚本默认async=true,必须关闭async才会进入有序执行队列)。脚本B会先完成加载进入
initialized状态,但因为它在有序列表里排在A之后,不会立即执行。等脚本A也加载完成进入initialized状态后,会触发步骤3.3的流程,进而启动步骤3.3.2的循环——此时列表里的A和B都满足条件,循环会按插入顺序依次执行A、B,一次性处理多个脚本元素。批量插入已预加载完成的动态脚本
提前通过<link rel="preload">预加载两个脚本资源,之后再动态创建对应脚本元素(设置async=false)并插入文档。这两个脚本元素会直接进入initialized状态并加入有序执行列表,当插入操作触发执行时机时,步骤3.3.2的循环会一次性遍历并执行这两个脚本。
这个循环的本质作用是:保证要求按顺序执行的非解析器插入脚本,在所有前置脚本准备完成后,批量按顺序执行,既严格遵守插入顺序,又避免单个脚本完成后触发多次零散执行。
内容的提问来源于stack exchange,提问作者MaximPro

