国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

JavaScript文件的同步和異步加載的實(shí)現(xiàn)代碼

2019-11-19 15:44:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

對(duì)于JS文件的引用,盡管當(dāng)前有不少框架和工具(比如webpack,commonjs,requiresjs等)都做了很好的處理。但是拋開(kāi)這些框架,了解原生的加載方式還是不無(wú)裨益。本文簡(jiǎn)述一些js文件的同步和異步加載方式。

同步加載

可在html文件里以<script>標(biāo)簽插入,這是初學(xué)時(shí)最基本的方式。

準(zhǔn)備兩個(gè)js文件如下:

calc1.js

console.log('calc1 loading begin')function add(...args) {  return args.reduce((currentTotal, i) => currentTotal + i, 0);}console.log('calc1 loading end')

calc2.js

console.log('calc2 loading begin')console.log(add(1,2,3))console.log('calc2 loading end')

calc2.js 是依賴calc1.js的。

html文件如下:

<body>  <script src="calc1.js">  </script>    <script src="calc2.js">  </script></body>

這種方式下,文件加載是同步的。即calc1.js加載完成后,才加載calc2.js,所以保證了calc2.js總能正確地調(diào)用calc1里的add函數(shù)。在Chrome里的調(diào)試結(jié)果如下:

但同步加載的缺點(diǎn)也明顯,如果有多個(gè)文件的時(shí)候,全部加載時(shí)間會(huì)很長(zhǎng),而且阻塞用戶界面響應(yīng)。

通過(guò)Script Element異步加載

異步加載的優(yōu)點(diǎn)是,能夠同時(shí)加載多個(gè)js文件,而且由于是異步,不會(huì)阻塞用戶界面,用戶體驗(yàn)好。當(dāng)然缺點(diǎn)是,不能保證有依賴關(guān)系的文件的加載順序。

html 代碼

<head>  <meta charset="UTF-8">  <title>Title</title>  <script type="text/javascript">    var script1 = document.createElement('script');    script1.src='calc1.js';    script1.type='text/javascript';    var script2 = document.createElement('script');    script2.src='calc2.js';    script2.type='text/javascript';    document.getElementsByTagName('head')[0].appendChild(script1).appendChild(script2);  </script></head>

在Chrome里的調(diào)試結(jié)果有時(shí)候能正確的輸出如下:

但有時(shí)候由于clac1.js沒(méi)有被先加載,calc2.js執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。

那么我們就得需要解決加載順序問(wèn)題,保證calc1.js先加載。

<head>  <meta charset="UTF-8">  <title>Title</title>  <script type="text/javascript">    function loadScript(file, callbackFn) {      var script = document.createElement('script');      script.src= file;      script.type='text/javascript';      // 監(jiān)聽(tīng)onload時(shí)間,當(dāng)前js文件加載完成后,再加載下一個(gè)      script.onload = callbackFn;      document.getElementsByTagName('head')[0].appendChild(script)    }        loadScript('calc1.js', function () {      loadScript('calc2.js');    } );  </script></head>

這樣就能永遠(yuǎn)輸出正確結(jié)果了。

通過(guò) AJAX 加載JS文件
 

 <script>    function loadScript(file, callbackFn) {      var xhr = new XMLHttpRequest();      xhr.open('get', file, true);      // for IE      if (xhr.onreadystatechange) {        xhr.onreadystatechange = function () {          console.log(xhr.readyState, xhr.status);          if (xhr.readyState == 4) {            if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {              insertScriptText(xhr.responseText);              if (callbackFn) {                callbackFn();              }            }          }        }      } else {        xhr.onload = function () {          insertScriptText(xhr.responseText);          if (callbackFn) {            callbackFn();          }        }      }      xhr.send(null);    }    function insertScriptText(scriptText) {      var script = document.createElement('script');      script.type = 'text/javascript';      script.text = scriptText;      document.body.appendChild(script);    }    loadScript('calc1.js', function () {      loadScript('calc2.js');    });  </script>

也能正確的輸出結(jié)果。

總結(jié)

如果是單一或少數(shù)js文件,可以在html body的最后插入script標(biāo)簽,以同步方式加載。Webpack其實(shí)也是把多個(gè)js文件合并稱一個(gè),然后在body插入script引用。

如果是多個(gè)js文件,建議異步加載,以避免阻塞界面渲染,也縮短整體加載時(shí)間。本文介紹了script element和Ajax兩種方式,并且對(duì)于有依賴關(guān)系的文件加載順序,也做了實(shí)例。請(qǐng)參考 https://github.com/JackieGe/Js-Learn/tree/master/ch1-async-loading

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 晋中市| 龙川县| 天台县| 屏南县| 宜城市| 清镇市| 马山县| 喀什市| 林口县| 大渡口区| 安泽县| 廊坊市| 鲁山县| 惠安县| 长海县| 洛阳市| 呼和浩特市| 阜新| 常山县| 海晏县| 得荣县| 昌江| 长武县| 滦平县| 浙江省| 秭归县| 衡阳县| 河东区| 永嘉县| 武乡县| 松原市| 青浦区| 托克逊县| 囊谦县| 陵川县| 柳河县| 武城县| 新源县| 濮阳市| 南澳县| 阳山县|