1. 程式人生 > 其它 >script標籤中defer和async的區別(稀土掘金學習)

script標籤中defer和async的區別(稀土掘金學習)

如果沒有defer或async屬性,瀏覽器會立即載入並執行相應的指令碼。它不會等待後續載入的文件元素,讀取到就會開始載入和執行,這樣就阻塞了後續文件的載入。

下圖可以直觀的看出三者之間的區別: 

 

 其中藍色代表js指令碼網路載入時間,紅色代表js指令碼執行時間,綠色代表html解析。

defer 和 async屬性都是去非同步載入外部的JS指令碼檔案,它們都不會阻塞頁面的解析,其區別如下:

  • 執行順序: 多個帶async屬性的標籤,不能保證載入的順序;多個帶defer屬性的標籤,按照載入順序執行;
  • 指令碼是否並行執行:async屬性,表示後續文件的載入和執行與js指令碼的載入和執行是並行進行的
    ,即非同步執行;defer屬性,載入後續文件的過程和js指令碼的載入(此時僅載入不執行)是並行進行的(非同步),js指令碼需要等到文件所有元素解析完成之後才執行,DOMContentLoaded事件觸發執行之前。