script標簽中defer和async屬性的區別


  這篇文章來源於JS高級程序設計第三版中關於script標簽的介紹,結合查閱的資料寫下的學習筆記。

  向html頁面中插入javascript代碼的主要方法就是通過script標簽。其中包括兩種形式,第一種直接在script標簽之間插入js代碼,第二種即是通過src屬性引入外部js文件。由於解釋器在解析執行js代碼期間會阻塞頁面其余部分的渲染,對於存在大量js代碼的頁面來說會導致瀏覽器出現長時間的空白和延遲,為了避免這個問題,建議把全部的js引用放在</body>標簽之前。

  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,它的加載和執行是緊緊挨着的,無論聲明順序如何,只要加載完成就立刻執行,它對於應用腳本用處不大,因為它完全不考慮依賴。

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 script標簽中defer和async屬性的區別 script標簽中defer和async的區別? script標簽加載順序(defer & async) 腳本引用中的defer和async的用法和區別 html5中script的async屬性 HTML5 defer和async的區別 vue項目進行時,script標簽中,methods事件中函數使用的async/await 標簽中的name屬性和ID屬性的區別