【发布时间】:2012-06-04 04:56:04
【问题描述】:
我有几个关于<script> 标签的属性async 和defer 的问题,据我了解,这些属性仅适用于HTML5 浏览器。
我的一个网站有两个外部 JavaScript 文件,目前位于 </body> 标记的上方;第一个是来自 google 的 jquery,第二个是本地外部脚本。
关于网站加载速度
-
在页面底部的两个脚本中添加
async有什么好处吗? -
将
async选项添加到两个脚本并将它们放在<head>的页面顶部会有什么好处吗? -
这是否意味着他们会在页面加载时下载?
-
我认为这会导致 HTML4 浏览器出现延迟,但它会加快 HTML5 浏览器的页面加载速度吗?
使用<script defer src=...
- 是否会在
<head>中加载带有属性defer的两个脚本与在</body>之前加载脚本的效果相同? - 我再次假设这会降低 HTML4 浏览器的速度。
使用<script async src=...
如果我有两个启用了async 的脚本
- 他们会同时下载吗?
- 还是一次一个与页面的其余部分一起?
- 那么脚本的顺序会成为问题吗?例如,一个脚本依赖于另一个脚本,因此如果一个脚本下载速度更快,则第二个脚本可能无法正确执行,等等。
最后,在 HTML5 更普遍使用之前,我最好保持原样吗?
【问题讨论】:
-
async是新的(ish),但defer自 IE4 以来一直是 IE 的一部分。defer最近被添加到其他浏览器中,但这些浏览器的旧版本往往少得多。 -
现在,HTML5已经非常流行了!
-
defer与将脚本放置在 HTML 的 底部 相同,这种做法多年来很常见。 -
@vsync 不一定是真的,浏览器在解析 script 标签时会下载带有 defer 标签的 JS,但会推迟到 DOMContentLoaded 之前执行。下载是非阻塞的。放置在 HTML 的底部会延迟 JS 的下载和执行,直到 DOM 构建完成,但您仍然会因等待下载而产生额外的延迟。
-
@vsync 我只是在争论延迟与将脚本放在 HTML 底部不同。设置为 defer 时,浏览器会在后台下载 JS,同时继续构建 DOM。一旦构建了 DOM(触发了 DOMContendLoaded),浏览器将执行已下载的 JS。这就是我所说的“非阻塞”,例如它不会阻止浏览器构建 DOM。这就是为什么它被明确标记为延迟。下面答案中的图片很好地解释了它。
标签: jquery javascript html