亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳談LABJS按需動態加載js文件

2019-11-20 12:32:00
字體:
來源:轉載
供稿:網友

LABjs 是一個很小的 JavaScript 工具,用來根據需要加載 JavaScript 文件,通過使用該工具可以提升頁面的性能,避免加載不需用到的 JavaScript 文件,可以實現動態并行加載腳本文件,以及管理加載腳本文件的執行順序。

簡單示例

$LAB.script("script1.js", "script2.js", "script3.js").block(function(){  // wait for all to load, then do something  script1Func();  script2Func();  script3Func();});

介紹下LABJS的幾個實例:
實例1:

$LAB  .script("script1.js")  .script("script2.js")  .script("script3.js")  .wait(function(){ // 等待所有script加載完再執行這個代碼塊    script1Func();    script2Func();    script3Func();  });

實例2:

$LAB   .script({ src: "script1.js", type: "text/javascript" })  .script("script2.js")  .script("script3.js")  .wait(function(){ // 等待所有script加載完再執行這個代碼塊    script1Func();    script2Func();    script3Func();  });

實例3:

$LAB  .script("script1.js", "script2.js", "script3.js")  .wait(function(){ // 等待所有script加載完再執行這個代碼塊    script1Func();    script2Func();    script3Func();  });

實例4:

$LAB  .script( [ "script1.js", "script2.js" ], "script3.js")  .wait(function(){ // 等待所有script加載完再執行這個代碼塊    script1Func();    script2Func();    script3Func();  });

實例5:

$LAB  .script("script1.js").wait() // 空的wait()只是確保script1在其他代碼之前被執行  .script("script2.js") // script2 和 script3 依賴于 script1  .script("script3.js").wait() // 但是script2 和 script3 并不互相依賴,可以并行下載  .script("script4.js") // script4 依賴于 script1, script2 及 script3  .wait(function(){script4Func();});

實例6:

$LAB  .script("script1.js") // script1, script2, and script3 之間沒有依賴關系,  .script("script2.js") // 所以可以任意順序執行  .script("script3.js")  .wait(function(){ // 如果需要,這里當然可以執行javascript函數    alert("Scripts 1-3 are loaded!");  })  .script("script4.js") // 依賴于 script1, script2 及 script3  .wait(function(){script4Func();});

實例7:

$LAB  .setOptions({AlwaysPreserveOrder:true}) // 設置每個腳本之間等待  .script("script1.js") // script1, script2, script3, script4 互相依賴  .script("script2.js") // 并且并行下載后循序執行  .script("script3.js")  .script("script4.js")  .wait(function(){script4Func();});

實例8:

$LAB  .script(function(){    // `_is_IE`的值ie為true ,非ie為false    if (_is_IE) {      return "ie.js"; // 如果是ie則這個js會被加載    }    else {      return null; //如果不是ie這個代碼就會被略過    }  })  .script("script1.js")  .wait();

LABjs加載方式

LABjs里的動態加載腳本文件,是指頁面的js腳本執行時,通過多種方法去加載外部的js(主要區別于html頁面里,通過<script>標簽靜態加載的腳本)

動態加載腳本的方式有很多,優缺點不一,此處不贅述,有興趣的童鞋可以參見本文末尾的參考鏈接 :)。

LABjs里主要使用了三種技巧,分別為Script Element、XHR Injection以及Cache Trick

首先對這三種加載方式進行簡單介紹,第四部分再分析LABjs源碼實現里面對著三種方式分別的使用場景

Script Element(LABjs默認采用加載方式)

最常見的腳本動態加載方式,優點很多,包括:1、實現簡單 2、可跨域 3、不會阻塞其他資源的加載 等

Opera/Firefox(老版本)下:腳本執行的順序與節點被插入頁面的順序一致

IE/Safari/Chrome下:執行順序無法得到保證

注意:

新版本的Firefox下,腳本執行的順序與插入頁面的順序不一定一致,但可通過將script標簽的async屬性設置為false來保證順序執行

老版本的Chrome下,腳本執行的順序與插入頁面的順序不一定一致,但可通過將script標簽的async屬性設置為false來保證順序執行

XHR Injection
通過ajax請求加載腳本文件,然后再通過以下方式執行:
eval:常見方式
XHR injection:創建一個script元素,并將請加載的腳本文件的內容注入
主要限制:無法跨域
Cache Trick(強依賴于瀏覽器的特性實現,不推薦使用)
當你將script元素的type屬性設置為瀏覽器不認識的值,比如”text/cache”、”text/casper”、”text/hellworld”等,不同瀏覽器的行為如下:
IE/Safari/Chrome(老版本)里:腳本照常加載,但不會執行,假設瀏覽器沒有禁用緩存,加載后的腳本會被瀏覽器緩存起來,當需要用到 的時候,只需要重新創建個script標簽,將type設為正確的值,src指向之前請求的文件url即可(相當于從緩存里讀文件)
Opera/Firefox:不加載
備注:
強依賴于瀏覽器的特性實現,有可能隨著瀏覽器特性實現的改變而失效,不推薦使用
新版本的chrome瀏覽器,將script元素的type設置為非”text/javascript”,不會再對腳本文件進行加載。

LABjs里關于腳本加載采用方案的判斷

忽略技術細節,通過一段偽代碼來描述LABjs里面的實現,大致為:
首先判斷是否對請求的腳本進行預加載(是否進行預加載的判斷條件看偽代碼注釋);
如進行預加載,再判斷瀏覽器是否支持真正的預加載;如支持真正的預加載,則預加載之;如否,判斷請求的腳本是否跟當前頁面同域,如實,采用XHR Injection,如否,采用Cache Trick;
如不進行預加載,判斷瀏覽器支不支持script元素的async屬性(見偽代碼注釋),如是,設置async屬性,并請求腳本文件;如否,直接通過script元素加載腳本文件;
 

if(ifPreloadScript){  //當請求的腳本文件是否進行預加載:1、需要預加載 2、瀏覽器支持預加載  if(supportRealPreloading){  //如果支持真正的預加載    if(supportPreloadPropNatively){  //支持通過設置script標簽的preload屬性,實現script的預加載,以及分離加載和執行                    //Nicholas C. Zakas大神的美好愿望,尚未有瀏覽器支持:/blog/2011/02/14/separating-javascript-download-and-execution/      script.onpreload = callback;      script.newPreload = true;      script.src = targetUrl;    }else{      script.onreadystatechange = callback;  //其實就是指IE瀏覽器,假設指定了script元素的src屬性,IE瀏覽器里會立即加載      script.src = targetUrl;  //即使script元素沒有被插入頁面,callback為預加載后的回調    }  }  else if(inSameDomain){  //非跨域,采用XHR Injection:請求的腳本與當前頁面處于同一個域    xhr = new XMLHttpRequest();  //由于上個判斷已經將IE無情地拋棄在這個條件分支之外,所以大膽地用 new XMLHttpRequest()吧    xhr.onreadystatechange = callback;    xhr.open("GET",targetUrl);    xhr.send();  }  else{  //最無奈的后招,Cache Trick,新版chromei已經不支持    script.onload = callback;    script.type = 'text/cache';      script.src = targetUrl;  }}else{  if(canContrlExecutionOrderByAsync){  //如果能夠通過script元素的async屬性來強制并行加載的腳本順序執行                    //kyle大神著力推進的提案,目前已被html5小組接受并放入草案:/Dynamic_Script_Execution_Order#My_Solution    script.onload = callback;    script.async = false;  //將script元素的async設為false,可以保證script的執行順序與請求順序保持一致    script.src = targetUrl;  }  else{    script.onload = callback;    script.src = targetUrl;    }}

實際上,當你在頁面創建一個img節點,并將其src指向一個腳本文件,在部分瀏覽器里同樣能夠起到文件預加載的作用,那么LABjs的作者是不是沒有想到這一點呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品成人91久久久久久久| 精品视频在线导航| 亚洲自拍偷拍一区| 亚洲成avwww人| www.日韩av.com| 亚洲色图日韩av| 一区二区欧美激情| 91精品久久久久久久久久久久久久| 久久精品人人爽| 97色在线观看| 亚洲欧美国产精品va在线观看| 国产精品久久久久久久久久ktv| 久久精品成人一区二区三区| 亚洲高清在线观看| 久久久久久噜噜噜久久久精品| 成人深夜直播免费观看| 久久精品成人欧美大片古装| 国产精品亚洲网站| 日韩精品中文字幕在线| 亚洲永久在线观看| 久久午夜a级毛片| 久久久久久成人精品| 亚洲少妇中文在线| 亚洲精品一区二区久| 国产精品露脸av在线| 国产精品福利网| 久久久久久久999| 久久影院免费观看| 欧美精品免费看| 亚洲精品午夜精品| 欧美体内谢she精2性欧美| 日产日韩在线亚洲欧美| 欧美视频在线观看 亚洲欧| 久久精品国产精品亚洲| 亚洲国产成人精品女人久久久| 一本大道久久加勒比香蕉| 一区二区三区在线播放欧美| 性欧美暴力猛交69hd| 亚洲影院色无极综合| 伊人成人开心激情综合网| 久久伊人精品视频| 亚洲美女喷白浆| 亚洲电影在线观看| 亚洲mm色国产网站| 精品福利视频导航| 日韩中文在线观看| 欧美极品少妇与黑人| 91爱视频在线| 亚洲黄页网在线观看| 成人黄色片在线| 中文欧美日本在线资源| 日韩成人在线视频观看| 亚洲成色777777女色窝| 欧美性受xxxx白人性爽| 久青草国产97香蕉在线视频| 少妇高潮 亚洲精品| 91九色国产社区在线观看| 97在线看免费观看视频在线观看| 国内精品视频在线| 热久久99这里有精品| 中文字幕精品一区久久久久| 欧美性资源免费| 日韩欧亚中文在线| 欧美怡红院视频一区二区三区| 精品视频www| 国产日韩精品综合网站| 亚洲精品一区二区在线| 亚洲精品按摩视频| 疯狂做受xxxx欧美肥白少妇| 欧美激情国产高清| 久久精品国产亚洲精品2020| xxx欧美精品| 亚洲人成电影在线观看天堂色| xvideos亚洲| 亚洲福利视频免费观看| 亚洲女成人图区| 亚洲欧美综合区自拍另类| 久久综合久久八八| 欧美激情第99页| 国产99久久精品一区二区 夜夜躁日日躁| 日韩av综合网站| www.日韩系列| 国产一区二区三区网站| 日韩美女视频免费在线观看| 亚洲最大av在线| 久久久久久久色| 久久成人av网站| 国产日韩精品一区二区| 久久精品视频免费播放| 国产精品久久一区| 欧美激情xxxx性bbbb| 综合网日日天干夜夜久久| 久久中文字幕视频| 美女视频黄免费的亚洲男人天堂| 亚洲精品视频在线播放| 欧美成人精品在线观看| 亚洲韩国日本中文字幕| 亚洲欧美中文字幕| 国产精品久久久久免费a∨| 在线观看欧美www| 日韩精品久久久久久久玫瑰园| 欧美激情精品久久久| 狠狠久久亚洲欧美专区| 97人人模人人爽人人喊中文字| 欧美在线观看视频| 亚洲三级黄色在线观看| 国产精品视频999| 日韩精品一二三四区| 精品视频—区二区三区免费| 久久久久久久国产精品| 国产精品高清网站| 欧美天天综合色影久久精品| 日韩免费视频在线观看| 国产精品爽爽ⅴa在线观看| 欧美人在线观看| 国产欧美一区二区三区在线看| 大伊人狠狠躁夜夜躁av一区| 91爱视频在线| 欧美日本啪啪无遮挡网站| 久久久亚洲欧洲日产国码aⅴ| 91tv亚洲精品香蕉国产一区7ujn| 日韩在线免费观看视频| 91av在线影院| 色偷偷av一区二区三区乱| 国产精品自拍网| 欧美成年人网站| 亚洲毛片在线观看| 久久久亚洲精品视频| 91国产精品电影| 亚洲欧美国产一区二区三区| 国产精品久久久久久网站| 国产精品中文字幕在线观看| 国产精品日本精品| 精品一区二区亚洲| 日韩www在线| 色青青草原桃花久久综合| 青青草成人在线| 性日韩欧美在线视频| 亚洲国产精品福利| 亚洲欧美制服综合另类| 欧美午夜精品久久久久久人妖| 成人亚洲综合色就1024| 国产成人免费av电影| 国产不卡精品视男人的天堂| 精品国产一区二区三区久久狼黑人| 亚洲免费中文字幕| 日韩av大片免费看| 中文字幕精品在线| 色综合老司机第九色激情| 久久久久久久久久国产精品| 国产精品免费视频久久久| 国产亚洲欧美另类中文| 中文字幕精品在线| 欧美性猛交xxxx乱大交| 韩国日本不卡在线| 久久综合电影一区| 国产精品亚洲第一区| 久久久女女女女999久久| 色综合91久久精品中文字幕| 91精品国产综合久久香蕉的用户体验| 欧美性猛交xxxxx水多| 精品福利免费观看| 欧美激情一二区| 日本久久久a级免费|