<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 36, comments - 419, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    JS 實現完美include

    Posted on 2010-08-09 08:29 BearRui(AK-47) 閱讀(3111) 評論(7)  編輯  收藏 所屬分類: javascript

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

     

    已有js include的一些問題

        在寫這個之前在網上搜索了些資料,發現以前寫的include都存在2個問題,這也是include需要解決的比較重要的2個問題。

       1、相對路徑的問題:  在a.js中使用include("../js/common.js");  include 函數中肯定是使用相對路徑,是相對a.js的路徑。而a.js在html中使用<script>嵌入有可能是相對路徑,有可能是絕對路徑。  include函數如何才能真正確定common.js的絕對路徑,或者是相對html的相對路徑。網上一些為了解決這個問題,還需要加一些js變量,不方便。  

       2、引用的問題。  網上include函數的實現幾乎都是使用下面2種方式插入common.js     

          document.write("<script src='" + .. + "></script>")  

        或者    

          var s = document.createElement("script");    

          s.src = ...;    

          head.insertAfter(s,...);    

        document.write 輸出的腳本會在a.js后面加載,而createElement("script")創建的腳本是非阻塞加載。  所以如果在common.js加載完畢之前,a.js中調用了common.js的函數就會報錯。

     

    實現

         解決上面2個問題,就可以實現js include。  

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

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

     

      實現代碼如下:

     // 根據相對路徑獲取絕對路徑

    function getPath(relativePath,absolutePath){
        
    var reg = new RegExp("\\.\\./","g");
        
    var uplayCount = 0;        // 相對路徑中返回上層的次數。
        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){
        
    // 先獲取當前a.js的src。a.js中調用include,直接獲取最后1個script標簽就是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 動態添加的js會在當前js的后面,可能會有js引用問題
            // 動態創建script腳本,是非阻塞下載,也會出現引用問題
            $.ajax({type:'GET',url:getPath(jssrc,src),async:false,dataType:'script'});
        }
    }

      在a.js中直接使用 include("../js/common.js");

     

    多請求的問題

      使用上面的include看上去挺爽的,不過卻帶來另外1個嚴重的問題,就是多發送了1個ajax的請求。

      我們常常為了WEB性能,而合并js,減少請求。但使用include后卻偏偏多了請求。如果這個問題不解決,相信很多人都不會在正式產品中使用include的了,除非是局域網產品。

     

      如何解決這個多請求的問題,我也思考很久,最后覺的單單使用客戶端js是沒辦法解決了。所以就想到了使用服務端代碼來解決

      還記的我之前有文章介紹 "js、css的合并、壓縮、緩存管理"的時候,就通過服務器端代碼在程序啟動時候去合并js。

     

      所以我把include多請求的解決方案也加到里面去。就是在程序啟動的時候去查找所有的js,發現有使用include的就把include中common.js的源代碼替換該include函數。這樣a.js中在運行的時候就沒有include函數,而是真真包含了common.js的內容的js文件

     

    后語

      丫的。說到最后,怎么又把所有的include都替換掉了,哪之前說的那么多不白說了。

     

      個人覺得,每個產品都應該要區分開發環境和產品環境(一般通過配置文件進行區分),在開發環境應該以開發效率為首要,而產品環境則以性能為首。所以這里的inlcude就應該要區分對待,在開發環境中使用js include來提高開發和維護效率,而在產品環境中則自動把所有include替換成真真的js文件的內容。

     

      都說完了,歡迎大家拍磚討論。



    [作者]:BearRui(AK-47)
    [博客]: http://www.tkk7.com/bearrui/
    [聲明]:本博所有文章版權歸作者所有(除特殊說明以外),轉載請注明出處.
    英雄,別走啊,幫哥評論下:  

    精彩推薦 好文要頂 水平一般 看不懂 還需努力

    評論

    # re: JS 實現完美include  回復  更多評論   

    2010-08-09 11:25 by DNF免費外掛
    http://www.1ploan.com http://www.51pkwg.com http://www.h0701.com

    # re: JS 實現完美include  回復  更多評論   

    2010-08-10 14:48 by hanmiao
    有幾個錯別字,文章寫得不錯。

    # re: JS 實現完美include  回復  更多評論   

    2010-08-10 15:18 by BearRui(AK-47)
    @hanmiao
    呵呵,不好意思,有點粗心了。

    # re: JS 實現完美include  回復  更多評論   

    2010-08-16 18:01 by kevon
    文章很精彩,推薦一下!

    # re: JS 實現完美include  回復  更多評論   

    2010-08-16 18:02 by kevon
    好文章,頂一下!

    # re: JS 實現完美include  回復  更多評論   

    2010-08-16 18:02 by kevon
    文章很精彩,推薦一下!

    # re: JS 實現完美include  回復  更多評論   

    2010-08-16 18:02 by kevon
    好文章,頂一下!
    主站蜘蛛池模板: 一区免费在线观看| 亚洲精品无码久久久久秋霞 | 亚洲国产成人手机在线电影bd| jizz在线免费观看| 久久久久国产成人精品亚洲午夜| 国产亚洲精品免费| 亚洲AV无码乱码精品国产| 国产成人 亚洲欧洲| 国产又粗又猛又爽又黄的免费视频| 亚洲午夜理论片在线观看| 天天摸天天碰成人免费视频| 亚洲av一本岛在线播放| 成人特黄a级毛片免费视频| 97se亚洲国产综合自在线| 啦啦啦中文在线观看电视剧免费版| 亚洲va精品中文字幕| 成人免费无毒在线观看网站| 亚洲自国产拍揄拍| 日产乱码一卡二卡三免费| 国产精品亚洲а∨无码播放不卡 | 成人人观看的免费毛片| 欧美日韩亚洲精品| 亚洲综合另类小说色区色噜噜| 久久精品免费大片国产大片| 亚洲男人第一av网站| 免费专区丝袜脚调教视频| 香蕉大伊亚洲人在线观看| 国产无遮挡裸体免费视频| jizz免费在线观看| 亚洲黄色三级视频| 青草草在线视频永久免费| 一个人看的www免费高清| 亚洲欧洲日韩不卡| 成人毛片18女人毛片免费| 日日摸夜夜添夜夜免费视频| 国产亚洲精品va在线| 成人人观看的免费毛片| 岛国岛国免费V片在线观看| 亚洲成人高清在线观看| 免费国产怡红院在线观看| 大地影院MV在线观看视频免费|