預設情況下,瀏覽器是同步載入 JavaScript 腳本,即渲染引擎遇到<script>標簽就會停下來,等到執行完腳本,再繼續向下渲染。如果是外部腳本,還必須加入腳本下載的時間。 如果腳本體積很大,下載和執行的時間就會很長,因此造成瀏覽器堵塞,用戶會感覺到瀏覽器“卡死”了,沒有任何響應。這顯然是很不 ...
預設情況下,瀏覽器是同步載入 JavaScript 腳本,即渲染引擎遇到<script>
標簽就會停下來,等到執行完腳本,再繼續向下渲染。如果是外部腳本,還必須加入腳本下載的時間。
如果腳本體積很大,下載和執行的時間就會很長,因此造成瀏覽器堵塞,用戶會感覺到瀏覽器“卡死”了,沒有任何響應。這顯然是很不好的體驗,所以瀏覽器允許腳本非同步載入,下麵就是兩種非同步載入的語法。
<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>
上面代碼中,<script>
標簽打開defer
或async
屬性,腳本就會非同步載入。渲染引擎遇到這一行命令,就會開始下載外部腳本,但不會等它下載和執行,而是直接執行後面的命令。
defer
與async
的區別是:
1: defer
要等到整個頁面在記憶體中正常渲染結束(DOM 結構完全生成,以及其他腳本執行完成),才會執行;
2: async
一旦下載完,渲染引擎就會中斷渲染,執行這個腳本以後,再繼續渲染。一句話,defer
是“渲染完再執行”,async
是“下載完就執行”。另外,如果有多個defer
腳本,會按照它們在頁面出現的順序載入,而多個async
腳本是不能保證載入順序的。
參考資料: 《EcmaScript 6 入門》作者:阮一峰