- 创建
Document
,开始解析Web页面。这个阶段document.readyState = 'loading'
。 - 遇到
link
外部css
,创建线程加载,并继续解析文档。 - 遇到
script
外部js
,并且没有设置async
、defer
,浏览器加载,并阻塞整个页面,等待js
加载完成并执行该脚本,然后继续解析文档。 - 遇到
script
外部js
,并且设置有async
、defer
,浏览器创建线程加载,并继续解析文档。对于`async`属性的脚本,脚本加载完成后立即执行(异步禁止使用`document.write()`)。 `defer`等待加载完成后执行。
- 遇到
img
等,先正常解析dom
结构,然后浏览器异步加载src
,并继续解析文档。 - 当文档解析完成时,
document.readyState = 'interactive'
。 - 文档解析完成后,所有设置有defer的脚本会按照顺序执行(注意与
async
的不同,但同样禁止使用document.write()
)。 document
对象触发DOMContentLoaded
事件,这也标志着程序执行从同步脚本执行阶段,转化为事件驱动阶段。- 当所有
async
的脚本加载完成并执行后、img
等加载完成后,document.readyState = 'complete'
,window
对象触发load
事件。 - 此后,以异步响应方式处理用户输入、网络事件等。