返回
解析理解,浅谈defer和async的实际用途
前端
2023-12-15 07:19:32
在现代网页开发中,JavaScript 是不可或缺的一部分。它赋予网页更多的交互性,提升了用户体验。然而,随着网页功能的增加,脚本的引入也带来了性能挑战:加载脚本会阻塞浏览器的文档解析,拖慢页面加载速度。为了解决这个问题,出现了两种改变脚本加载和执行顺序的属性:defer 和 async。这两种属性各有利弊,开发者需要根据实际情况合理选择。
defer 的优雅取舍
优点
- 确保脚本按照顺序执行,对于有依赖关系的脚本非常有用。
- 不会影响页面初始渲染速度,因为脚本执行是在页面完全加载后。
缺点
- 无法应用于内嵌脚本元素 (
<script>
标签直接包含脚本代码)。 - 无法控制脚本下载的顺序,所有被标记了 defer 的脚本都会立即下载。
- 不适用于需要立即执行的脚本,如页面加载时必须运行的初始化脚本。
async 的异步之道
优点
- 可以并行加载和执行脚本,提升脚本的加载和执行速度。
- 可以应用于内嵌脚本元素,并可以控制脚本下载的顺序,让优先级较高的脚本优先加载和执行。
缺点
- 可能导致脚本执行顺序与脚本在 HTML 文档中的顺序不一致。
- 可能导致脚本与 DOM 或其他脚本的冲突,因此需要谨慎使用。
- 不适用于需要按顺序执行的脚本,如必须在页面加载后执行的初始化脚本。
抉择与权衡
defer 和 async 属性各有千秋,开发者需要根据不同场景和需求选择合适的属性。
- 不需要依赖其他脚本或 DOM 元素的脚本: 推荐使用 async 属性,因为它可以提高脚本的加载和执行速度。
- 必须按顺序执行的脚本: 推荐使用 defer 属性,因为它可以确保脚本按照正确的顺序执行。
- 既需要按顺序执行又需要并行加载的脚本: 可以采用混合使用 defer 和 async 属性的方式。
实践指南
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 的交互。