[HTML5] script 的新增屬性 defer, async

URL Link //n.sfs.tw/10323

2016-11-30 08:37:07 By 張○○

一般我們引入一個外部的javascript會使用這樣的寫法:

<script src="/path/to/your.js"></scrpt>

 * 預設用法
 * 下載後會先執行,執行完此js後頁面才會繼續繪製下去。
 * 如果這個js很大或是要執行不少時間,畫面會卡卡的

在HTML5中新增定義了三個屬性 async, defer

async屬性

<script async src="/path/to/your.js"></scrpt>

 * 一定要搭配 src的屬性才有作用
 * 下載後會先執行,但執行此js同時也繼續載入頁面及執行其他js。
 * 目前的所有瀏覽器都支援(2016)
 * 使用時機:此js和其他的js無連帶關係,即不需等待其他的js執行完,可獨立作業。

defer屬性

<script defer src="/path/to/your.js"></scrpt>

 * 一定要搭配 src的屬性才有作用
 * 要整個頁面都下載及分析完成後才會執行,非常類似於把js放在頁尾的情況。
 * 目前的所有瀏覽器都支援(2016)
 * 使用時機:此js一定要頁面全繪完再執行才行

async+defer屬性

<script async defer src="/path/to/your.js"></scrpt>

 * 一定要搭配 src的屬性才有作用
 * 要整個頁面都下載及分析完成後才會非同步執行這個js後面剩下的部分。

參考資料[2]有簡單明瞭的時序圖

測試

HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<script async src="01.js"></script>
<script defer src="02.js"></script>
</head>
<body>
Page START<br/>
Page END
</body>

JS 01.js

alert(1);

JS 02.js

alert(2);

測試結果

頁面畫完->1->2

拿掉async和defer結果:

1->2->頁面畫完

參考資料

[1] http://www.w3schools.com/tags/att_script_async.asp

[2] http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html

[3] http://blog.xuite.net/vexed/tech/61308318-script+tag+%E5%B1%AC%E6%80%A7+async+defer+%E5%B7%AE%E5%88%A5