HTML5 script元素async、defer異步加載使用介紹
發(fā)布時(shí)間:2013-08-23 17:13:25 作者:佚名
我要評(píng)論

異步加載,可以理解為無(wú)阻塞并發(fā)處理,過去我們使用各種JavaScript技巧來(lái)做這種事情,現(xiàn)在WebKit為HTML5實(shí)現(xiàn)了SCRIPT標(biāo)簽的async異步屬性,感興趣的朋友可以了解下
(譯者注: 異步加載,可以理解為無(wú)阻塞并發(fā)處理.)
我對(duì)于HTML5感到興奮不已的原因之一是它實(shí)現(xiàn)了眾多業(yè)界期待已久的特性。我們一直需要輸入框顯示空白提示,但都是用JavaScript來(lái)實(shí)現(xiàn)的。我們也想要整個(gè)塊都變成可被點(diǎn)擊,也是使用JavaScript來(lái)實(shí)現(xiàn)。
現(xiàn)在WebKit為HTML5實(shí)現(xiàn)了SCRIPT標(biāo)簽的async異步屬性。過去我們使用各種JavaScript技巧來(lái)做這種事情,但現(xiàn)在新的屬性讓防止阻塞變得相對(duì)容易。
async - HTML屬性
如我前面提到的,添加async屬性非常簡(jiǎn)單:
<!-- 指定async,以及 onload 回調(diào)-->
<script async src="siteScript.js" onload="myInit()"></script>
事實(shí)上,如果你的JavaScript以及HTML結(jié)構(gòu)設(shè)計(jì)的合理,那么90%的情況下你的Script元素可以使用異步加載。
defer - HTML屬性
Safari 瀏覽器額外添加了defer屬性
<!-- 指定defer,效果和async差不多-->
<script defer src="siteScript.js" onload="myInit()"></script>
async 與 defer 的差別
WebKit官方博客 很好地解釋了async 與 defer 的不同
------------------------------------
正常情況下,當(dāng)瀏覽器在解析HTML源文件時(shí)如果遇到外部的script,那么解析過程會(huì)暫停,并發(fā)送請(qǐng)求來(lái)下載script文件,只有script完全下載并執(zhí)行后才會(huì)繼續(xù)執(zhí)行DOM解析。比如:
<script src="myBlockingScript.js"></script>
在下載過程中瀏覽器是被阻止做其他有用的工作的,包括 解析HTML,執(zhí)行其他腳本,以及展示CSS布局。雖然Webkit預(yù)加載掃描程序可以探測(cè)性地在下載階段進(jìn)行多線程下載,但是某些頁(yè)面仍然存在很大的網(wǎng)絡(luò)延遲。
當(dāng)前有很多技術(shù)來(lái)提升頁(yè)面顯示速度,但都需要額外的代碼以及針對(duì)特定瀏覽器的技巧?,F(xiàn)在,script可以通過添加async或者defer屬性來(lái)讓腳本不必同步執(zhí)行,示例如下:
<script async src="myAsyncScript.js" onload="myInit()"></script>
<script defer src="myDeferScript.js" onload="myInit()"></script>
async 和 defer 標(biāo)注的 script 都不會(huì)暫停HTML解析就立刻被下載,兩者都支持onload事件回調(diào)來(lái)解決需要該腳本來(lái)執(zhí)行的初始化。
兩者的區(qū)別在于執(zhí)行時(shí)的不同:
async 腳本在script文件下載完成后會(huì)立即執(zhí)行,并且其執(zhí)行時(shí)間一定在 window的load事件觸發(fā)之前。這意味著多個(gè)async腳本很可能不會(huì)按其在頁(yè)面中的出現(xiàn)次序順序執(zhí)行。
與此相對(duì),瀏覽器確保多個(gè) defer 腳本按其在HTML頁(yè)面中的出現(xiàn)順序依次執(zhí)行,且執(zhí)行時(shí)機(jī)為DOM解析完成后,document的DOMContentLoaded 事件觸發(fā)之前。
下面展示的是一個(gè)需要1秒來(lái)下載,以及1秒來(lái)解析執(zhí)行其他操作的例子,我們可以看到整個(gè)頁(yè)面載入花了大約2秒鐘。
同樣的例子,但這次我們指定了script的 defer 屬性.因?yàn)楫?dāng)defer腳本下載的時(shí)候,其他操作可以并行執(zhí)行,所以大概快了1倍。
------------------------------------
哪些瀏覽器支持async 和 defer
同樣是上面引用的文章中提到:
除了基于Webkit的新版本瀏覽器,FireFox已經(jīng)支持defer和onload屬性很長(zhǎng)時(shí)間了,而且從FF3.6開始添加了async屬性。IE同樣支持defer屬性,但還不支持async屬性,從IE9開始,onload屬性也將被支持。
aynsc 棒極了!
看到webkit實(shí)現(xiàn)async我開心得合不攏嘴了。對(duì)每個(gè)網(wǎng)站來(lái)說(shuō),阻塞都是一個(gè)巨大的性能瓶頸,而可以直接指定script文件異步加載無(wú)疑會(huì)加快web頁(yè)面的速度.
我對(duì)于HTML5感到興奮不已的原因之一是它實(shí)現(xiàn)了眾多業(yè)界期待已久的特性。我們一直需要輸入框顯示空白提示,但都是用JavaScript來(lái)實(shí)現(xiàn)的。我們也想要整個(gè)塊都變成可被點(diǎn)擊,也是使用JavaScript來(lái)實(shí)現(xiàn)。
現(xiàn)在WebKit為HTML5實(shí)現(xiàn)了SCRIPT標(biāo)簽的async異步屬性。過去我們使用各種JavaScript技巧來(lái)做這種事情,但現(xiàn)在新的屬性讓防止阻塞變得相對(duì)容易。
async - HTML屬性
如我前面提到的,添加async屬性非常簡(jiǎn)單:
復(fù)制代碼
代碼如下:<!-- 指定async,以及 onload 回調(diào)-->
<script async src="siteScript.js" onload="myInit()"></script>
事實(shí)上,如果你的JavaScript以及HTML結(jié)構(gòu)設(shè)計(jì)的合理,那么90%的情況下你的Script元素可以使用異步加載。
defer - HTML屬性
Safari 瀏覽器額外添加了defer屬性
復(fù)制代碼
代碼如下:<!-- 指定defer,效果和async差不多-->
<script defer src="siteScript.js" onload="myInit()"></script>
async 與 defer 的差別
WebKit官方博客 很好地解釋了async 與 defer 的不同
------------------------------------
正常情況下,當(dāng)瀏覽器在解析HTML源文件時(shí)如果遇到外部的script,那么解析過程會(huì)暫停,并發(fā)送請(qǐng)求來(lái)下載script文件,只有script完全下載并執(zhí)行后才會(huì)繼續(xù)執(zhí)行DOM解析。比如:
<script src="myBlockingScript.js"></script>
在下載過程中瀏覽器是被阻止做其他有用的工作的,包括 解析HTML,執(zhí)行其他腳本,以及展示CSS布局。雖然Webkit預(yù)加載掃描程序可以探測(cè)性地在下載階段進(jìn)行多線程下載,但是某些頁(yè)面仍然存在很大的網(wǎng)絡(luò)延遲。
當(dāng)前有很多技術(shù)來(lái)提升頁(yè)面顯示速度,但都需要額外的代碼以及針對(duì)特定瀏覽器的技巧?,F(xiàn)在,script可以通過添加async或者defer屬性來(lái)讓腳本不必同步執(zhí)行,示例如下:
復(fù)制代碼
代碼如下:<script async src="myAsyncScript.js" onload="myInit()"></script>
<script defer src="myDeferScript.js" onload="myInit()"></script>
async 和 defer 標(biāo)注的 script 都不會(huì)暫停HTML解析就立刻被下載,兩者都支持onload事件回調(diào)來(lái)解決需要該腳本來(lái)執(zhí)行的初始化。
兩者的區(qū)別在于執(zhí)行時(shí)的不同:
async 腳本在script文件下載完成后會(huì)立即執(zhí)行,并且其執(zhí)行時(shí)間一定在 window的load事件觸發(fā)之前。這意味著多個(gè)async腳本很可能不會(huì)按其在頁(yè)面中的出現(xiàn)次序順序執(zhí)行。
與此相對(duì),瀏覽器確保多個(gè) defer 腳本按其在HTML頁(yè)面中的出現(xiàn)順序依次執(zhí)行,且執(zhí)行時(shí)機(jī)為DOM解析完成后,document的DOMContentLoaded 事件觸發(fā)之前。
下面展示的是一個(gè)需要1秒來(lái)下載,以及1秒來(lái)解析執(zhí)行其他操作的例子,我們可以看到整個(gè)頁(yè)面載入花了大約2秒鐘。

