您好,登錄后才能下訂單哦!
今天小編給大家分享的是async、defer以普通script加載有什么區(qū)別,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會有所收獲的哦。
如果用一張圖片詮釋這幾種script加載的特點(diǎn),應(yīng)該是這樣的:
結(jié)合圖片我們可以將三種方式的特點(diǎn)總結(jié)如下:
<script>
: 當(dāng)HTML解析過程中遇到script標(biāo)簽時,瀏覽器中斷HTML解析,隨即下載script文件,完成后立即執(zhí)行script,執(zhí)行完成后再繼續(xù)HTML解析
<script async>
: 當(dāng)HTML解析過程中遇到script標(biāo)簽時,不會中斷HTML解析,同時并行下載script文件,下載完成后中斷HTML解析并執(zhí)行script,執(zhí)行完成后再繼續(xù)HTML解析(script的執(zhí)行順序不一定按照script標(biāo)簽的出現(xiàn)順序,而是取決于script下載完成的順序)
<script defer>
: 當(dāng)HTML解析過程中遇到script標(biāo)簽時,不會中斷HTML解析,同時并行下載script文件,直到HTML解析完成再執(zhí)行script(script的執(zhí)行順序與script標(biāo)簽出現(xiàn)順序一致)
我們可以通過一個小項(xiàng)目驗(yàn)證上面的結(jié)論。
index.html:
<!DOCTYPE html> <html lang="en"> <head> <script> console.time('timer'); console.timeLog('timer', '--- Start parsing HTML'); document.addEventListener('DOMContentLoaded', function () { console.timeLog('timer', '--- Document loaded'); }); </script> </head> <body> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Explicabo harum velit itaque assumenda, quibusdam obcaecati suscipit quasi odit accusantium soluta qui, debitis quae iusto? Nobis ratione ut nesciunt a minima. </p> <!-- 此處省略500行重復(fù)元素 --> <script>console.timeLog('timer', '--- Start loading 1.js')</script> <script src='./1.js'></script> <script>console.timeLog('timer', '--- Start loading 2.js')</script> <script src='./2.js'></script> <script>console.timeLog('timer', '--- Start loading 3.js')</script> <script src='./3.js'></script> <!-- 此處省略1500行重復(fù)元素 --> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Explicabo harum velit itaque assumenda, quibusdam obcaecati suscipit quasi odit accusantium soluta qui, debitis quae iusto? Nobis ratione ut nesciunt a minima. </p> <script> console.timeLog('timer', '--- End parsing HTML') </script> </body> </html>
1.js:
const text1 = ` // 超長文本 ` text1.split(' '); console.timeLog('timer', '--- 1.js excuted');
2.js:
const text2 = ` // 超長文本 ` text2.split(' '); console.timeLog('timer', '--- 2.js excuted');
3.js:
const text3 = ` // 超長文本 ` text3.split(' '); console.timeLog('timer', '--- 3.js excuted');
我們分別使用普通、async和defer的方式加載1.js、2.js、3.js,觀察控制臺的打印結(jié)果:
普通:
結(jié)論:script出現(xiàn)會中斷HTML加載,且script會順序的加載、執(zhí)行,所有script執(zhí)行完成后再解析HTML。
Async:
結(jié)論:HTML解析和script下載同步進(jìn)行,script執(zhí)行會中斷HTML解析;script執(zhí)行順序和tag出現(xiàn)順序不一定相同;script可能會在document loaded之后執(zhí)行。
Defer:
結(jié)論:HTML解析和script下載同步進(jìn)行;script會在HTML解析完成后和document loaded之前執(zhí)行,且執(zhí)行順序和tag出現(xiàn)順序一致。
由以上實(shí)驗(yàn)可知:如果使用普通方式時通常建議將script放到<body>
的最后,以免阻塞HTML解析影響網(wǎng)頁打開速度。而defer相對于async更具優(yōu)勢,不會阻塞HTML解析且script的執(zhí)行順序可以預(yù)測,有一些需要預(yù)先下載執(zhí)行的script可以使用defer的方式在<head>
中引用。
關(guān)于async、defer以普通script加載有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。