async
和defer
,用于控制外部JavaScript文件的加载和执行顺序。文章目录
<script>
标签时,默认行为是立即停止解析HTML,开始下载并执行该脚本。这个过程会阻塞HTML的解析,直到脚本执行完成。如果脚本较大或网络较慢,这种阻塞会导致页面加载速度变慢,影响用户体验。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="example.js"></script>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
在上面的例子中,浏览器在解析到<script src="example.js"></script>
时会暂停HTML解析,等待脚本下载和执行完成后,才继续解析剩余的HTML内容。这种默认行为会导致页面加载的延迟。理解这一点对于理解async
和defer
属性的作用至关重要。<script>
标签时,解析过程如下:<script>
标签,浏览器会多次重复上述过程,每个脚本都会导致解析过程的阻塞。对于包含大量或较大JavaScript文件的页面,这种阻塞会显著影响页面加载时间,导致较差的用户体验。async
属性用于告诉浏览器异步加载脚本文件,即不阻塞HTML的解析。加载完成后立即执行该脚本。这意味着脚本的执行顺序不一定按照它们在HTML中的出现顺序,而是取决于它们的加载完成时间。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script async src="example.js"></script>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
在上述示例中,浏览器在遇到<script async src="example.js"></script>
时会继续解析HTML,同时在后台异步下载example.js
。当脚本下载完成后,会立即执行它,而不管HTML解析是否完成。async
属性的<script>
标签时,继续解析HTML,并开始异步下载JavaScript文件。async
属性适用于独立的脚本文件,这些脚本不依赖于其他脚本,也不依赖于DOM的结构。例如,统计脚本或广告脚本等可以使用async
属性。这类脚本通常不影响页面的主要功能和布局,只是提供附加功能,因此它们可以独立加载和执行,不会影响页面的其他部分。defer
属性同样用于异步加载脚本文件,但与async
不同的是,defer
确保脚本在HTML解析完成后,按顺序执行。这样可以保证所有defer
脚本按照它们在文档中出现的顺序执行,并且不会阻塞HTML的解析过程。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script defer src="example1.js"></script>
<script defer src="example2.js"></script>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
在上述示例中,example1.js
和example2.js
会在HTML解析完成后按顺序执行,确保脚本的执行顺序与它们在文档中的顺序一致。defer
属性的<script>
标签时,继续解析HTML,并开始异步下载JavaScript文件。defer
脚本。defer
属性适用于需要按顺序执行的脚本,尤其是那些依赖于DOM结构或其他脚本的脚本。例如,初始化页面的脚本或依赖于库的脚本适合使用defer
属性。通过确保脚本在DOM解析完成后执行,可以避免脚本在DOM尚未准备好时执行,导致的错误和问题。加载方式 | 异步加载 | 异步加载 |
执行时机 | 加载完成后立即执行 | HTML解析完成后执行 |
执行顺序 | 不保证顺序,谁先加载完成谁先执行 | 保证顺序,按照在HTML中的出现顺序执行 |
适用场景 | 独立脚本,如统计脚本或广告脚本 | 依赖于DOM或其他脚本的脚本,如初始化脚本 |
script1.js
和script2.js
,如果我们使用async
和defer
,它们的行为会有所不同:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Async vs Defer</title>
<!-- 使用async -->
<script async src="script1.js"></script>
<script async src="script2.js"></script>
<!-- 使用defer -->
<script defer src="script3.js"></script>
<script defer src="script4.js"></script>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
在上述示例中:
script1.js
和script2.js
会异步加载,但谁先加载完成就先执行,因此无法保证执行顺序。script3.js
和script4.js
会在HTML解析完成后按顺序执行,确保执行顺序与它们在文档中的顺序一致。async
属性可以加快这些脚本的加载和执行,同时不影响页面的主要内容加载。defer
属性可以确保它们在HTML解析完成后按顺序执行,避免因为依赖关系导致的错误。async
和defer
,根据具体脚本的需求选择合适的属性,以达到最佳的性能优化效果。async
和defer
属性,可以显著优化Web页面的加载性能和用户体验。async
适用于独立且不依赖其他资源的脚本,而defer
适用于需要按顺序执行且可能依赖于DOM或其他脚本的脚本。Golang内存一直涨是什么原因及问题定位方法2023免费Apple美国ID账号共享-美国Apple ID共享Clash100初学教程:安装、使用和常见问题解决Writesonic一个AI创作助手Shadowrockets China: Shadowsocks在中国的完整指南Clash VPN 购买:稳定好用的 Clash 节点(2025 持续更新)电视家没了,有其他看电视直播的App吗?v2ray安装包全面指南部落冲突8本阵型:详细布阵指南与战术建议谷歌云v2ray ws tls 配置教程老牌大流量高速稳定便宜机场:桔子云,全隧道+IPLC专线Xray透明代理(TProxy)配置教程闪狐云机场怎么样?FlashFox 闪狐云2025最新评测clash for windows节点怎么获取Clash for Windows下载 中文汉化 机场URL订阅配置详细使用教程 支持V2Ray/Trojan/Shadowsocks(R)全协议科学上网最新版客户端