Script的加載方法小結(jié)
1.靜態(tài)加載
CSS,圖片資源文件在頁(yè)面渲染過(guò)程中可以并行下載,不會(huì)阻塞。在IE8,F(xiàn)F下,也可以支持JS的并行下載。盡管頁(yè)面的JS下載加速了,但是JS對(duì)頁(yè)面渲染的阻塞還是依然存在的,只有JS加載完畢了,頁(yè)面的剩余部分才能繼續(xù)渲染。放在Head部分的Script是最為惡劣的,因?yàn)閷?duì)頁(yè)面來(lái)說(shuō),Head部分是require的,是后部分所必須的,Head部分不加載完畢,Body部分不會(huì)開始解析,Body解析之前,頁(yè)面是空白的。靜態(tài)Script放到頁(yè)面的哪部分來(lái)說(shuō)都是阻塞,從瀏覽器實(shí)現(xiàn)的角度來(lái)說(shuō)很好理解,因?yàn)镴S代碼中完全有可能修改頁(yè)面元素影響Dom結(jié)構(gòu)。因?yàn)闉g覽器對(duì)JS行為的不可預(yù)知,所以只好等前面的Script加載完畢后再繼續(xù)渲染。所以最佳實(shí)踐往往是說(shuō)將Script放到頁(yè)面底部</body>附近。
JS加載對(duì)前臺(tái)性能的影響,雅虎優(yōu)化原則之一是減少Http請(qǐng)求數(shù),壓縮JS,合并JS,減少JS數(shù)。
若是業(yè)務(wù)上有很多獨(dú)立模塊化的JS需要加載,可以考慮在線打包的方案。
2。延遲加載
W3C標(biāo)準(zhǔn)HTML4.01給Script標(biāo)簽定義了一個(gè)defer屬性,指明該JS不會(huì)改變Dom的content,瀏覽器可繼續(xù)解析和渲染,無(wú)需阻塞在該Script。
http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html
但部分瀏覽器并不支持該屬性。所以它不是個(gè)很好的跨瀏覽器解決方案。
3.動(dòng)態(tài)加載
<script type="text/javascript">
var js = document.createElement("script");
js.src = '**.js';
document.getElementsByTagName("head")[0].appendChild(js);
</script>
這段代碼創(chuàng)建了script標(biāo)簽,并插入這條標(biāo)簽到文檔中。關(guān)鍵在于,這個(gè)腳本的加載時(shí)異步的,不會(huì)影響頁(yè)面渲染的進(jìn)程,不會(huì)阻塞頁(yè)面內(nèi)容的展示。這樣的方式盡管不會(huì)阻塞頁(yè)面資源的加載,但卻可能會(huì)阻塞其他的script腳本,不同瀏覽器在這點(diǎn)上的表現(xiàn)是有非常大的差異的,參看這篇文章動(dòng)態(tài)引入的外部 JS 文件在各瀏覽器中的加載順序不一致
有兩點(diǎn)非常突出,
1.同樣的動(dòng)態(tài)加載代碼,不同瀏覽器對(duì)動(dòng)態(tài)加載進(jìn)來(lái)的js,是否阻塞下條Script標(biāo)簽的表現(xiàn)是不一樣的
2.實(shí)現(xiàn)動(dòng)態(tài)加載的那段代碼順序不同,對(duì)同一個(gè)瀏覽器來(lái)說(shuō),結(jié)果可能是非常迥異的,
如:
代碼順序的調(diào)換,IE的表現(xiàn)就不一樣
所以,對(duì)動(dòng)態(tài)加載腳本,需要重點(diǎn)關(guān)注的一個(gè)問(wèn)題是,所動(dòng)態(tài)加載的JS腳本的接口依賴問(wèn)題。這個(gè)問(wèn)題的解決方案也不復(fù)雜,既根據(jù)實(shí)現(xiàn)業(yè)務(wù)的需要跟蹤所加載腳本的加載狀態(tài)。加載狀態(tài)的判斷在IE下用readyState屬性,非IE瀏覽器支持,腳本加載完成后的onload方法的調(diào)用。
業(yè)界優(yōu)秀的延遲加載庫(kù)
Ryan Grove 的LazeLoad https://github.com/rgrove/lazyload
Kyle Simpson 的 LABjs http://labjs.com/
相關(guān)文章
js使瀏覽器窗口最大化實(shí)現(xiàn)代碼(適用于IE)
點(diǎn)擊最大化按鈕后,瀏覽器的內(nèi)容填充滿顯示器,瀏覽器窗口的邊框被擠出顯示器。而該js的最大化效果是瀏覽器的邊框在顯示器內(nèi)顯示,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-08-08
js判斷兩個(gè)數(shù)組相等的5種方法實(shí)例
再最近的一次實(shí)際項(xiàng)目開發(fā)中,又遇到了需要對(duì)兩個(gè)數(shù)組內(nèi)容進(jìn)行比較的需求,索性整理下,這篇文章主要給大家介紹了關(guān)于js判斷兩個(gè)數(shù)組相等的5種方法,需要的朋友可以參考下2022-05-05
js unicode 編碼解析關(guān)于數(shù)據(jù)轉(zhuǎn)換為中文的兩種方法
這篇文章主要介紹了js unicode 編碼解析關(guān)于數(shù)據(jù)轉(zhuǎn)換為中文的兩種方法,需要的朋友可以參考下2014-04-04
十個(gè)利用JavaScript實(shí)現(xiàn)的愛(ài)心動(dòng)畫特效
情人節(jié)將至,程序員證明自己不是直男的時(shí)候到啦!小編為大家準(zhǔn)備了十個(gè)通過(guò)JavaScript實(shí)現(xiàn)的愛(ài)心動(dòng)畫特效,快學(xué)起來(lái),到時(shí)候給女朋友一個(gè)驚喜吧2022-02-02
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解,本文講解了對(duì)棧的操作、對(duì)棧的實(shí)現(xiàn)實(shí)例等內(nèi)容,需要的朋友可以參考下2015-03-03
多個(gè)js毫秒倒計(jì)時(shí)同時(shí)進(jìn)行效果
這篇文章主要以實(shí)例的方式講解多個(gè)js毫秒倒計(jì)時(shí)同時(shí)進(jìn)行效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
原生javascript實(shí)現(xiàn)DIV拖拽并計(jì)算重復(fù)面積
這篇文章主要介紹了使用原生javascript實(shí)現(xiàn)DIV拖拽并計(jì)算重復(fù)面積的方法及示例代碼分享,效果十分漂亮,需要的朋友可以參考下2015-01-01



