Async 属性和底部脚本

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您的旅程的每个阶段提供云产品。 立即开始使用 $200 免费积分!

一位读者最近写信给我(本质上)问我

script 已经在页面底部时,使用 async 属性有什么理由吗?

我不是这方面的专家,但我的理解是……

他指的是这个

  <script async src="/js/script.js"></script>

</body>

我们之前已经 讨论过这个问题。 现在重新审视这个问题尤其有趣,因为 async 属性 现在确实是 执行异步脚本的唯一推荐方式

那么,当 script 已经在页面底部时,使用 async 属性有什么理由吗?

简短回答

没有。

更详细的回答

您试图用 async 属性来阻止解析器阻塞。 如果您使用 async 属性,您就是在说:我不希望浏览器在下载此脚本时停止它正在做的事情。 我知道这个脚本在运行时并不真正依赖于 DOM 中的任何内容已准备就绪,并且它也不需要按任何特定顺序运行。

如果您在页面底部加载脚本,解析器实际上已经完成了,因此阻塞它并不重要。 您实际上已经在 延迟 脚本,这有点像更强硬的异步。 参见比较。

它甚至可能有点危险。

如果您只是在假设异步 = 好,那么您可能会做类似的事情

  <script async src="/js/libs.js"></script>
  <script async src="/js/page.js"></script>

</body>

这可能是个坏消息,因为“libs.js”很可能对“page.js”有依赖关系,但现在无法保证它们的运行顺序(不好)。

这主要是一个第三方问题。

第三方脚本是异步脚本的主要用例。 他们(第三方)无法控制您在页面上放置该脚本的位置,因此它们通常被设计为无论何时/何地加载都可以工作。 您也无法控制第三方(这就是第三方,韦恩),因此确保它们不会减慢您的网站速度是理想的。

还有其他用例吗?

我想,如果你真的想立即开始下载你自己的脚本之一,并且不在乎它何时运行,你可以把它放在 <head> 中并使其异步。

我可能有点错了。

我倾向于搞砸这些 JavaScript 建议文章,所以如果我做错了,让我们在评论中讨论一下,我会确保这篇文章的内容反映最新的信息。