script標籤中defer和async屬性的區別
阿新 • • 發佈:2018-12-23
script標籤存在兩個屬性,defer和async,因此script標籤的使用分為三種情況:
1.<script src="example.js"></script>
沒有defer或async屬性,瀏覽器會立即載入並執行相應的指令碼。也就是說在渲染script標籤之後的文件之前,不等待後續載入的文件元素,讀到就開始載入和執行,此舉會阻塞後續文件的載入;
2.<script async src="example.js"></script>
有了async屬性,表示後續文件的載入和渲染與js指令碼的載入和執行是並行進行的,即非同步執行;
3.<script defer src="example.js"></script>
有了defer屬性,載入後續文件的過程和js指令碼的載入(此時僅載入不執行)是並行進行的(非同步),js指令碼的執行需要等到文件所有元素解析完成之後,DOMContentLoaded事件觸發執行之前。
其中藍色代表js指令碼網路載入時間,紅色代表js指令碼執行時間,綠色代表html解析。
從圖中我們可以明確一下幾點:
1.defer和async在網路載入過程是一致的,都是非同步執行的;
2.兩者的區別在於指令碼載入完成之後何時執行,可以看出defer更符合大多數場景對應用指令碼載入和執行的要求;
3.如果存在多個有defer屬性的指令碼,那麼它們是按照載入順序執行指令碼的;而對於async,它的載入和執行是緊緊挨著的,無論宣告順序如何,只要載入完成就立刻執行,它對於應用指令碼用處不大,因為它完全不考慮依賴。