日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【飞秋】JS 实现完美include

發(fā)布時間:2025/3/15 javascript 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【飞秋】JS 实现完美include 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

js為什么需要include?讓我們想想這樣1個場景,a.js 需要用到1個公用的common.js,當(dāng)然你可以在用到a.js的頁面使用<script src="common.js">,但假設(shè)有5個頁面用到了a.js,你是不是要寫5遍<script。而且要是以后a.js 又需要引用common2.js,你是不是又的修改5個頁面了?

?

已有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ù)的實(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ù)就會報錯。

?

實(shí)現(xiàn)

??   解決上面2個問題,就可以實(shí)現(xiàn)js include。?

?  第1個問題,我的方法是先獲取到a.js在html中的絕對路徑(如果是相對路徑,就轉(zhuǎn)為絕對路徑),然后再把common.js的路徑轉(zhuǎn)為絕對路徑。?

?  第2個問題,采用同步的ajax來請求common.js,這樣就不會出現(xiàn)引用問題。

?

  實(shí)現(xiàn)代碼如下:

?

view sourceprint?01 // 根據(jù)相對路徑獲取絕對路徑?

02 function getPath(relativePath,absolutePath){?

03???? var reg = new RegExp("//.//./","g");?

04???? var uplayCount = 0;???? // 相對路徑中返回上層的次數(shù)。?

05???? var m = relativePath.match(reg);?

06???? if(m) uplayCount = m.length;?

07???????

08???? var lastIndex = absolutePath.length-1;??

09???? for(var i=0;i<=uplayCount;i++){?

10???????? lastIndex = absolutePath.lastIndexOf("/",lastIndex);?

11???? }?

12???? return absolutePath.substr(0,lastIndex+1) + relativePath.replace(reg,"");?

13 }????????

14???

15 function include(jssrc){?

16???? // 先獲取當(dāng)前a.js的src。a.js中調(diào)用include,直接獲取最后1個script標(biāo)簽就是a.js的引用。?

17???? var scripts = document.getElementsByTagName("script");?

18???? var lastScript = scripts[scripts.length-1];?

19???? var src = lastScript.src;?

20???? if(src.indexOf("http://")!=0 && src.indexOf("/") !=0){???????

21???????? // a.js使用相對路徑,先替換成絕對路徑?

22???????? var url = location.href;?

23???????? var index = url.indexOf("?");?

24???????? if(index != -1){?

25???????????? url = url.substring(0, index-1);?

26???????? }?

27???????????

28???????? src = getPath(src,url);?

29???? }?

30???? var jssrcs = jssrc.split("|");? // 可以include多個js,用|隔開?

31???? for(var i=0;i<jssrcs.length;i++){?

32???????? // 使用juqery的同步ajax加載js.?

33???????? // 使用document.write 動態(tài)添加的js會在當(dāng)前js的后面,可能會有js引用問題?

34???????? // 動態(tài)創(chuàng)建script腳本,是非阻塞下載,也會出現(xiàn)引用問題?

35???????? $.ajax({type:'GET',url:getPath(jssrc,src),async:false,dataType:'script'});?

36???? }?

37 }

?

  在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中在運(yùn)行的時候就沒有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)容。

關(guān)注技術(shù)文章飛秋:http://www.freeeim.com/,24小時專業(yè)轉(zhuǎn)載。

?

總結(jié)

以上是生活随笔為你收集整理的【飞秋】JS 实现完美include的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。