直接使用script脚本的话,html会按照顺序来加载并执行脚本,在脚本加载&执行的过程中,会阻塞后续的DOM渲染。
这是因为 UI 渲染线程与 JS 引擎是互斥的,当 JS 引擎执行时 UI 线程会被挂起。
defer
如果script标签设置了该属性,则浏览器会异步的下载该文件并且不会影响到后续 DOM
的渲染;
如果有多个设置了 defer
的script标签存在,则会按照顺序执行所有的script;
defer
脚本会在文档渲染完毕后, DOMContentLoaded
事件调用前执行。
async
async
的设置,会使得script脚本异步的加载并在允许的情况下执行。
async
的执行,并不会按着script在页面中的顺序来执行,而是谁先加载完谁执行。
DOMContentLoaded
事件的调用不会管带有 async
属性的script脚本是否加载完和执行完
注意点
带有 async
和 defer
的脚本的下载是和 HTML 的下载与解析是并行的,但是 JS 的执行一定是和 UI 线程是互斥的,像下面这张图所示,async
在下载完毕后的执行会阻塞HTML的解析