js加載時間線
如果對async和defer不瞭解的,請參考另一篇博文《異步加載js文件》
-
1、創建document對象,開始解析web頁面,解析html元素和他們的文本內容後添加element對象和text節點到文檔中,階段document.readyState = ‘loading’.
-
2、遇到link外部css,創建線程加載,並繼續解析文檔。
-
3、遇到script外部js,並且沒有設置async、defer,瀏覽器加載,並阻塞,等待js加載完成並執行該腳本,然後繼續解析文檔。
-
4、遇到script外部js,並且設置有async、defer,瀏覽器創建線程加載,並繼續解析文檔。 對於async屬性的腳本,腳本加載完成後立即執行。(異步嚴禁使用documnet.write())。
-
5、遇到img等,先正常解析dom結構,然後瀏覽器異步加載src,並繼續解析文檔。
-
6、當文檔解析完成,document.readyState = ‘interactive’。
-
7、文檔解析完成後,所有設置有defer的腳本會按照順序執行。(注意與async的不同,但同樣禁止使用document.write())。
-
8、document對象觸發DOMContentLoaded事件,這也標誌着程序執行從同步腳本執行階段,轉化爲事件驅動階段。
-
9、當所有async的腳本加載完成並執行後,img等加載完成後,documnet.readState = ‘complete’, window對象觸發load事件。
-
10、從此,以異步響應方式處理用戶輸入、網絡事件等。