试图了解有关延迟和异步的 W3C 规范?

Trying to understand the W3C specifications about defer and async?

参见:https://www.w3.org/TR/html5/scripting-1.html#attr-script-async

link 将为您提供有关 "defer" 和 "async" 的 W3C 规范。他们是这样说的:

If neither attribute is present, then the script is fetched and executed immediately, before the user agent continues parsing the page.

如果你有 "script.js",那么你可以用它做以下事情:

我的英语不太好,所以我现在在想"is fetched"这个词。

If neither attribute is present, then the script is fetched and executed immediately

我看到 "is fetched" 为:

是吗?所以他们使用 "fetched",因为如果你说 "downloaded" 那么不包括缓存?

我想讨论非缓存的情况,所以在这样的情况下:

If neither attribute is present, then the script is downloaded and executed immediately

我可以这么说吗?如果是,那么我还有最后一个问题。

现代浏览器具有预加载扫描程序,扫描 javascript 文件以提前下载。所以我想:也许预加载扫描器已经完成了 js 文件的下载,在 "HTML parser" 到达脚本标签之前。因此 "HTML parser" 可能正忙于脚本标记之前的其他 html,而浏览器已经完成下载。

到现在都是这样吗?我自己不确定。但如果那是真的,那么我不理解 W3C 规范,因为他们说(如果之前的一切都是真的):

If neither attribute is present, then the script is downloaded and executed immediately

那么"executed immediately"下载后呢?如果您处于同步环境中,那么在执行 JavaScript.

之前,该脚本标记之前的所有 html 必须位于 DOM 中

所以如果这一切都是真的,那么我不明白为什么他们可以说:"executed immediately"?或者预加载扫描器是非官方的,所以 W3C 在他们的文档中忽略了这一点。那么在这种情况下,W3C 规范实际上只适用于旧版浏览器吗? 或者浏览器是否可以从预加载扫描器中获取脚本,这将在 "HTML parser" 位于脚本标记处的那一刻发生,也许我必须这样看?

或者我怎么才能看到这个?

有一整套标准准确描述了 "fetching" 的含义。 Fetch Standard

除了缓存和下载,还必须考虑服务工作人员的行为。本质上,"executed immediately",这意味着如果缺少 async 和 defer 属性,则脚本必须在当解析器遇到 </script> 结束标记时,DOM 存在。解析器在脚本 运行 时暂停,只有在脚本完成 运行ning.

后才会恢复

预加载扫描器可以导致脚本被下载,但 运行 不会。这意味着当解析器实际处理脚本元素和运行它的脚本时,脚本将在缓存中(或在途中)可用。