interview
frontend-html
HTML的script标签中defer和async有什么区别?

前端HTML面试题, HTML 的 script 标签中 defer 和 async 有什么区别?

前端HTML面试题, HTML 的 script 标签中 defer 和 async 有什么区别?

QA

Step 1

Q:: HTML 的 script 标签中 defer 和 async 有什么区别?

A:: 在 HTML 中,script 标签的 defer 和 async 属性用于控制外部脚本文件的加载和执行顺序。

- **defer**: 当 script 标签使用 defer 属性时,浏览器会并行下载脚本文件,但不会立即执行,而是在 DOM 完全构建完成后再执行。defer 脚本的执行顺序与它们在页面中的出现顺序一致。

- **async**: 当 script 标签使用 async 属性时,浏览器会并行下载脚本文件,并在下载完成后立即执行。与 defer 不同的是,async 脚本的执行顺序与它们在页面中的出现顺序无关,取决于下载完成的顺序。

Step 2

Q:: defer 和 async 的区别在实际项目中有什么意义?

A:: 在实际项目中,选择 defer 还是 async 取决于脚本的功能和需求。

- **defer**: 适合依赖于 DOM 结构的脚本,如操作页面内容的脚本。因为 defer 脚本会在 DOM 加载完成后执行,确保脚本可以安全地访问页面元素。

- **async**: 适合独立运行、不依赖于 DOM 结构的脚本,如分析工具(Google Analytics)。由于它们不会干扰页面的加载流程,可以提高页面的加载速度。

Step 3

Q:: 不使用 defer 或 async 时,脚本的执行方式如何?

A:: 当 script 标签不使用 defer 或 async 属性时,浏览器会阻塞页面的解析,先下载并执行脚本文件,之后再继续解析页面。这样做会延长页面的加载时间,特别是对于放在页面 head 中的脚本。

用途

面试这个内容是因为前端开发人员需要理解如何优化网页加载速度。现代 Web 应用通常包含大量的 JavaScript 代码,因此合理使用 defer 和 async 属性能够减少阻塞渲染的时间,提升用户体验。在生产环境中,优化脚本的加载方式尤其重要,因为它直接影响到页面的加载性能和响应速度。\n

相关问题

🦆
DOMContentLoaded 和 window.onload 事件有什么区别?

DOMContentLoaded 事件在 DOM 树构建完成后触发,而不等待样式表、图片等资源加载完成。window.onload 事件在页面的所有内容(包括 DOM、样式表、图片等)加载完成后触发。因此,DOMContentLoaded 通常比 window.onload 触发得更早。

🦆
在页面加载过程中,如何确保 CSS 在 JavaScript 执行前加载完成?

可以将 CSS 文件放置在 head 标签内,并将 JavaScript 文件放在 body 的底部,或使用 defer 属性。这样可以确保 CSS 样式在 JavaScript 执行前已被加载和应用。

🦆
script 标签的 defer 和 async 属性是否可以同时使用?

不能同时使用。如果一个 script 标签同时使用 defer 和 async 属性,async 属性会生效,而 defer 属性会被忽略。因此,不能通过同时使用这两个属性来达到两者的效果。

🦆
如果脚本执行顺序对应用程序非常重要,应该如何处理?

在这种情况下,使用 defer 属性更为合适。defer 可以保证脚本按顺序执行,并且在 DOM 树完全构建后执行。如果脚本非常依赖于页面元素的存在,最好将它们放置在页面底部,或者使用 defer 属性。