script标签中的 defer 和 async 属性

本文解析了HTML中script标签的async与defer属性的作用及区别。详细介绍了这两种属性如何影响脚本的下载与执行时机,帮助开发者更好地优化网页加载性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<script src="myscript.js"></script>   // 没有defer和async属性时

<script src="myscript.js" defer></script>   // 有defer属性时

<script src="myscript.js" async></script>  // 有async属性时

<script src="myscript.js" async defer></script>  // 有async,defer属性时或者defer,async属性时

一、当script没有defer和async属性时

如果两个属性都没有(默认行为),脚本的下载和执行将会按照文档的先后顺序同步进行。当脚本下载和执行的时候,文档解析就会被阻塞,在脚本下载和执行完成之后文档才能往下继续进行解析。总之脚本的下载和执行都是按照文档的先后顺序进行。

二、当script 有defer属性时(等到文档解析完才开始执行)

defer 属性表示脚本按顺序被解析到时就开始下载,下载过程中文档继续进行解析,当文档全部解析完成之后便开始执行下载好的脚本,这相当于在 DOMContentLoaded 的监听事件内进行执行。虽然 defer 属性的脚本需要等到文档解析完才开始执行,但其执行是有顺序的(异步加载资源,在DOM渲染后之后再按顺序执行JS)。

 三、当script 有async属性时(脚本下载完成后停止HTML解析,执行脚本,脚本解析完继续HTML解析)

async 属性表示脚本按顺序被解析到时就开始下载,下载过程中文档继续进行解析,当脚本下载完成后文档停止解析开始执行下载好的脚本,脚本执行完后继续解析文档async 脚本由于网络等的影响将不会按照顺序执行(异步加载资源,且加载完JS资源立即执行,并不会按顺序,谁快谁先上)。

四、当script同时有asyncdefer属性时(执行效果和async一致)

执行效果和async一致,把这两个属性交换一下位置,看会不会有覆盖效果,结果发现也是和async一致的

综上在webkit引擎下,建议的方式仍然是把<script>写在<body>底部,如果需要使用百度谷歌分析或者不蒜子等独立库时可以使用async属性,若你的<script>标签必须写在<head>头部内可以使用defer属性

使用场景:

1.把带 defer 属性的脚本放在 <head> 中比无属性的脚本放在 </body> 之前要更好,因为浏览器在页面解析时可对带 defer 属性      的脚本进行下载。
3.如果脚本相互依赖,请使用 defer。
4.如果脚本是独立的,请使用 async。
5.如果 DOM 必须解析好才执行且执行函数没有放在 DOMContentLoaded 的监听器中,请使用 defer。

 

### HTML `script` 标签中 `defer` 与 `async` 属性的区别及用法 #### 基本定义 在 JavaScript 中,`<script>` 标签用于引入外部 JavaScript 文件包含嵌入式 JavaScript 代码。为了优化页面加载性能并控制脚本的执行机,HTML 提供了两种特殊的属性——`defer` `async`。 #### `defer` 属性 当 `<script>` 标签带有 `defer` 属性,浏览器会继续解析渲染后续的文档内容,而不会阻塞 DOM 构建过程[^3]。脚本会在整个 HTML 文档解析完成后立即按顺序执行,这意味着如果页面中有多个带有 `defer` 属性的脚本,则它们会按照其在 HTML 中出现的顺序依次执行[^5]。 以下是使用 `defer` 的示例代码: ```html <script src="script1.js" defer></script> <script src="script2.js" defer></script> ``` #### `async` 属性 对于具有 `async` 属性的 `<script>` 标签,浏览器同样不会因为下载该脚本文件而停止解析其他部分的内容[^4]。然而,一旦脚本被成功获取回来之后就会立刻被执行,而不等待任何其他的资源者操作完成。需要注意的是,这种行为可能导致不同脚本之间的执行次序变得不可预测,具体取决于各个请求返回的速度差异。 下面是一个简单的例子展示了如何应用 `async` 属性: ```html <script src="library.js" async></script> <script src="app.js"></script> <!-- 这里可能还未等到 library.js 加载完毕 --> ``` #### 主要对比 | 特性 | `normal (no attribute)` | `defer` | `async` | |-----------------|-------------------------------|----------------------------------|---------------------------------| | **下载阶段** | 阻挡DOM构建 | 并行下载 | 并行下载 | | **执行阶段** | 按照遇到的位置暂停解析直到运行完当前脚本 | 在DOMContentLoaded事件触发前依序执行 | 尽早尽可能快地单独执行 | 总结来说,在实际开发过程中可以根据需求选择合适的策略来提升网页的整体表现力。例如,如果你希望某些非关键性的第三方统计工具尽快发挥作用但又不影响主要业务逻辑的话,那么就可以采用 `async` 方式;而对于那些需要确保特定先后关系才能正常运作的部分则更适合运用 `defer` 技术[^1]。 ### 结论 通过上述分析可以看出,虽然两者都能实现异步加载效果从而改善首屏呈现速度等方面的优势,但是由于各自独特的特性决定了适用场景也有所不同。因此理解清楚两者的本质区别是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值