【问题标题】:Should I use defer on script which are already at just before the bottom body tag?我应该在已经位于底部正文标记之前的脚本上使用 defer 吗?
【发布时间】:2016-11-05 13:34:26
【问题描述】:

每次我把自己的js文件放在页面底部的时候,这个问题一直困扰着我。如果我将所有 js 文件放在关闭 body 标记之前的底部,那么我认为浏览器将首先下载所有 html 和样式表,然后它会解析 html 和 css,最后它会发送对 js 文件的请求。所以,

  • 在已经位于底部的 js 文件上使用defer 会有什么不同吗?
  • 非延迟脚本是否在正文标记呈现阻塞之前的末尾?

我的另一个问题是我是否将所有 js 文件放在头部并在它们上使用defer。这是否相当于将所有js文件放在底部?浏览器会在head 中看到带有延迟的js 向服务器发出请求,然后继续下载其余的html 文件,还是仅在下载所有html 和css 后才向服务器发出请求?

据我所知async相当于defer,唯一的区别是js在下载时会执行,不考虑文件顺序。所以,

  • 除了执行顺序之外,对已经位于底部的 js 文件使用async 会有什么不同吗?

【问题讨论】:

  • 是的,defer 基本上类似于将标签放在正文的末尾。

标签: javascript html http deferred


【解决方案1】:

查看HTML 5.2 spec 的Scripting,发现this illustration W3C 使用。

我们在这里看到的是,使用defer 会在解析 HTML 时获取脚本,但会等到解析结束后再执行。

另一方面,async 在解析的同时进行抓取,一旦抓取完成,HTML 渲染就会暂停以执行脚本。

由于 HTML 执行是同步的,因此可以假设对放在 </head> 之前的脚本使用 defer 几乎就像将它们放在 </body> 之前一样。

但是,正如Chris Moschini 所说,我不会相信defer。我觉得this StackOverflow 的回答作为一个整体会更好地解释defer 如何影响加载 JavaScript。

【讨论】:

  • 但是如果我不使用 defer 的话,很多像 gtmatrix 这样的网站给出的分数会更低。我认为现在现代浏览器可以正确实现defer。
  • 也许是这样。考虑到这一点,在<head> 中的脚本上使用defer 或在内容中混合使用会使它们阻塞渲染过程,实际上会加快页面渲染时间。但是,它会影响执行时间,这会导致 </body> 上方的脚本被抛出。
  • 我的意思是在上面的评论中提到this。
【解决方案2】:

defer 属性是一个布尔属性。

当存在时,它指定当页面完成解析时执行脚本。

注意:defer 属性仅适用于外部脚本(仅应在存在 src 属性时使用)。

【讨论】:

【解决方案3】:

我找到的这篇文章解释得很好:https://flaviocopes.com/javascript-async-defer/

理想情况下,最佳实践是将

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多