手機騰訊網js模塊管理框架,MT2.0發布

waynelu 10年前發布 | 14K 次閱讀 增量更新 mt 騰訊

什么是MT

MT是手機騰訊網前端團隊開發維護的一個專注于移動端的js模塊管理框架。

github:https://github.com/mtjs/mt

為了方便大家我們還在http://git.oschina.net上放了一個鏡像:

http://git.oschina.net/luyongfugx/mt

為什么使用MT

  • 無更新不下載
  • 簡單友好的模塊定義規范
  • 簡單易用的打包管理工具
  • 強大的js增量更新代理服務

MT2.0新增特性

  • 本地存儲異常回調
  • 統計回調
  • combo支持
  • 新增LCS增量算法

設置回調

通過設施g_config的storeInc對象的statFunc,storeExFunc兩個函數,可以設置統計和本地存儲異常回調 , statFunc在請求每個js的時候觸發,便于統計每個js的請求情況,storeExFunc在寫本地存儲異常回調, 將腳本內容寫入本地存儲出現異常的時候調用,用來提供給業務清理本地存儲。

                 storeInc:{
                    //統計回調,統計腳本請求情況,jsUrl是js地址,
                    //mode是請求模式,full:表示全量請求,
                    //inc表示增量請求,local表示從本地存儲讀取
                    'statFunc':function(jsUrl,mode){
                        console.log('get '+jsUrl+' from '+mode);
                    },
                    //寫本地存儲異常回調,將腳本內容寫入本地存儲
                    //出現異常的時候調用,用來提供給業務清理本地存儲
                    //,storekey表示寫如的key
                    'storeExFunc':function(storeKey){
                        console.log('set store item '+storeKey+' exception');
                    },
                    'store': true,
                    'inc': true,
                    'proxy':true,
                    'debug': false
                },
                    

冷combo

冷combo就是在打包混淆的時候把多個不同的模塊打包進同一個js,前臺下載的時候直接下載這個js 這個MT1.0已經支持,打包配置如下:

                      {
                         './release/{pv}/base-{fv}.js': {
                                files: ['./js/init.js','./js/util.js']
                         },
                         './release/{pv}/page/p1-{fv}.js': {
                            files: ['./js/page/p1.js']
                         },
                         './release/{pv}/page/p2-{fv}.js': {
                            files: ['./js/page/p2.js']
                         },
                         './release/{pv}/page/p3-{fv}.js': {
                            files: ['./js/page/p3.js']
                         }
                     }
                 

可以看到我們的init,util模塊被打到base.js里,達到冷combo的目的

熱combo,半熱combo

半熱combo是相對冷combo來說的,除了走打包實現冷combo以外,我們還支持通過前臺配置來實現半熱combo或熱combo

                             combo:{
                                 //是否啟用combo                                 cb:true,
                                //哪些模塊的js走半熱combo一塊下載                                //,這里數組的每個項是要一起下載的模塊                                 conf:['init,util','p1,p2,p3']

                            }
                      

上面的代碼,我們設置了combo的cb為true,說明走combo. conf的配置則設置了哪些模塊是要走combo一起下載的, 即使打包腳本沒有把他們打在一起。 為了看效果,我們先把cb設為false,conf設置為空數組,表示不走combo:

                                    combo:{
                                   //是否啟用combo                                    cb:flase,
                                   //哪些模塊的js走半熱combo一塊下載                                    //,這里數組的每個項是要一起下載的模塊                                    conf:[]

                                   }
                               

我們看下網絡請求:

可以看到base.js,p1.js,p2.js,p3.js是分開下載的,說明沒有走combo

然后設置了combo的cb為true,說明走combo. 我們看下網絡請求:

可以看到base.js,p1.js是分開下載的,而p2.js,p3.js是一起下載的,這是因為mt2.0自己分析了依賴,把某個模塊共同依賴一起下載了,這個例子里面p1依賴了p2,p3兩個模塊 所以p2,p3被一起下載了,這就是熱combo!

