JavaScript文件的同步和異步加載的實現(xiàn)代碼
對于JS文件的引用,盡管當(dāng)前有不少框架和工具(比如webpack,commonjs,requiresjs等)都做了很好的處理。但是拋開這些框架,了解原生的加載方式還是不無裨益。本文簡述一些js文件的同步和異步加載方式。
同步加載
可在html文件里以<script>標(biāo)簽插入,這是初學(xué)時最基本的方式。
準(zhǔn)備兩個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é)果如下:
但同步加載的缺點也明顯,如果有多個文件的時候,全部加載時間會很長,而且阻塞用戶界面響應(yīng)。
通過Script Element異步加載
異步加載的優(yōu)點是,能夠同時加載多個js文件,而且由于是異步,不會阻塞用戶界面,用戶體驗好。當(dāng)然缺點是,不能保證有依賴關(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é)果有時候能正確的輸出如下:
但有時候由于clac1.js沒有被先加載,calc2.js執(zhí)行時會報錯。
那么我們就得需要解決加載順序問題,保證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)聽onload時間,當(dāng)前js文件加載完成后,再加載下一個 script.onload = callbackFn; document.getElementsByTagName('head')[0].appendChild(script) } loadScript('calc1.js', function () { loadScript('calc2.js'); } ); </script> </head>
這樣就能永遠輸出正確結(jié)果了。
通過 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其實也是把多個js文件合并稱一個,然后在body插入script引用。
如果是多個js文件,建議異步加載,以避免阻塞界面渲染,也縮短整體加載時間。本文介紹了script element和Ajax兩種方式,并且對于有依賴關(guān)系的文件加載順序,也做了實例。請參考 https://github.com/JackieGe/Js-Learn/tree/master/ch1-async-loading
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js動態(tài)創(chuàng)建上傳表單通過iframe模擬Ajax實現(xiàn)無刷新
這篇文章主要介紹了js動態(tài)創(chuàng)建上傳表單通過iframe模擬Ajax無刷新的具體實現(xiàn),需要的朋友可以參考下2014-02-02javascript事件的傳播基礎(chǔ)實例講解(35)
這篇文章主要為大家詳細介紹了javascript事件的傳播基礎(chǔ)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02js中將HTMLCollection/NodeList/偽數(shù)組轉(zhuǎn)換成數(shù)組的代碼
js中將HTMLCollection/NodeList/偽數(shù)組轉(zhuǎn)換成數(shù)組的代碼,需要的朋友可以參考下。2011-07-07JavaScript中實現(xiàn)跨標(biāo)簽頁通信的方法詳解
跨標(biāo)簽頁通信是指在瀏覽器中的不同標(biāo)簽頁之間進行數(shù)據(jù)傳遞和通信的過程,這篇文章為大家介紹了一下常見的跨標(biāo)簽頁通信方式,感興趣的小伙伴可以了解下2023-11-11JavaScript實現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫
現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234轉(zhuǎn)換后變?yōu)橐磺Ф偃脑俎D(zhuǎn)換成壹仟貳佰叁拾肆,所以本文給大家介紹了用JavaScript實現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫,感興趣的小伙伴跟著小編一起來看看吧2024-05-05