css文件的動態(tài)加載應(yīng)用具有多種效果,css文件的動態(tài)加載的知識不計其數(shù),但是總的方法還是動態(tài)加載css文件,下面是錯新技術(shù)頻道小編帶給大家的JS實現(xiàn)完美include.html" target="_blank">include加載功能代碼,一起來了解一下吧!
已有js include的一些問題
在寫這個之前在網(wǎng)上搜索了些資料,發(fā)現(xiàn)以前寫的include都存在2個問題,這也是include需要解決的比較重要的2個問題。
1、相對路徑的問題: 在a.js中使用include("../js/common.js"); include 函數(shù)中肯定是使用相對路徑,是相對a.js的路徑。而a.js在html中使用<script>嵌入有可能是相對路徑,有可能是絕對路徑。 include函數(shù)如何才能真正確定common.js的絕對路徑,或者是相對html的相對路徑。網(wǎng)上一些為了解決這個問題,還需要加一些js變量,不方便。
2、引用的問題。 網(wǎng)上include函數(shù)的實現(xiàn)幾乎都是使用下面2種方式插入common.js
document.write("<script src='" + .. + "></script>")
或者
var s = document.createElement("script");
s.src = ...;
head.insertAfter(s,...);
document.write 輸出的腳本會在a.js后面加載,而createElement("script")創(chuàng)建的腳本是非阻塞加載。 所以如果在common.js加載完畢之前,a.js中調(diào)用了common.js的函數(shù)就會報錯。
實現(xiàn)
解決上面2個問題,就可以實現(xiàn)js include。
第1個問題,我的方法是先獲取到a.js在html中的絕對路徑(如果是相對路徑,就轉(zhuǎn)為絕對路徑),然后再把common.js的路徑轉(zhuǎn)為絕對路徑。
第2個問題,采用同步的ajax來請求common.js,這樣就不會出現(xiàn)引用問題。
實現(xiàn)代碼如下:
在a.js中直接使用 include("../js/common.js");
多請求的問題
使用上面的include看上去挺爽的,不過卻帶來另外1個嚴(yán)重的問題,就是多發(fā)送了1個ajax的請求。
我們常常為了WEB性能,而合并js,減少請求。但使用include后卻偏偏多了請求。如果這個問題不解決,相信很多人都不會在正式產(chǎn)品中使用include的了,除非是局域網(wǎng)產(chǎn)品。
如何解決這個多請求的問題,我也思考很久,最后覺的單單使用客戶端js是沒辦法解決了。所以就想到了使用服務(wù)端代碼來解決
還記的我之前有文章介紹 "js、css的合并、壓縮、緩存管理"的時候,就通過服務(wù)器端代碼在程序啟動時候去合并js。
所以我把include多請求的解決方案也加到里面去。就是在程序啟動的時候去查找所有的js,發(fā)現(xiàn)有使用include的就把include中common.js的源代碼替換該include函數(shù)。這樣a.js中在運行的時候就沒有include函數(shù),而是真真包含了common.js的內(nèi)容的js文件
后語
丫的。說到最后,怎么又把所有的include都替換掉了,哪之前說的那么多不白說了。
個人覺得,每個產(chǎn)品都應(yīng)該要區(qū)分開發(fā)環(huán)境和產(chǎn)品環(huán)境(一般通過配置文件進(jìn)行區(qū)分),在開發(fā)環(huán)境應(yīng)該以開發(fā)效率為首要,而產(chǎn)品環(huán)境則以性能為首。所以這里的inlcude就應(yīng)該要區(qū)分對待,在開發(fā)環(huán)境中使用js include來提高開發(fā)和維護(hù)效率,而在產(chǎn)品環(huán)境中則自動把所有include替換成真真的js文件的內(nèi)容。
通過上述介紹,大家對JS實現(xiàn)完美include加載功能代碼有了一定的了解吧,如果大家有需要,錯新技術(shù)頻道擁有專業(yè)的知識,可以幫您。
新聞熱點
疑難解答
圖片精選