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:: defer 和 async 是两个用于控制外部 JavaScript 脚本加载和执行顺序的属性。它们的主要区别如下:

1. defer 属性: - defer 会将脚本的执行推迟到 HTML 文档完全解析和显示后再执行。 - 多个 defer 脚本会按照它们在页面中出现的顺序依次执行。 - 适用于那些依赖于 DOM 完成解析后才执行的脚本。

2. async 属性: - async 允许脚本在后台下载,并且一旦下载完成,立即执行。 - 多个 async 脚本的执行顺序不可预测,因为它们是异步加载的,先加载完成的先执行。 - 适用于独立、不依赖其他脚本或 DOM 完整解析的脚本。

Step 2

Q:: 为什么选择使用 defer 而不是 async?

A:: defer 适用于需要等待 DOM 结构完全生成后再执行的脚本,这样可以避免脚本过早执行导致的错误。比如,某些操作 DOM 的脚本,如果 DOM 尚未生成,执行时会导致错误。使用 defer 可以确保脚本按顺序执行并且是在 DOM 完全加载后执行。

Step 3

Q:: 在什么情况下适合使用 async?

A:: async 适用于那些不依赖于其他脚本或 DOM 的加载顺序,并且希望尽早执行的脚本。典型的例子包括独立的分析工具、广告脚本等,这些脚本通常不依赖于页面的其他内容,并且越早加载越好。

用途

了解 script 标签中 defer 和 async 的区别对于前端开发者至关重要,因为在实际生产环境中,合理选择这两种属性可以显著优化页面加载性能和用户体验。特别是在构建大型单页应用(SPA)或包含复杂交互的页面时,确保脚本以合适的顺序加载和执行,能够避免潜在的脚本依赖问题和页面加载阻塞。通常在开发时,需要根据具体场景选择 defer 或 async 来优化脚本的加载和执行顺序,以提高页面的加载速度和响应性。\n

相关问题

🦆
为什么 script 标签通常放在 HTML 的 body 结束标签前?

将 script 标签放在 body 结束标签前,可以确保页面的内容在脚本执行前完成加载和渲染。这样做的好处是避免因脚本的加载和执行导致的页面渲染阻塞,从而提升用户体验。

🦆
如何使用模块化的方式加载 JavaScript?

可以使用 ES6 的模块化特性(如 import/export)来组织和加载 JavaScript 脚本。通过将脚本拆分为模块,可以减少单个文件的复杂性,增强代码的可维护性,并且通过按需加载模块,可以优化页面的加载性能。

🦆
HTML 中如何确保页面加载时不阻塞渲染?

可以使用 defer 或 async 属性加载外部 JavaScript 脚本,或者将 script 标签放置在 body 底部,来避免脚本的加载和执行阻塞页面的渲染。对于 CSS 文件,可以使用媒体查询(media queries)来加载非关键的 CSS,从而加快初始页面的渲染速度。