script 标签里的 async 和 defer
- 无 async 和 defer
浏览器立即加载并执行指定脚本(读到即加载并执行),阻塞文档解析
- async
脚本的加载执行和文档的加载渲染 并行。
- defer
脚本的加载和文档的加载渲染并行,但脚本的执行必须在所有元素解析完成之后进行,即DOMContentLoaded事件触发之前完成。
执行顺序图示
notice
- defer和async在网络读取(下载)阶段是一样的,和HTML解析都是并行(异步)
- async 是无序执行,它的执行紧跟着下载,只要下载完了就立即执行(不考虑脚本的依赖关系,对于那些没有依赖关系的脚本来说是非常合适的),执行时同样阻塞HTML解析。
- defer 是有序执行,会按照他们在页面上的顺序依次执行,在HTML解析完成之后,DOMContentLoaded事件之前执行。
Goals determine what you are going to be!