试图了解有关延迟和异步的 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",那么你可以用它做以下事情:
- 正在下载文件
- 从缓存中获取文件
- "Reading"它,因为在真正执行代码之前,必须读取文件中的所有代码(否则提升不可能存在)
- 执行代码
我的英语不太好,所以我现在在想"is fetched"这个词。
If neither attribute is present, then the script is fetched and executed immediately
我看到 "is fetched" 为:
- 浏览器可以从缓存中获取script.js
- 浏览器可以下载script.js
是吗?所以他们使用 "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.
后才会恢复
预加载扫描器可以导致脚本被下载,但 运行 不会。这意味着当解析器实际处理脚本元素和运行它的脚本时,脚本将在缓存中(或在途中)可用。
参见: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",那么你可以用它做以下事情:
- 正在下载文件
- 从缓存中获取文件
- "Reading"它,因为在真正执行代码之前,必须读取文件中的所有代码(否则提升不可能存在)
- 执行代码
我的英语不太好,所以我现在在想"is fetched"这个词。
If neither attribute is present, then the script is fetched and executed immediately
我看到 "is fetched" 为:
- 浏览器可以从缓存中获取script.js
- 浏览器可以下载script.js
是吗?所以他们使用 "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.
预加载扫描器可以导致脚本被下载,但 运行 不会。这意味着当解析器实际处理脚本元素和运行它的脚本时,脚本将在缓存中(或在途中)可用。