使用defer和async實現(xiàn)高效加載JavaScript
沒有defer或async,在head

解析將暫停,直到獲取并執(zhí)行腳本為止。完成此操作后,解析將繼續(xù)。
沒有defer或async,在body末尾

解析是在沒有任何停頓的情況下完成的,當(dāng)它完成時,腳本會被fetched并執(zhí)行。 解析是在腳本下載之前完成的,因此頁面顯示早于前面的示例。
使用async,在head

腳本是異步獲取的,當(dāng)它下載完,HTML解析會暫停以執(zhí)行腳本,腳本執(zhí)行完,再接著解析HTML。
使用defer,在head

腳本是異步獲取的,當(dāng)HTML解析完,再執(zhí)行腳本。
“在head使用defer”和“在body末尾”都是在HTML解析完再執(zhí)行腳本, 但“在head使用defer”比“在body末尾”執(zhí)行腳本的時間要早,因為“在head使用defer”腳本是在HTML解析的同時下載的,而“在body末尾”腳本是在HTML解析完再下載的。
因此,就速度而言,這個是最優(yōu)的方式。
阻塞解析
async會阻止頁面的解析, defer不會。
阻塞渲染
async和defer都不能保證不阻塞渲染。這取決于你和你的腳本(例如,確保你的腳本在onLoad事件之后運行)。
domInteractive
標(biāo)記為defer的腳本在domInteractive事件之后立即執(zhí)行,該事件發(fā)生在加載、解析HTML和構(gòu)建DOM之后。
此時,CSS和圖像仍有待加載和解析。
完成此操作后,瀏覽器將發(fā)出domComplete事件,然后發(fā)出onLoad。
domInteractive之所以重要,是因為它的事件被認(rèn)為是感知加載速度的衡量標(biāo)準(zhǔn)。
考慮到延遲的優(yōu)點,在各種場景下,它似乎是比異步更好的選擇。
另一個贊成用defer的原因
標(biāo)記為async的腳本在可用時會按隨意順序執(zhí)行。標(biāo)記為defer的腳本將按標(biāo)記中定義的順序執(zhí)行(在解析完成后)。
如下,有一個index.html文件,引入3個標(biāo)記async的js文件和3個標(biāo)記defer的js文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="./1.js" async></script>
<script src="./2.js" async></script>
<script src="./3.js" async></script>
<script src="./11.js" defer></script>
<script src="./12.js" defer></script>
<script src="./13.js" defer></script>
</body>
</html>
2.js 和 12.js文件比較大,下載會慢一些

最終的執(zhí)行順序如下:

async和defer的區(qū)別
async和defer都是異步加載腳本,但async是加載完腳本后立即執(zhí)行,而defer是在HTML解析完成后再執(zhí)行腳本,也就是async會阻塞HTML的解析,defer不會阻塞。async和defer都不能保證不阻塞HTML的渲染。
標(biāo)記為async的腳本在可用時會按隨意順序執(zhí)行。標(biāo)記為defer的腳本將按標(biāo)記中定義的順序執(zhí)行(在解析完成后)。
以上就是使用defer和async高效加載JavaScript的詳細(xì)內(nèi)容,更多關(guān)于defer和async加載JavaScript的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript動態(tài)添加數(shù)據(jù)到表單并提交的幾種方式
這篇文章主要介紹了JavaScript動態(tài)添加數(shù)據(jù)到表單并提交,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-06-06
json對象轉(zhuǎn)為字符串,當(dāng)做參數(shù)傳遞時加密解密的實現(xiàn)方法
下面小編就為大家?guī)硪黄猨son對象轉(zhuǎn)為字符串,當(dāng)做參數(shù)傳遞時加密解密的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
百度Popup.js彈出框進(jìn)化版 拖拽小框架發(fā)布 兼容IE6/7/8,Firefox,Chrome
百度空間的彈出窗口和拖拽效果(也就是popup.js),代碼精簡,效果也很好,我們可以在很多大型網(wǎng)站上見到這種效果,在我的項目中也使用了該js。2010-04-04
bootstrap 路徑導(dǎo)航 分頁 進(jìn)度條的實例代碼
本文通過實例代碼給大家介紹了bootstrap 路徑導(dǎo)航 分頁 進(jìn)度條的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
window.showModalDialog()返回值的學(xué)習(xí)心得總結(jié)
本篇文章主要介紹了window.showModalDialog()返回值的學(xué)習(xí)心得。需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
JavaScript實現(xiàn)的鼠標(biāo)跟隨特效示例【2則實例】
這篇文章主要介紹了JavaScript實現(xiàn)的鼠標(biāo)跟隨特效,結(jié)合2則實例形式分析了javascript針對鼠標(biāo)事件的響應(yīng)、計算、處理及頁面元素動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-12-12

