淺談async、defer以普通script加載的區(qū)別
如果用一張圖片詮釋這幾種script加載的特點(diǎn),應(yīng)該是這樣的:

結(jié)合圖片我們可以將三種方式的特點(diǎn)總結(jié)如下:
<script>: 當(dāng)HTML解析過(guò)程中遇到script標(biāo)簽時(shí),瀏覽器中斷HTML解析,隨即下載script文件,完成后立即執(zhí)行script,執(zhí)行完成后再繼續(xù)HTML解析<script async>: 當(dāng)HTML解析過(guò)程中遇到script標(biāo)簽時(shí),不會(huì)中斷HTML解析,同時(shí)并行下載script文件,下載完成后中斷HTML解析并執(zhí)行script,執(zhí)行完成后再繼續(xù)HTML解析(script的執(zhí)行順序不一定按照script標(biāo)簽的出現(xiàn)順序,而是取決于script下載完成的順序)<script defer>: 當(dāng)HTML解析過(guò)程中遇到script標(biāo)簽時(shí),不會(huì)中斷HTML解析,同時(shí)并行下載script文件,直到HTML解析完成再執(zhí)行script(script的執(zhí)行順序與script標(biāo)簽出現(xiàn)順序一致)
我們可以通過(guò)一個(gè)小項(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 = `
// 超長(zhǎng)文本
`
text1.split(' ');
console.timeLog('timer', '--- 1.js excuted');2.js:
const text2 = `
// 超長(zhǎng)文本
`
text2.split(' ');
console.timeLog('timer', '--- 2.js excuted');3.js:
const text3 = `
// 超長(zhǎng)文本
`
text3.split(' ');
console.timeLog('timer', '--- 3.js excuted');我們分別使用普通、async和defer的方式加載1.js、2.js、3.js,觀察控制臺(tái)的打印結(jié)果:
普通:

結(jié)論:script出現(xiàn)會(huì)中斷HTML加載,且script會(huì)順序的加載、執(zhí)行,所有script執(zhí)行完成后再解析HTML。
Async:

結(jié)論:HTML解析和script下載同步進(jìn)行,script執(zhí)行會(huì)中斷HTML解析;script執(zhí)行順序和tag出現(xiàn)順序不一定相同;script可能會(huì)在document loaded之后執(zhí)行。
Defer:

結(jié)論:HTML解析和script下載同步進(jìn)行;script會(huì)在HTML解析完成后和document loaded之前執(zhí)行,且執(zhí)行順序和tag出現(xiàn)順序一致。
由以上實(shí)驗(yàn)可知:如果使用普通方式時(shí)通常建議將script放到<body>的最后,以免阻塞HTML解析影響網(wǎng)頁(yè)打開(kāi)速度。而defer相對(duì)于async更具優(yōu)勢(shì),不會(huì)阻塞HTML解析且script的執(zhí)行順序可以預(yù)測(cè),有一些需要預(yù)先下載執(zhí)行的script可以使用defer的方式在<head>中引用。
到此這篇關(guān)于淺談async、defer以普通script加載的區(qū)別的文章就介紹到這了,更多相關(guān)async、defer以及普通script加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- script標(biāo)簽中的async和defer詳細(xì)說(shuō)明與使用場(chǎng)景
- script標(biāo)簽中的defer和async使用技巧說(shuō)明
- JavaScript延遲加載之a(chǎn)sync與defer的應(yīng)用
- JS script腳本中async和defer區(qū)別詳解
- JavaScript無(wú)阻塞加載和defer、async詳解
- 淺析script標(biāo)簽中的defer與async屬性
- 關(guān)于Javascript中defer和async的區(qū)別總結(jié)
- JS中script標(biāo)簽defer和async屬性的區(qū)別詳解
相關(guān)文章
教你用wxml2canvas將微信小程序頁(yè)面轉(zhuǎn)為圖片
如果需要實(shí)現(xiàn)將小程序的頁(yè)面轉(zhuǎn)為圖片,第一步是要先把頁(yè)面轉(zhuǎn)為canvas,再將canvas轉(zhuǎn)為圖片,下面這篇文章主要給大家介紹了關(guān)于用wxml2canvas將微信小程序頁(yè)面轉(zhuǎn)為圖片的相關(guān)資料,需要的朋友可以參考下2022-11-11
Javascript 鼠標(biāo)移動(dòng)上去 滑塊跟隨效果代碼分享
這篇文章主要介紹了Javascript 鼠標(biāo)移動(dòng)上去 滑塊跟隨效果代碼,有需要的朋友可以參考一下2013-11-11
分享50個(gè)超級(jí)有用的JavaScript單行代碼(推薦!)
JavaScript是一種腳本語(yǔ)言,是直接在瀏覽器運(yùn)行的,下面這篇文章主要給大家介紹了50個(gè)超級(jí)有用的JavaScript單行代碼的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
javascript IE中的DOM ready應(yīng)用技巧
當(dāng)我們想在頁(yè)面加載之后執(zhí)行某個(gè)函數(shù),肯定會(huì)想到onload了 但onload在瀏覽器看來(lái),就是頁(yè)面上的東西全部都加載完畢后才能發(fā)生,但那就為時(shí)已晚了。2008-07-07
利用babel將es6語(yǔ)法轉(zhuǎn)es5的簡(jiǎn)單示例
Babel是一個(gè)廣泛使用的轉(zhuǎn)碼器,babel可以將ES6代碼完美地轉(zhuǎn)換為ES5代碼,所以下面這篇文章就來(lái)給大家詳細(xì)介紹了關(guān)于利用babel將es6語(yǔ)法轉(zhuǎn)es5的相關(guān)資料,文章通過(guò)示例介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12

