1.建立Document對象,開始解析web頁面,解析HTML元素和他們的文本內容後添加Element對象和Text節點到文檔中。這個階段Document。readyState = "loading"。css
2.遇到link外部css,建立線程加載,並繼續解析文檔。web
3.遇到script外部js,而且沒有設置async , defer ,瀏覽器加載,並阻塞,等待js加載完成並執行該腳本,而後繼續解析文檔瀏覽器
4.遇到script外部js,而且設置有async,defer 瀏覽器建立線程加載,並繼續解析文檔,對於async屬性的腳本,腳本加載完成後當即執行(異步禁止使用docuemnt.write())。網絡
5.遇到img標籤等,先正常解析dom結構,而後瀏覽器異步加載src,並繼續解析文檔dom
6.當文檔解析完成,document.readyState = "interactive";異步
7.文檔解析完成後,全部設置有defer的腳本會按照順序執行。async
8..當文檔解析完成以後,document對象觸發DOMContentLoaded事件,這也標誌着程序執行從同步腳本執行階段,轉化爲事件驅動階段線程
9.當全部saync的腳本加載完成並執行後,img等加載完成後,document.readyState = "complete" window對象觸發load事件code
10.今後,頁面以異步響應方式處理用戶輸入,網絡事件等。
對象
defer
若是script
標籤設置了該屬性,則瀏覽器會異步的下載該文件而且不會影響到後續DOM
的渲染;
若是有多個設置了defer
的script
標籤存在,則會按照順序執行全部的script
;defer
腳本會在文檔渲染完畢後,DOMContentLoaded
事件調用前執行
aysnc
async
的設置,會使得script
腳本異步的加載並在容許的狀況下執行async
的執行,並不會按着script
在頁面中的順序來執行,而是誰先加載完誰執行。
四個js文件裏分別是1,2,3,4
二者都不會阻止 document 的解析
defer 會在 DOMContentLoaded 前依次執行 (能夠利用這兩點哦!)
async 則是下載完當即執行,不必定是在 DOMContentLoaded 前
async 由於順序無關,因此很適合像 Google Analytics 這樣的無依賴腳本