異步加載和加載時間線

一、異步加載
異步加載又叫非阻塞,瀏覽器在加載執行 js 同時,還會繼續進行後續頁面的處理。
異步加載js,按需加載,用到的時候再加載,不用到不加載。

異步加載的三種方式:
1.defer屬性:在文檔完成解析完成開始執行,並且在DOMContentLoaded事件之前執行完成。僅支持IE,最好是外部的script使用。
2.async屬性:加載完就執行,只能加載外部腳本,是W3C的標準。高版本的瀏覽器支持加載內部腳本,但是標準中不允許。
3.創建一個script標籤,插入到DOM中。兼容性最好。
異步加載禁止使用document.write(),因爲document.write()有可能會清空文檔流

二、加載時間線
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() )
原因: 相當於html文檔輸出到頁面,當整個文檔解析差不多的時候,再調用document.write()方法的時候,它將之前的所有文檔流清空,將當前的文檔流輸出

5.遇到img等,先正常解析dom結構,然後瀏覽器異步加載src,並繼續解析文檔。

6.當文檔解析完成(domtree剛建立完),document.readyState=“interactive”;

7.文檔解析完成後,所有設置defer的腳本會按照順序執行。

8.document對象觸發DOMContentLoaded事件,這也標誌着程序執行從同步腳本執行階段,轉化爲事件驅動階段。

9.當所有的async的腳本加載完成並執行後,img等加載完成後,document.readyState=“complete”,window對象觸發load事件,頁面所有的內容解析完成 加載完成。

10.從此,以異步響應方式處理用戶輸入,網絡事件等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章