前端三十|02. [HTML] script tag 加上 async & defer 的功能及差異?

Schaos
Schaos’s Blog
Published in
7 min readSep 17, 2019

--

前端當然要從 HTML 出發,今天就讓我們來聊聊 script tag 加上 async / defer 的功能及差異。

本系列文已經重新編校彙整編輯成冊,並正式出版囉!

前端三十:從 HTML 到瀏覽器渲染的前端開發者必備心法好評販售中!

喜歡我文章內容的讀者們,歡迎您前往購買支持

講古

我們知道,瀏覽器解析 HTML 是一行一行依序向下讀取,在傳統的寫法中,當瀏覽器讀到 <script> 時,便會 暫停解析 DOM,而是立刻開始下載 <script> 的資源,並在下載後立刻執行。由於這樣的特性,便可能造成 DOM 樹建構不完全時就執行 JavaScript,需要操作 DOM 的程式可能就因此無法正確運作,造成許多衍伸的問題;或是由於 <script> 中的資源下載、執行時間過程,使用者便會卡在白畫面,並產生覺得網站太慢不好用之類的感受。

而那時的解決方法也很簡單直白,開發者需要把 <script> 的位置都放到 <body> 的最後一行來避免 DOM 樹不完全的問題,但在複雜的網站中,HTML、JavaScript 的檔案都來越大,需要等到整個 DOM 樹都載入完成才開始下載 <script> 內的資源,網站讀取完成到可操作,便會有明顯的延遲感。

這樣的問題該怎麼解決呢?

簡介

從 HTML4 開始,<script> 便多了 defer 屬性,HTML5 則多了 async,兩者皆是用來幫助開發者控制 <script> 內資源的載入及執行順序,以及避免 DOM 的解析被資源下載卡住。

defer

defer 意旨為 延遲(Deferred),在 HTML4.01 的規格 中定義了:

When set, this boolean attribute provides a hint to the user agent that the script is not going to generate any document content (e.g., no “document.write” in javascript) and thus, the user agent can continue

--

--