返回

解析理解,浅谈defer和async的实际用途

前端

在现代网页开发中,JavaScript 是不可或缺的一部分。它赋予网页更多的交互性,提升了用户体验。然而,随着网页功能的增加,脚本的引入也带来了性能挑战:加载脚本会阻塞浏览器的文档解析,拖慢页面加载速度。为了解决这个问题,出现了两种改变脚本加载和执行顺序的属性:deferasync。这两种属性各有利弊,开发者需要根据实际情况合理选择。

defer 的优雅取舍

优点

  1. 确保脚本按照顺序执行,对于有依赖关系的脚本非常有用。
  2. 不会影响页面初始渲染速度,因为脚本执行是在页面完全加载后。

缺点

  1. 无法应用于内嵌脚本元素 (<script> 标签直接包含脚本代码)。
  2. 无法控制脚本下载的顺序,所有被标记了 defer 的脚本都会立即下载。
  3. 不适用于需要立即执行的脚本,如页面加载时必须运行的初始化脚本。

async 的异步之道

优点

  1. 可以并行加载和执行脚本,提升脚本的加载和执行速度。
  2. 可以应用于内嵌脚本元素,并可以控制脚本下载的顺序,让优先级较高的脚本优先加载和执行。

缺点

  1. 可能导致脚本执行顺序与脚本在 HTML 文档中的顺序不一致。
  2. 可能导致脚本与 DOM 或其他脚本的冲突,因此需要谨慎使用。
  3. 不适用于需要按顺序执行的脚本,如必须在页面加载后执行的初始化脚本。

抉择与权衡

defer 和 async 属性各有千秋,开发者需要根据不同场景和需求选择合适的属性。

  1. 不需要依赖其他脚本或 DOM 元素的脚本: 推荐使用 async 属性,因为它可以提高脚本的加载和执行速度。
  2. 必须按顺序执行的脚本: 推荐使用 defer 属性,因为它可以确保脚本按照正确的顺序执行。
  3. 既需要按顺序执行又需要并行加载的脚本: 可以采用混合使用 deferasync 属性的方式。

实践指南

defer 代码示例

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

async 代码示例

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

混合使用 defer 和 async 代码示例

<script defer src="script1.js"></script>
<script async src="script2.js"></script>

结论

defer 和 async 属性是前端工程师提升网页性能的关键。通过合理选择脚本加载和执行顺序,开发者可以最大限度地减少脚本对页面加载速度的影响,从而改善用户体验并提升网站的整体性能。

常见问题解答

defer 和 async 有什么区别?

  • defer 会延迟执行脚本,直到文档解析和渲染完成,而 async 会立即执行脚本,无需等待文档解析和渲染。

什么时候应该使用 defer?

  • 当脚本必须按顺序执行或不依赖于其他脚本或 DOM 元素时。

什么时候应该使用 async?

  • 当脚本不需要按顺序执行且不影响页面初始渲染速度时。

defer 和 async 可以一起使用吗?

  • 可以,当需要同时加载并行脚本和顺序脚本时。

使用 defer 和 async 时需要考虑什么?

  • 脚本的依赖关系、执行顺序和与 DOM 的交互。