Script 标签中 Defer 和 Async 的区别?

无任何属性的 Script

遇到 Script 标签,会按顺序执行脚本,继而阻塞 HTML 页面渲染

Async 属性(具有独立性)

其他脚本不会等待 async 脚本加载完成,同样,async 脚本也不会等待其他脚本

DOMContentLoaded 和异步脚本不会彼此等待,可能在前也可能在后

并行加载 JS,下载完成后立即执行,执行过程中可能阻塞页面渲染

Defer 属性(推荐使用)

并行加载JS,不阻塞页面渲染,具有 defer 特性的脚本总是要等到 DOM 解析完毕,但在 DOMContentLoaded 事件之前执行

有 defer 属性的多个 JS 文件,并行下载后,依旧会按照相对顺序进行解析

如果 <script> 脚本没有 src,则会忽略 defer 特性。