溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用HTML5中script元素async、defer

發(fā)布時間:2021-10-11 22:18:00 來源:億速云 閱讀:125 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“如何使用HTML5中script元素async、defer”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!



現(xiàn)在WebKit為HTML5實現(xiàn)了SCRIPT標(biāo)簽的async異步屬性。過去我們使用各種JavaScript技巧來做這種事情,但現(xiàn)在新的屬性讓防止阻塞變得相對容易。

async - HTML屬性
如我前面提到的,添加async屬性非常簡單:

代碼如下:


<!-- 指定async,以及 onload 回調(diào)-->
<script async src="siteScript.js" onload="myInit()"></script>


事實上,如果你的JavaScript以及HTML結(jié)構(gòu)設(shè)計的合理,那么90%的情況下你的Script元素可以使用異步加載。

defer - HTML屬性
Safari 瀏覽器額外添加了defer屬性

代碼如下:


<!-- 指定defer,效果和async差不多-->
<script defer src="siteScript.js" onload="myInit()"></script>


async 與 defer 的差別
WebKit官方博客 很好地解釋了async 與 defer 的不同
------------------------------------
正常情況下,當(dāng)瀏覽器在解析HTML源文件時如果遇到外部的script,那么解析過程會暫停,并發(fā)送請求來下載script文件,只有script完全下載并執(zhí)行后才會繼續(xù)執(zhí)行DOM解析。比如:
<script src="myBlockingScript.js"></script>
在下載過程中瀏覽器是被阻止做其他有用的工作的,包括 解析HTML,執(zhí)行其他腳本,以及展示CSS布局。雖然Webkit預(yù)加載掃描程序可以探測性地在下載階段進行多線程下載,但是某些頁面仍然存在很大的網(wǎng)絡(luò)延遲。
當(dāng)前有很多技術(shù)來提升頁面顯示速度,但都需要額外的代碼以及針對特定瀏覽器的技巧?,F(xiàn)在,script可以通過添加async或者defer屬性來讓腳本不必同步執(zhí)行,示例如下:

代碼如下:


<script async src="myAsyncScript.js" onload="myInit()"></script>
<script defer src="myDeferScript.js" onload="myInit()"></script>


async 和 defer 標(biāo)注的 script 都不會暫停HTML解析就立刻被下載,兩者都支持onload事件回調(diào)來解決需要該腳本來執(zhí)行的初始化。
兩者的區(qū)別在于執(zhí)行時的不同:
async 腳本在script文件下載完成后會立即執(zhí)行,并且其執(zhí)行時間一定在 window的load事件觸發(fā)之前。這意味著多個async腳本很可能不會按其在頁面中的出現(xiàn)次序順序執(zhí)行。
與此相對,瀏覽器確保多個 defer 腳本按其在HTML頁面中的出現(xiàn)順序依次執(zhí)行,且執(zhí)行時機為DOM解析完成后,document的DOMContentLoaded 事件觸發(fā)之前。

下面展示的是一個需要1秒來下載,以及1秒來解析執(zhí)行其他操作的例子,我們可以看到整個頁面載入花了大約2秒鐘。
如何使用HTML5中script元素async、defer 
同樣的例子,但這次我們指定了script的 defer 屬性.因為當(dāng)defer腳本下載的時候,其他操作可以并行執(zhí)行,所以大概快了1倍。
如何使用HTML5中script元素async、defer 
------------------------------------
哪些瀏覽器支持async 和 defer
同樣是上面引用的文章中提到:

除了基于Webkit的新版本瀏覽器,FireFox已經(jīng)支持defer和onload屬性很長時間了,而且從FF3.6開始添加了async屬性。IE同樣支持defer屬性,但還不支持async屬性,從IE9開始,onload屬性也將被支持。

aynsc 棒極了!
看到webkit實現(xiàn)async我開心得合不攏嘴了。對每個網(wǎng)站來說,阻塞都是一個巨大的性能瓶頸,而可以直接指定script文件異步加載無疑會加快web頁面的速度.

“如何使用HTML5中script元素async、defer”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI