1、創建Document對象,開始解析web頁面。解析HTML元素和他們的文本內容后添加Element對象和Text節點到文檔中。這個階段 document.readyState = ‘loading’ 。
2、遇到link外部css,創建線程加載,并繼續解析文檔。
3、遇到script外部js,并且沒有設置async、defer,瀏覽器加載,并阻塞,等待js加載完成并執行該腳本,然后繼續解析文檔。
4、遇到script外部js,并且設置有async、defer,瀏覽器創建線程加載,并繼續解析文檔。 對于async屬性的腳本,腳本加載完成后立即執行。(禁止使用document.write())
5、遇到img等,先正常解析dom結構,然后瀏覽器異步加載src,并繼續解析文檔。
6、當文檔解析完成,document.readyState = ‘interactive’ 。
7、文檔解析完成后,所有設置有defer的腳本會按照順序執行。(禁止使用document.write());
8、document對象觸發DOMContentLoaded事件,這也標志著程序執行從同步腳本執行階段,轉化為事件驅動階段。
9、當所有async的腳本加載完成并執行后、img等加載完成后,document.readyState = ‘complete’,window對象觸發load事件。
10、從此,以異步響應方式處理用戶輸入、網絡事件等。