请说说`<script>`、`<script async>`和`<script defer>`的区别
在前端开发中,<script>
标签用于嵌入或引用 JavaScript 代码。<script>
标签有几个属性可以影响脚本的加载和执行方式,其中 async
和 defer
是两个常用的属性。以下是它们之间的主要区别:
-
普通的
<script>
:- 当浏览器遇到
<script>
标签时,它会立即下载并执行该脚本。 - 在执行脚本期间,HTML 解析会被阻塞,直到脚本执行完毕。
- 这可能导致页面渲染延迟,尤其是当脚本较大或网络较慢时。
- 当浏览器遇到
-
<script async>
:async
属性告诉浏览器异步下载脚本,即不阻塞 HTML 解析。- 一旦脚本下载完成,HTML 解析会暂停,脚本会立即执行,然后 HTML 解析会继续。
- 这意味着脚本可能在文档的任何位置执行,不一定按照它们在 HTML 中出现的顺序。
async
脚本的执行顺序是不确定的,多个async
脚本可能按照它们完成的顺序执行,而不是它们在页面中的顺序。
-
<script defer>
:defer
属性也告诉浏览器异步下载脚本,即不阻塞 HTML 解析。- 但是,与
async
不同,defer
脚本会等到整个 HTML 文档解析完成后才执行。 defer
脚本按照它们在 HTML 中出现的顺序执行。- 这意味着如果你有多个
defer
脚本,它们会按照顺序一个接一个地执行,而不是并行执行。
总结:
- 普通的
<script>
会阻塞 HTML 解析直到脚本下载并执行完成。 <script async>
会异步下载脚本并在下载完成后立即执行,可能打断 HTML 解析,且执行顺序不确定。<script defer>
会异步下载脚本但等到 HTML 解析完成后才执行,按照它们在 HTML 中的顺序执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!