這時候我們想,我想讓p1,p2,p3一次就下載了,怎么弄?很簡單,我們只要設置combo.conf為如下

                                     combo:{
                                    //是否啟用combo                                     cb:true,
                                    //哪些模塊的js走半熱combo一塊下載                                     //,這里數組的每個項是要一起下載的模塊                                     conf:['init,util','p1,p2,p3']

                                    }
                                

我們看下網絡請求:

ok,p1,p2,p3一次就下載了!!,這就是半熱combo,需要配置一下conf.

MT1.0的增量更新是基于chunk算法來實現的,精確度是到塊級別的。后來很多朋友給我意見,說其實可以做得更加精確一些,精確到字符級別。 于是我用lcs算法實現了精確到字符級別的設計,最后這個demo也可以看作是整個MT2.0的使用方法

首先到我們的github:https://github.com/mtjs/mt下載代碼,然后看mt2.0文件夾下的demo目錄,里面有個test.html,可以看到總配置代碼

                         var g_config =  {
                            jsmap:{
                                'init': 'base.js',
                                'util': 'base.js',
                                'p1': 'page/p1.js',
                                'p2': 'page/p2.js',
                                'p3': 'page/p3.js'
                            },
                            storeInc:{
                                //統計回調,統計腳本請求情況,jsUrl是js地址,mode是請求模式,full:表示全量請求,inc表示增量請求,local表示從本地存儲讀取
                                'statFunc':function(jsUrl,mode){
                                    console.log('get '+jsUrl+' from '+mode);
                                },
                                //寫本地存儲異常回調,將腳本內容寫入本地存儲出現異常的時候調用,用來提供給業務清理本地存儲,storekey表示寫如的key
                                'storeExFunc':function(storeKey){
                                    console.log('set store item '+storeKey+' exception') ;
                                },
                                'store': true,
                                'inc': true,
                                'proxy':true,
                                'debug': false
                            },
                            //是否走combo,同時支持conf指定哪幾個js是合并下載的

                            combo:{cb:true,conf:["init,util","p1,p2,p3"]},
                            testEnv: false,
                            staticPath: '/release',
                            serverDomain: 'http://localhost:6600',
                            buildType: 'project',
                            ver: '2014053000002'

                        };
                        

在2014053000002版本,我們的p2代碼如下:

                         define('p2', [], function () {
                        console.log('p2 ok!');
                        document.write('p2 ok!<br>');
                        });

                        }
                    

本地打包

我們運行demo目錄下的build.sh ,其實是執行命令

node ../js/mtbuild.js test.html build.conf  lcs

第三個參數說明走lcs增量更新算法,你也可以設置成chunk走老算法

啟動增量服務

到js目錄下執行命令

node storeincServer.js lcs ../demo

第2個參數說明走lcs增量更新算法,你也可以設置成chunk走老算法,第三個參數是根目錄,這里設置成../demo

效果演示

打開chrome(必須支持localstorage),輸入地址:http://localhost:6600/test.html,可以看到請求的是全量的js

本地存儲里的內容是2014053000002版本的:

接著我們修改p2.js代碼,加上"lcs"這3個字 :

                                   define('p2', [], function () {
                                  console.log('p2 ok!');
                                  document.write('p2 ok lcs!<br>');
                                  });
                              

然后重新運行命令

node ../js/mtbuild.js test.html build.conf  lcs

這時候生成2014053000003版本代碼,打開chrome(必須支持localstorage), 輸入地址:http://localhost:6600/test.html,這時候可以看到請求的內容是增量的,并且精確到了字符級別:

我們來看下同樣是這個修改,如果我們走chunk算法,會是什么樣子。 我們需要重新走一遍上邊的流程,但是把build.sh命令的lcs參數改成chunk,啟動storeincServer時的lcs也改成chunk, 這里就不羅嗦步驟了,我們直接看看走chunk是的網絡請求:

發現相對lcs算法,chunk的精確度是比較差的,所以推薦使用lcs算法

mt1.0的同學請看mt1.0

 本文由用戶 waynelu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!