小编典典

脚本标签 - 异步和延迟

all

我有几个关于属性async和标签的问题,据我了解defer,这些<script>标签仅适用于 HTML5 浏览器。

</body>我的一个网站有两个外部 JavaScript 文件,目前位于标签上方;第一个是来自 google 的jquery
,第二个是本地外部脚本。

关于网站加载速度

  1. async添加到页面底部的两个脚本有什么好处吗?

  2. async将选项添加到两个脚本并将它们放在页面顶部是否有任何优势<head>

  3. 这是否意味着他们在页面加载时下载?

  4. 我认为这会导致 HTML4 浏览器延迟,但它会加快 HTML5 浏览器的页面加载速度吗?

使用<script defer src=...

  1. <head>使用属性加载两个脚本 与defer之前的脚本影响相同</body>吗?
  2. 我再次假设这会减慢 HTML4 浏览器的速度。

使用<script async src=...

如果我有两个async启用的脚本

  1. 他们会同时下载吗?
  2. 还是一次一个与页面的其余部分一起?
  3. 那么脚本的顺序会成为问题吗?例如,一个脚本依赖于另一个脚本,因此如果一个脚本下载速度更快,则第二个脚本可能无法正确执行,等等。

最后,在 HTML5 更常用之前,我最好保持原样吗?


阅读 92

收藏
2022-03-03

共1个答案

小编典典

将您的脚本保留在</body>. 在少数情况下,异步可以与位于那里的脚本一起使用(参见下面的讨论)。Defer 不会对位于那里的脚本产生太大影响,因为
DOM 解析工作几乎已经完成。

这是一篇解释异步和延迟之间区别的文章:http: //peter.sh/experiments/asynchronous-and-deferred-
javascript-execution-explained/

如果您将脚本保留在正文末尾之前,您的 HTML 将在旧浏览器中显示得更快</body>。因此,为了保持旧浏览器的加载速度,您不想将它们放在其他任何地方。

如果您的第二个脚本依赖于第一个脚本(例如,您的第二个脚本使用第一个脚本中加载的
jQuery),那么您不能在没有额外代码来控制执行顺序的情况下使它们异步,但您可以使它们延迟,因为延迟脚本会仍然按顺序执行,只是在文档被解析之后才执行。如果您有该代码并且不需要立即运行脚本,则可以使它们异步或延迟。

您可以将脚本放在<head>标签中并将它们设置为defer,脚本的加载将被延迟,直到 DOM
被解析,这将在支持延迟的新浏览器中快速显示页面,但这对您没有帮助在较旧的浏览器中,它实际上并不比将脚本</body>放在所有浏览器中都快。所以,你可以明白为什么最好把它们放在前面</body>

当您真的不关心脚本何时加载并且用户不依赖于该脚本加载时,异步会更有用。使用 async 最常被引用的示例是像 Google Analytics
这样的分析脚本,您不希望等待任何东西,并且不急于很快运行,它是独立的,所以没有其他东西依赖它。

通常 jQuery 库不适合异步,因为其他脚本依赖于它,并且您希望安装事件处理程序以便您的页面可以开始响应用户事件,并且您可能需要运行一些基于 jQuery
的初始化代码来建立初始状态的页面。它可以异步使用,但其他脚本必须在加载 jQuery 之前进行编码才能执行。

2022-03-03