同樣的例子,但這次我們指定了script的 defer 屬性.因?yàn)楫?dāng)defer腳本下載的時(shí)候,其他操作可以并行執(zhí)行,所以大概快了1倍。

------------------------------------
哪些瀏覽器支持async 和 defer
同樣是上面引用的文章中提到:
除了基于Webkit的新版本瀏覽器,FireFox已經(jīng)支持defer和onload屬性很長(zhǎng)時(shí)間了,而且從FF3.6開始添加了async屬性。IE同樣支持defer屬性,但還不支持async屬性,從IE9開始,onload屬性也將被支持。
aynsc 棒極了!
看到webkit實(shí)現(xiàn)async我開心得合不攏嘴了。對(duì)每個(gè)網(wǎng)站來(lái)說(shuō),阻塞都是一個(gè)巨大的性能瓶頸,而可以直接指定script文件異步加載無(wú)疑會(huì)加快web頁(yè)面的速度.
相關(guān)文章
html5表單提交按鈕圓形進(jìn)度條加載動(dòng)畫
一款modernizr html5表單提交按鈕圓形進(jìn)度條加載動(dòng)畫表單驗(yàn)證效果2014-04-22HTML5實(shí)現(xiàn)的圖片無(wú)限加載的瀑布流效果另帶邊框圓角陰影
一款網(wǎng)頁(yè)瀑布流效果,可以實(shí)現(xiàn)圖片的無(wú)限制加載。基于時(shí)下流行的HTML5技術(shù)編寫而成,除了實(shí)現(xiàn)瀑布流,還加入了CSS5的圖片修飾效果,比如圖片的圓角邊框、圖片陰影立體效果2014-03-07HTML5 預(yù)加載讓頁(yè)面得以快速呈現(xiàn)
預(yù)加載是一種瀏覽器機(jī)制,使用瀏覽器空閑時(shí)間來(lái)預(yù)先下載/加載用戶接下來(lái)很可能會(huì)瀏覽的頁(yè)面/資源,當(dāng)用戶訪問某個(gè)預(yù)加載的鏈接時(shí),如果從緩存命中,頁(yè)面就得以快速呈現(xiàn)2013-08-13HTML5 本地存儲(chǔ)和內(nèi)容按需加載的思路和方法
本文將著重介紹HTML5本地存儲(chǔ)和內(nèi)容按需加載的思路和方法,以及HTML5視頻技術(shù)的效果。LOL官網(wǎng)采用的減少加載量的方法,在首頁(yè)上為用戶節(jié)省了至少600K的下載量,同時(shí)大大減2011-04-07HTML5實(shí)現(xiàn)手機(jī)端相冊(cè)觸屏滑動(dòng)切換特效源碼
這是一個(gè)手機(jī)移動(dòng)端圖片相冊(cè)觸屏滑動(dòng)切換預(yù)覽的代碼。本段代碼適合于移動(dòng)端使用2015-09-25HTML5實(shí)現(xiàn)手機(jī)觸屏圖片滑動(dòng)幻燈片特效源碼
HTML5實(shí)現(xiàn)手機(jī)觸屏圖片滑動(dòng)幻燈片源碼是一個(gè)基于jquery-2.0.0.min.js實(shí)現(xiàn)的手機(jī)圖片滑動(dòng)幻燈片代碼,支持PC端和手機(jī)移動(dòng)端2015-07-15HTML5實(shí)現(xiàn)的手機(jī)上下滑動(dòng)翻頁(yè)特效源碼
是一段實(shí)現(xiàn)了在手機(jī)端出現(xiàn)的觸屏滑動(dòng)翻頁(yè)效果代碼,本段代碼適應(yīng)于所有網(wǎng)頁(yè)使用,有興趣的朋友們可以前來(lái)下載使用2015-05-28jQuery+HTML5實(shí)現(xiàn)的頁(yè)面整屏滑動(dòng)切換效果源碼
是一段實(shí)現(xiàn)了右側(cè)帶有索引按鈕的頁(yè)面滾動(dòng)特效,支持鼠標(biāo)滾動(dòng)控制。本段代碼適應(yīng)于所有網(wǎng)頁(yè)使用,有興趣的朋友們可以前來(lái)下載使用2017-12-13HTML5實(shí)現(xiàn)的模擬現(xiàn)實(shí)物理Ball Pool動(dòng)態(tài)效果源碼
HTML5實(shí)現(xiàn)的模擬現(xiàn)實(shí)物理Ball Pool效果源碼可以通過拖動(dòng)圓球、點(diǎn)擊鼠標(biāo)、晃動(dòng)瀏覽器、雙擊頁(yè)面背景或按住鼠標(biāo)左鍵來(lái)實(shí)現(xiàn)圓球的增加、滑動(dòng)與跳躍效果,具有很強(qiáng)的立體感。是2014-10-15HTML5手機(jī)端手指上下拉滑動(dòng)加載更多數(shù)據(jù)特效源碼
HTML5手機(jī)端手指上下拉滑動(dòng)加載更多數(shù)據(jù)特效源碼是一款通過jquery實(shí)現(xiàn)tab切換和上拉加載更多的效果,適用于手機(jī)端頁(yè)面開發(fā)。本段代碼適應(yīng)于所有網(wǎng)頁(yè)使用,有需要的朋友可以2016-07-21