script标签中的defer与async

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: script标签中的defer与async

两者都是用来异步加载js文件,提高网页性能。

1. async

1.2 使用场景

主要是不涉及操作DOM的事件,比如使用百度分析的脚本

1.1 与html解析、DOMContentLoaded的关系

情况1:HTML 还没有被解析完的时候,async脚本已经加载完了,那么 HTML

停止解析,去执行脚本,脚本执行完毕后触发DOMContentLoaded事件。

image.png

情况2: HTML 解析完了之后,async脚本才加载完,然后再执行脚本,那么在HTML解析完毕、async脚本还没加载完的时候就触发DOMContentLoaded事件。

image.png

1.3 综述
  1. 无论html是否解析完成,立即执行脚本;
  2. 无论有使用多少个async加载脚本,只要脚本下载完成,立即执行脚本。与<script>标签的顺序无关。

2. defer

2.1 使用场景

操作DOM的脚本,为防止元素尚未加载完成,脚本找不到元素报错。

2.2 html解析、DOMContentLoaded的关系

情况1:HTML还没解析完成时,defer脚本已经加载完毕,那么defer脚本将等待HTML解析完成后再执行。defer脚本执行完毕后触发DOMContentLoaded事件。

image.png

情况2: HTML解析完成时,defer脚本还没加载完毕,那么defer脚本继续加载,加载完成后直接执行,执行完毕后触发DOMContentLoaded事件。

image.png

2.3 综述
  1. 无论js文件是否下载完成,只有html解析完毕,才可以执行脚本;
  2. 脚本执行的顺序与下载的完成时间无关,按照<script>脚本的位置,顺序执行。

注: 图片来源网络。

相关文章
|
20小时前
|
监控 JavaScript 前端开发
确定使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript
【10月更文挑战第24天】选择使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript 是一个需要综合考虑多个因素的决策。需要根据脚本之间的依赖关系、页面加载性能要求、脚本的功能和重要性等因素来进行权衡。在实际应用中,需要通过测试和验证来确定最适合的加载方式,以提供更好的用户体验和页面性能。
|
2月前
|
JavaScript 前端开发
一个js里可以有多少个async function,如何用最少的async function实现多个异步操作
在 JavaScript 中,可以通过多种方法实现多个异步操作并减少 `async` 函数的数量。
|
4月前
|
JavaScript
js 捕获 await 的报错
js 捕获 await 的报错
26 1
|
4月前
|
前端开发 JavaScript
js【详解】async await
js【详解】async await
36 0
|
6月前
|
JavaScript 前端开发 Go
理解 <script> 标签的 defer 和 async 属性
理解 <script> 标签的 defer 和 async 属性
141 3
|
前端开发 JavaScript
js - ASYNC/AWAIT
`async/await` 是一个 es7 的语法
|
移动开发 Go UED
<script> 标签上的 defer 和 async 属性是什么?
它会执行以下步骤 1.暂停 HTML 文档解析器 2.创建新请求以下载脚本 3.在脚本完全下载后立即执行脚本 4.执行结束后,继续解析 HTML 文档
|
Go API
script标签中defer和async有什么不同?
script标签中defer和async有什么不同?
106 0
script标签中defer和async有什么不同?
|
前端开发 JavaScript
了解js中async-await
了解async异步函数如何使用并且使用中的注意点
171 0
了解js中async-await
|
前端开发 JavaScript
JS循环中使用async、await的正确姿势
使用filter过滤item为vue或者react的选项
269 0
JS循环中使用async、await的正确姿势