最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS 實現(xiàn)完美include載入實現(xiàn)代碼

 更新時間:2010年08月05日 13:29:16   作者:  
在寫這個之前在網(wǎng)上搜索了些資料,發(fā)現(xiàn)以前寫的include都存在2個問題,這也是include需要解決的比較重要的2個問題。
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ù)的實現(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)代碼如下:
復(fù)制代碼 代碼如下:

// 根據(jù)相對路徑獲取絕對路徑
function getPath(relativePath,absolutePath){
var reg = new RegExp("\\.\\./","g");
var uplayCount = 0; // 相對路徑中返回上層的次數(shù)。
var m = relativePath.match(reg);
if(m) uplayCount = m.length;
var lastIndex = absolutePath.length-1;
for(var i=0;i<=uplayCount;i++){
lastIndex = absolutePath.lastIndexOf("/",lastIndex);
}
return absolutePath.substr(0,lastIndex+1) + relativePath.replace(reg,"");
}
function include(jssrc){
// 先獲取當(dāng)前a.js的src。a.js中調(diào)用include,直接獲取最后1個script標(biāo)簽就是a.js的引用。
var scripts = document.getElementsByTagName("script");
var lastScript = scripts[scripts.length-1];
var src = lastScript.src;
if(src.indexOf("http://")!=0 && src.indexOf("/") !=0){
// a.js使用相對路徑,先替換成絕對路徑
var url = location.href;
var index = url.indexOf("?");
if(index != -1){
url = url.substring(0, index-1);
}
src = getPath(src,url);
}
var jssrcs = jssrc.split("|"); // 可以include多個js,用|隔開
for(var i=0;i<jssrcs.length;i++){
// 使用juqery的同步ajax加載js.
// 使用document.write 動態(tài)添加的js會在當(dāng)前js的后面,可能會有js引用問題
// 動態(tài)創(chuàng)建script腳本,是非阻塞下載,也會出現(xiàn)引用問題
$.ajax({type:'GET',url:getPath(jssrc,src),async:false,dataType:'script'});
}
}

在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)境(一般通過配置文件進行區(qū)分),在開發(fā)環(huán)境應(yīng)該以開發(fā)效率為首要,而產(chǎn)品環(huán)境則以性能為首。所以這里的inlcude就應(yīng)該要區(qū)分對待,在開發(fā)環(huán)境中使用js include來提高開發(fā)和維護效率,而在產(chǎn)品環(huán)境中則自動把所有include替換成真真的js文件的內(nèi)容。
[作者]:BearRui(AK-47)

相關(guān)文章

  • 小程序?qū)崿F(xiàn)人臉識別功能(百度ai)

    小程序?qū)崿F(xiàn)人臉識別功能(百度ai)

    這篇文章主要介紹了小程序?qū)崿F(xiàn)人臉識別功能(百度ai),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 如何在JavaScript?中獲取域名

    如何在JavaScript?中獲取域名

    本文將討論如何使用?JavaScript?事件和函數(shù)在網(wǎng)頁執(zhí)行期間以編程方式獲取域名,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-06-06
  • javascript中關(guān)于break,continue的特殊用法與介紹

    javascript中關(guān)于break,continue的特殊用法與介紹

    javascript大家所熟知中的for是一個循環(huán)體,循環(huán)體其中的break和continue也是大家都比較熟悉的功能,相信大家對它們的用法不會陌生,本文不是介紹其功能,本文假設(shè)你已經(jīng)熟悉break和continue的語意和用法
    2012-05-05
  • JS實現(xiàn)骰子3D旋轉(zhuǎn)效果

    JS實現(xiàn)骰子3D旋轉(zhuǎn)效果

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)骰子3D旋轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • JavaScript函數(shù)增強以及額外知識

    JavaScript函數(shù)增強以及額外知識

    函數(shù)就是封裝了一段可以被重復(fù)執(zhí)行調(diào)用的代碼塊,下面這篇文章主要給大家介紹了關(guān)于JavaScript函數(shù)增強以及額外知識的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • nodejs創(chuàng)建web服務(wù)器之hello world程序

    nodejs創(chuàng)建web服務(wù)器之hello world程序

    本文給大家分享nodejs創(chuàng)建web服務(wù)器之hello world程序,node真的很好用,不僅用v8引擎來解析了javascript外,還提供了高度優(yōu)化的應(yīng)用庫,真的很好,有需要的朋友一起來學(xué)習(xí)吧
    2015-08-08
  • JavaScript棧和隊列相關(guān)操作與實現(xiàn)方法詳解

    JavaScript棧和隊列相關(guān)操作與實現(xiàn)方法詳解

    這篇文章主要介紹了JavaScript棧和隊列相關(guān)操作與實現(xiàn)方法,結(jié)合實例形式較為詳細(xì)的分析了javascript棧和隊列的概念、原理、定義、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-12-12
  • JS使用for循環(huán)遍歷Table的所有單元格內(nèi)容

    JS使用for循環(huán)遍歷Table的所有單元格內(nèi)容

    JS遍歷Table的所有單元格內(nèi)容思路是遍歷Table的所有Row,遍歷Row中的每一列,獲取Table中單元格的內(nèi)容
    2014-08-08
  • 淺談Webpack4 Tree Shaking 終極優(yōu)化指南

    淺談Webpack4 Tree Shaking 終極優(yōu)化指南

    這篇文章主要介紹了淺談Webpack4 Tree Shaking 終極優(yōu)化指南,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Javascript與vbscript數(shù)據(jù)共享

    Javascript與vbscript數(shù)據(jù)共享

    Javascript與vbscript數(shù)據(jù)共享...
    2007-01-01

最新評論

甘孜县| 上犹县| 新余市| 凌海市| 历史| 嫩江县| 漳浦县| 汉阴县| 榆树市| 庄河市| 潍坊市| 白城市| 黄骅市| 股票| 双流县| 咸丰县| 滁州市| 临漳县| 凯里市| 连城县| 长海县| 阿坝县| 泗阳县| 英吉沙县| 建水县| 九江市| 石泉县| 修水县| 北流市| 循化| 商洛市| 嵊州市| 百色市| 尖扎县| 大安市| 固始县| 拉萨市| 大名县| 集贤县| 宝兴县| 萨迦县|