{"id":13756760,"url":"https://github.com/mtjs/mt","last_synced_at":"2025-12-17T13:55:41.119Z","repository":{"id":14710335,"uuid":"17430717","full_name":"mtjs/mt","owner":"mtjs","description":"mt code","archived":false,"fork":false,"pushed_at":"2018-04-24T05:07:27.000Z","size":3980,"stargazers_count":1530,"open_issues_count":10,"forks_count":230,"subscribers_count":121,"default_branch":"master","last_synced_at":"2025-05-10T04:37:53.877Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mtjs.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-03-05T06:48:02.000Z","updated_at":"2025-04-27T13:04:07.000Z","dependencies_parsed_at":"2022-09-23T22:42:35.818Z","dependency_job_id":null,"html_url":"https://github.com/mtjs/mt","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mtjs/mt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtjs%2Fmt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtjs%2Fmt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtjs%2Fmt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtjs%2Fmt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mtjs","download_url":"https://codeload.github.com/mtjs/mt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtjs%2Fmt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27783730,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-17T02:00:08.291Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T11:00:53.320Z","updated_at":"2025-12-17T13:55:41.095Z","avatar_url":"https://github.com/mtjs.png","language":"JavaScript","readme":"\n\nMT\n=============\n\u003cp \u003eMT是手机腾讯网前端团队开发维护的一个专注于移动端的、带有增量更新特色的js模块管理框架\u003c/p\u003e\n\n\u003cp \u003e我们的官网是\u003ca href=\"https://mtjs.github.io\"\u003ehttps://mtjs.github.io\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003e我们的github:\u003ca href=\"https://github.com/mtjs/mt\"\u003ehttps://github.com/mtjs/mt\u003c/a\u003e,如果觉得MT是个靠谱的项目，请给我们star,您的支持是我们最大的动力\u003c/h3\u003e\n\n\u003ch4\u003e\u003ca href=\"#overview\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e 为什么使用MT\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#storeinc\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e MT增量更新技术方案介绍\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#combo\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e MT的COMBO介绍\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#callback\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e MT的异常和统计回调\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#quickstart\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e快速上手\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#demo\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003ewebapp demo\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#who\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e谁在使用MT\u003c/a\u003e\u003c/h4\u003e\n\u003ch4\u003e\u003ca href=\"#github\"\u003e\u003ci class=\"icon-chevron-right\"\u003e\u003c/i\u003e下载\u003c/a\u003e\u003c/h4\u003e\n\n\u003csection id=\"overview\"\u003e\n    \u003cdiv class=\"page-header\"\u003e\n        \u003ch1\u003e为什么使用MT\u003c/h1\u003e\n    \u003c/div\u003e\n    \u003cp\u003e在快速迭代版本过程中，我们有时候只修改了某个js中的\u003cstrong\u003e几行代码\u003c/strong\u003e，却需要用户下载\u003cstrong\u003e整个js文件\u003c/strong\u003e，这在重视流量的移动端显得非常浪费，mt独创的\u003cstrong\u003e增强更新算法\u003c/strong\u003e实现了修改多少代码就只下载修改代码的功能，为用户和公司节省大量流量\u003c/p\u003e\n    \u003cp\u003e比如某次修改我们需要修改下面的代码,在mt mthelloworld 后面加上ok两个字符,即把\u003c/p\u003e\n    \u003cpre \u003e\n        define('mthelloworld', [], function () {\n                    console.log('mt helloworld');\n        });\n        }\n    \u003c/pre\u003e\n    \u003cp\u003e修改为\u003c/p\u003e\n    \u003cpre \u003e\n        define('mthelloworld', [], function () {\n                    console.log('mt helloworld ok');\n        });\n        }\n    \u003c/pre\u003e\n    \u003cp\u003e通常情况下我们需要用户下载整个这个模块的js代码，但是如果使用了mt,用户只需要下载一下一行代码：\u003c/p\u003e\n    \u003cpre\u003e\n       [[0,50],'ok',[52,90]]\n    \u003c/pre\u003e\n    \u003ch3\u003e这就是MT的主要作用，在版本更新的时候能做到字符级别的增量更新，为用户和公司节省流量,真正做到了无更新不下载！\u003c/h3\u003e\n\u003c/section\u003e\n\n\n\n\n\u003csection id=\"storeinc\"\u003e\n\u003cdiv class=\"page-header\"\u003e\n\u003ch1\u003eMT增量更新技术方案介绍\u003c/h1\u003e\n\u003c/div\u003e\n\u003ch3\u003e总体流程介绍\u003c/h3\u003e\n\u003cp\u003e增量更新依赖于localstorage,所以浏览器必须支持localstorage。android和ios两大平台目前都支持。\u003c/p\u003e\n\u003cp\u003e增量更新流程如下图所示：\u003c/p\u003e\n\u003cp\u003e\u003cimg src='https://mtjs.github.io/img/storeinc.png'\u003e\u003c/p\u003e\n\u003cp\u003elocalstorage里面存储的上个版本的js内容和版本号，当本次版本号和上次版本号不一致的时候，mt拼接出增量文件url去拉取增量文件，并和上个版本的js内容合并生成新版本内容。整个方案得核心在于增量文件得计算和合并，接下来介绍mt支持的2种增量更新算法。\u003c/p\u003e\n\u003ch3\u003e基于chunk的增量更新算法\u003c/h3\u003e\n\u003cp\u003e在mt1.0里面，增量文件的计算和增量文件和旧版本内容的合并主要基于chunk算法，这个算法的原理是通过将js分块并滚动比较取得两个版本内容，获取增量文件。具体得算法设计请看下面这个PDF:\u003c/p\u003e\n\u003ca href=\"https://mtjs.github.io/img/mt1.pdf\"\u003emt1.0js增量更新技术实现\u003c/a\u003e\n\n\u003ch3\u003e基于编辑距离计算的增量更新算法\u003c/h3\u003e\n\u003cp\u003emt1.0的chunk算法基于分块计算，增量更新的精确度依赖于chunk的大小，在实际使用中总是会有不少代码需要冗余下载，为此在mt2.0里面增加路基于编辑距离计算的增量更新算法，具体的实现方案的PDF如下：\u003c/p\u003e\n\u003ca href=\"https://mtjs.github.io/img/mt2.pdf\"\u003emt2.0js基于编辑距离计算的增量更新技术实现\u003c/a\u003e\n\n\u003ch3\u003emixdiff:基于编辑距离计算，chunk两种算法的增量更新\u003c/h3\u003e\n\u003cp\u003e编辑距离计算可以精确到字符，但是需要用一个矩阵来存储字符，本身会占用很大的内存，基本上比较难于用在生产环境里，\n    所以我们的mixdiff融合了以上两种算法，提高了算法的性能，并能实现字符级别的增量更新。\n    mixdif其实就是：对于比较字符串比较短的字符用lcs来计算增量文件，对于比较长的字符串用chunkdiff来找出2个字符串的最大公共子字符串，然后用这个字符串将新旧2个字符串都切成前缀、公共子串、后缀。\n    然后分别用2个前缀，后缀为参数递归调用mixdiff来实现增量文件计算的方式。流程图如下：\n\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/mixdiff_flow.png\"\u003e\n\u003cp\u003e程序流程图如下：\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/mixdiff_codeflow.png\"\u003e\n\n\u003c/section\u003e\n\n\n\u003csection id=\"combo\"\u003e\n\u003cdiv class=\"page-header\"\u003e\n\u003ch1\u003eMT的COMBO介绍\u003c/h1\u003e\n\u003c/div\u003e\n\u003cp\u003e作为一个基于AMD规范的模块管理框架，mt还提供灵活的combo支持.mt的combo支持包含一下几种方式：\u003c/p\u003e\n\u003ch3\u003e冷combo\u003c/h3\u003e\n\u003cp\u003e冷combo就是在打包混淆的时候把多个不同的模块打包进同一个js,前台下载的时候直接下载这个js，比如打包配置如下：\u003c/p\u003e\n\u003cpre \u003e\n    {\n                 './release/{pv}/base-{fv}.js': {\n                        files: ['./js/init.js','./js/util.js']\n                 },\n                 './release/{pv}/page/p1-{fv}.js': {\n                    files: ['./js/page/p1.js']\n                 },\n                 './release/{pv}/page/p2-{fv}.js': {\n                    files: ['./js/page/p2.js']\n                 },\n                 './release/{pv}/page/p3-{fv}.js': {\n                    files: ['./js/page/p3.js']\n                 }\n    }\n\u003c/pre\u003e\n\u003cp\u003e可以看到我们的init,util模块被打到base.js里，达到冷combo的目的\u003c/p\u003e\n\n\u003ch3\u003e热combo，半热combo\u003c/h3\u003e\n\u003cp\u003e半热combo是相对冷combo来说的，除了走打包实现冷combo以外，我们还支持通过前台配置来实现半热combo或热combo\u003c/p\u003e\n\u003cpre\u003e\ncombo:{\n                         //是否启用combo\n                        cb:true,\n                        //哪些模块的js走半热combo一块下载\n                       //，这里数组的每个项是要一起下载的模块\n                        conf:['init,util','p1,p2,p3']\n\n}\n\u003c/pre\u003e\n\u003cp\u003e上面的代码，我们设置了combo的cb为true,说明走combo. conf的配置则设置了哪些模块是要走combo一起下载的， 即使打包脚本没有把他们打在一起。 为了看效果，我们先把cb设为false，conf设置为空数组,表示不走combo：\u003c/p\u003e\n\u003cpre \u003e                          combo:{\n                           //是否启用combo\n                           cb:flase,\n                           //哪些模块的js走半热combo一块下载\n                           //，这里数组的每个项是要一起下载的模块\n                           conf:[]\n\n                           }\n\n\u003c/pre\u003e\n\u003cp\u003e我们看下网络请求：\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/nocombo.png\"\u003e\n\u003cp\u003e可以看到base.js,p1.js,p2.js,p3.js是分开下载的，说明没有走combo   \u003c/p\u003e\n\n\u003cp\u003e然后设置了combo的cb为true,说明走combo. 我们看下网络请求：\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/hotcombo.png\"\u003e\n\u003cp\u003e可以看到base.js,p1.js是分开下载的，而p2.js,p3.js是一起下载的，这是因为mt2.0自己分析了依赖，把某个模块共同依赖一起下载了，这个例子里面p1依赖了p2,p3两个模块 所以p2,p3被一起下载了，这就是热combo!  \u003c/p\u003e\n\n\u003cp\u003e这时候我们想,我想让p1,p2,p3一次就下载了，怎么弄？很简单，我们只要设置combo.conf为如下: \u003c/p\u003e\n\u003cpre \u003e\ncombo:{\n//是否启用combo\ncb:true,\n//哪些模块的js走半热combo一块下载\n//，这里数组的每个项是要一起下载的模块\nconf:['init,util','p1,p2,p3']\n\n}\n\u003c/pre\u003e\n\u003cp\u003e我们看下网络请求：\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/halfhotcombo.png\"\u003e\n\u003cp\u003eok，p1,p2,p3一次就下载了！！，这就是半热combo,需要配置一下conf.        \u003c/p\u003e\n\u003c/section\u003e\n\n\n\n\n\n\u003csection id=\"callback\"\u003e\n\u003cdiv class=\"page-header\"\u003e\n\u003ch1\u003e MT的异常和统计回调\u003c/h1\u003e\n\u003c/div\u003e\n\u003cp\u003e为了方便统计和及时清理本地存储，mt还提供了本地存储异常和统计两种回调。通过设施g_config的storeInc对象的statFunc,storeExFunc两个函数，可以设置统计和本地存储异常回调 , statFunc在请求每个js的时候触发,便于统计每个js的请求情况，storeExFunc在写本地存储异常回调， 将脚本内容写入本地存储出现异常的时候调用，用来提供给业务清理本地存储\u003c/p\u003e\n\u003cpre \u003e\nstoreInc:{\n            //统计回调，统计脚本请求情况,jsUrl是js地址，\n            //mode是请求模式，full:表示全量请求，\n            //inc表示增量请求，local表示从本地存储读取\n            'statFunc':function(jsUrl,mode){\n                console.log('get '+jsUrl+' from '+mode);\n            },\n            //写本地存储异常回调，将脚本内容写入本地存储\n            //出现异常的时候调用，用来提供给业务清理本地存储\n            //，storekey表示写如的key\n            'storeExFunc':function(storeKey){\n                console.log('set store item '+storeKey+' exception');\n            },\n            'store': true,\n            'inc': true,\n            'proxy':true,\n            'debug': false\n},\n\u003c/pre\u003e\n\n\u003c/section\u003e\n\n\n\u003cdiv class=\"page-header\"\u003e\n    \u003ch1\u003e快速上手\u003c/h1\u003e\n\u003c/div\u003e\n\u003cp\u003e到这里我们基本上对mt有了一个基本的了解，下面我们通过一个例子来快速上手,并通过这个例子来看看mt做增量更新的效果(本例我们可以在demo目录下的quickstart里找到):\u003c/p\u003e\n\n\u003ch2\u003e基于AMD的模块定义\u003c/h2\u003e\n\u003cp\u003emt首先是一个基于amd规范得模块管理框架，所以模块的定义我们实用了最简单的一种方式：\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n        define('p1', ['p2', 'p3'], function (p2, p3) {\n            var o = {\n                k: 'v'\n            };\n            return o;\n        });\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e用define来定义模块,其中第一个参数是模块id,第二个参数是依赖，第三个参数是方法定义，返回值是该模块的定义\u003c/p\u003e\n\u003ch3\u003emt映射和回调配置\u003c/h3\u003e\n\u003cp\u003e跟其他模块管理框架一样，mt也有自己的模块到文件映射、增量更新配置、版本配置、回调配置等，下面是本例是我一个配置：\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e\nvar g_config =  {\n    jsmap:{\n        'init': 'base.js',\n        'util': 'base.js',\n        'p1': 'page/p1.js',\n        'p2': 'page/p2.js',\n        'p3': 'page/p3.js'\n    },\n    storeInc:{\n        //统计回调，统计脚本请求情况,jsUrl是js地址，\n        //mode是请求模式，full:表示全量请求，\n        //inc表示增量请求，local表示从本地存储读取\n        'statFunc':function(jsUrl,mode){\n            console.log('get '+jsUrl+' from '+mode);\n        },\n        //写本地存储异常回调，将脚本内容写入本地\n        //存储出现异常的时候调用，用来提供给业务\n        //清理本地存储，storekey表示写如的key\n        'storeExFunc':function(storeKey){\n            console.log('set store item '+storeKey+' exception') ;\n        },\n        'store': true,\n        'inc': true,\n        'proxy':true,\n        'debug': false\n    },\n    //是否走combo,同时支持conf指定哪几个js是合并下载的\n\n    combo:{cb:true,conf:[\"init,util\",\"p1,p2,p3\"]},\n    testEnv: false,\n    staticPath: '/release',\n    serverDomain: 'http://localhost:6600',\n    buildType: 'project',\n    ver: '2014053000002'  //版本号\n\n};\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e在2014053000002版本，我们的p2代码如下： \u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\ndefine('p2', [], function () {\n        console.log('p2 ok!');\n        document.write('p2 ok!');\n        });\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003e打包\u003c/h3\u003e\n\u003cp\u003emt的打包主要是用mt自己的mtbuild.js来做的，功能主要是根据规则压缩混淆合并js,同时生成上个版本的增量文件。我们运行demo/quickstart目录下的build.sh ,其实是执行mtbuild.js命令：\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003enode ../../js/mtbuild.js test.html build.conf  lcs\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e第三个参数说明走编辑距离计算增量更新算法，你也可以设置成chunk走chunk算法 \u003c/p\u003e\n\u003ch3\u003e启动增量服务\u003c/h3\u003e\n\n\u003cp\u003emt目前除了mt build生成增量文件以外，还提供了在服务端生成增量文件的server,包括java,nodejs两个版本，这里我们用以下nodejs版本。到js目录下执行命令\u003c/p\u003e\n\n\u003cpre\u003e\u003ccode\u003e node storeincServer.js lcs ../demo/quickstart \u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e第2个参数说明走lcs增量更新算法，你也可以设置成chunk走老算法，第三个参数是根目录，这里设置成../demo/quickstart \u003c/p\u003e\n\n\u003ch3\u003e效果演示\u003c/h3\u003e\n\n\u003cp\u003e打开chrome(必须支持localstorage),输入地址:http://localhost:6600/test.html ,可以看到请求的是全量的js\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/02full.png\"\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e本地存储里的内容是2014053000002版本的:\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/02local.png\"\u003e\n\u003cp\u003e\u003cp\u003e\n\u003cp\u003e接着我们修改p2.js代码，加上\"lcs\"这3个字 ：\u003c/p\u003e\n\u003c/pre\u003e\u003c/code\u003e\ndefine('p2', [], function () {\n    console.log('p2 ok!');\n    document.write('p2 ok lcs!');\n});\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e然后重新运行命令  \u003c/p\u003e\n\n\u003c/pre\u003e\u003c/code\u003enode ../../js/mtbuild.js test.html build.conf  lcs    \u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e 这时候生成2014053000003版本代码，打开chrome(必须支持localstorage), 输入地址:http://localhost:6600/test.html ,这时候可以看到请求的内容是增量的,并且精确到了字符级别: \u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/lcs.png\"\u003e\n\u003cp\u003e我们来看下同样是这个修改，如果我们走chunk算法，会是什么样子。 我们需要重新走一遍上边的流程，但是把build.sh命令的lcs参数改成chunk,启动storeincServer时的lcs也改成chunk, 这里就不罗嗦步骤了，我们直接看看走chunk是的网络请求：\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"https://mtjs.github.io/img/chunk.png\"\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e相对chunk算法，基于lcs算法的能更加精确\u003c/p\u003e\n\n\n\n\n\n\u003csection id=\"demo\"\u003e\n    \u003cdiv class=\"page-header\"\u003e\n        \u003ch1\u003e一个完整的webapp demo\u003c/h1\u003e\n    \u003c/div\u003e\n    \u003cp\u003e通过上一个例子，我们大概了解mt的功能和原理，并对增量更新效果有了一个基本的认识。下面我们再来看一个基于mt做手机单页面webapp的例子，这个例子里面我会用到以下几个东西：\n   \u003c/p\u003e\n    \u003cul\u003e\n        \u003cli\u003e基于jetty的java版本的增量更新服务\u003c/li\u003e\n        \u003cli\u003epm.js:一个基于hashChange的单页面路由\u003c/li\u003e\n        \u003cli\u003emtpl:一个高性能小体积的js模版引擎\u003c/li\u003e\n        \u003cli\u003eratchet:一个针对移动的css框架\u003c/li\u003e\n    \u003c/ul\u003e\n    \u003cp\u003e本例其实是ratchet自带例子里的movie finder的一个改造，这里简化一下原例，并接入mt实现增量更新。\n    \u003c/p\u003e\n    \u003cp\u003e我们用jetty作为server,把demo下的mtwebapp目录放到jetty的webapps目录下,mtwebapp本身已经包含所有的java类（打包成mt.jar).\u003c/p\u003e\n    \u003ch3\u003eservlet配置\u003c/h3\u003e\n    \u003cp\u003ejava版本的增量更新代理是一个servlet,所以我们需要再web.xml里配置:\n    \u003c/p\u003e\n    \u003cpre class=”prettyprint linenums Lang-xml”\u003e\n    \u0026lt;display-name\u0026gt;StoreIncServlet\u0026lt;/display-name\u0026gt;\n    \u0026lt;servlet-name\u0026gt;StoreIncServlet\u0026lt;/servlet-name\u0026gt;\n    \u0026lt;servlet-class\u0026gt;com.storeinc.StoreIncServlet\u0026lt;/servlet-class\u0026gt;\n    \u0026lt;init-param\u0026gt;\n    \u0026lt;param-name\u0026gt;jsPath\u0026lt;/param-name\u0026gt;\n    \u0026lt;param-value\u0026gt;/Users/waynelu/nginxhtmls/jetty/webapps/mtwebapp/\u0026lt;/param-value\u0026gt;\n    \u0026lt;/init-param\u0026gt;\n    \u0026lt;init-param\u0026gt;\n    \u0026lt;param-name\u0026gt;chunkSize\u0026lt;/param-name\u0026gt;\n    \u0026lt;param-value\u0026gt;12\u0026lt;/param-value\u0026gt;\n    \u0026lt;/init-param\u0026gt;\n    \u0026lt;init-param\u0026gt;\n    \u0026lt;param-name\u0026gt;diffAlg\u0026lt;/param-name\u0026gt;\n    \u0026lt;param-value\u0026gt;lcs\u0026lt;/param-value\u0026gt;\n    \u0026lt;/init-param\u0026gt;\n    \u0026lt;/servlet\u0026gt;\n    \u0026lt;servlet-mapping\u0026gt;\n    \u0026lt;servlet-name\u0026gt;StoreIncServlet\u0026lt;/servlet-name\u0026gt;\n    \u0026lt;url-pattern\u0026gt;/storeinc/*\u0026lt;/url-pattern\u0026gt;\n    \u0026lt;/servlet-mapping\u0026gt;\n     \u003c/pre\u003e\n    \u003cp\u003ejsPath:js存放目录\u003c/p\u003e\n    \u003cp\u003echunkSize:chunk算法的块长度\u003c/p\u003e\n    \u003cp\u003ediffAlg:增量更新算法，可以为chunk或者lcs\u003c/p\u003e\n    \u003ch3\u003e运行demo\u003c/h3\u003e\n    \u003cp\u003e到jetty/bin地下运行：\u003c/p\u003e\n    \u003cpre\u003e\n    ./jetty.sh start\n    \u003c/pre\u003e\n    \u003cp\u003e为了看到增量更新效果，我们在mtwebapp里放了index.jsp和index1.jsp两个文件，分别对应2014071600018，2014071500017两个版本的js.在地址栏里输入：http://localhost:8080/mtwebapp/index.jsp 和 http://localhost:8080/mtwebapp/index1.jsp ，我们可以看到这两个版本增量更新的效果\u003c/p\u003e\n    \u003cp\u003ejava相关代码在java目录下\u003c/p\u003e\n\u003c/section\u003e\n\n\n\n\n\u003cdiv class=\"page-header\"\u003e\n        \u003ch1\u003e谁在使用mt\u003c/h1\u003e\n\u003c/div\u003e\n\u003cp\u003e\n    \u003ctable\u003e\n     \u003ctr\u003e\n         \u003ctd\u003e\n         \u003cspan\u003e\n    \u003ca href=\"http://infoapp.3g.qq.com/g/s?aid=nbasearch\u0026amp;icfa=home_touch\u0026amp;iarea=98\u0026amp;i_f=235#home\" \u003e\n        \u003cdiv class=\"img-tit\" \u003eNBA\u003c/div\u003e\n        \u003cimg pl=\"1\" alt=\"nba\" src=\"http://3glogo.gtimg.com/wap30/info/info5/img/app/NBA.jpg\"\u003e\n\n    \u003c/a\u003e\n    \u003c/span\u003e\n    \u003c/td\u003e\n\n    \u003ctd\u003e\n    \u003cspan\u003e\n    \u003ca href=\"http://infoapp.3g.qq.com/g/s?sid=AV-STHlv9Fb_E6Jb0P0_Pdtn\u0026amp;aid=movie\u0026amp;i_f=225\"\u003e\n        \u003cdiv class=\"img-tit\"\u003e爱电影\u003c/div\u003e\n        \u003cimg alt=\"爱电影\" pl=\"1\" src=\"http://3glogo.gtimg.com/wap30/info/info5/img/app/imovie.png\"\u003e\n\n    \u003c/a\u003e\n        \u003c/span\u003e\n        \u003c/td\u003e\n\n        \u003ctd\u003e\n        \u003cspan\u003e\n    \u003ca href=\"http://gp.3g.qq.com/g/s?sid=AV-STHlv9Fb_E6Jb0P0_Pdtn\u0026amp;aid=ifinance\u0026amp;i_f=271#fund/0\"\u003e\n        \u003cdiv class=\"img-tit\"\u003e爱理财\u003c/div\u003e\n    \u003cimg alt=\"爱理财\" pl=\"1\" src=\"http://3gimg.qq.com/wap30/info/info5/img/ifinance.png\"\u003e\n\n    \u003c/a\u003e\n       \u003c/span\u003e\n       \u003c/td\u003e\n\n       \u003ctd\u003e\n       \u003cspan\u003e\n    \u003ca href=\"http://infoapp.3g.qq.com/g/s?aid=medialib\u0026amp;iarea=98\u0026amp;i_f=237\"\u003e\n        \u003cdiv class=\"img-tit\"\u003e悦读\u003c/div\u003e\n        \u003cimg pl=\"1\" alt=\"悦读\" src=\"http://3glogo.gtimg.com/wap30/info/info5/img/app/iread.jpg\"\u003e\n\n    \u003c/a\u003e\n     \u003c/a\u003e\n      \u003c/span\u003e\n      \u003c/td\u003e\n\n      \u003ctd\u003e\n      \u003cspan\u003e\n    \u003ca href=\"http://infoapp.3g.qq.com/g/s?aid=touchauto\u0026amp;iarea=98\u0026amp;i_f=238\"\u003e\n        \u003cdiv class=\"img-tit\"\u003e车典\u003c/div\u003e\n        \u003cimg pl=\"1\" alt=\"车典\" src=\"http://3glogo.gtimg.com/wap30/info/info5/img/app/autolib.jpg\"\u003e\n\n    \u003c/a\u003e\n     \u003c/span\u003e\n     \u003c/td\u003e\n     \u003c/tr\u003e\n     \u003ctr\u003e\n     \u003ctd\u003e\n     \u003cspan\u003e\n    \u003ca href=\"http://infoapp.3g.qq.com/g/s?aid=carshow\u0026amp;iarea=98\u0026amp;i_f=239\"\u003e\n        \u003cdiv class=\"img-tit\"\u003e秀车\u003c/div\u003e\n        \u003cimg pl=\"1\" alt=\"秀车\" src=\"http://3glogo.gtimg.com/wap30/info/info5/img/app/carshow.jpg\"\u003e\n\n    \u003c/a\u003e\n     \u003c/span\u003e\n     \u003c/td\u003e\n\n     \u003ctd\u003e\n     \u003cspan\u003e\n    \u003ca href=\"http://live.3g.qq.com/g/touch2/?\u0026amp;iarea=98\u0026amp;i_f=240#home\"\u003e\n        \u003cdiv class=\"img-tit\"\u003e爱直播\u003c/div\u003e\n        \u003cimg pl=\"1\" alt=\"爱直播\" src=\"http://3glogo.gtimg.com/wap30/info/info5/img/app/ilive.jpg\"\u003e\n\n    \u003c/a\u003e\n    \u003c/span\u003e\n    \u003c/td\u003e\n\n    \u003ctd\u003e\n    \u003cspan\u003e\n        \u003ca href=\"http://infoapp.3g.qq.com/g/s?aid=sportpicguess\"\u003e\n            \u003cdiv class=\"img-tit\"\u003e体育猜图\u003c/div\u003e\n            \u003cimg pl=\"1\" alt=\"体育猜图\" width=\"100px\" src=\"http://3gimg.qq.com/wap30/info/info5/img/caitu.png\"\u003e\n        \u003c/a\u003e\n       \u003c/span\u003e\n       \u003c/td\u003e\n  \n       \u003ctd\u003e\n       \u003cspan\u003e\n        \u003ca href=\"http://infoapp.3g.qq.com/g/s?\u0026aid=common_webapp\u0026webapp=nbaky\"\u003e\n            \u003cdiv class=\"img-tit\"\u003e狂言NBA\u003c/div\u003e\n            \u003cimg width=\"100px\" alt=\"狂言NBA\" src=\"http://infopic.gtimg.com/info/images/2014/7/140436769816885735.png\"\u003e\n\n        \u003c/a\u003e\n    \u003c/span\u003e\n    \u003c/td\u003e\n\n    \u003ctd\u003e\n    \u003cspan\u003e\n        \u003ca href=\"http://infoapp.3g.qq.com/g/s?\u0026aid=common_webapp\u0026webapp=jiecao\"\u003e\n            \u003cdiv class=\"img-tit\"\u003e节操新闻\u003c/div\u003e\n            \u003cimg width=\"100px\" alt=\"狂言NBA\" src=\"http://infopic.gtimg.com/info/images/2014/3/139597306809381261.png\"\u003e\n\n        \u003c/a\u003e\n     \u003c/span\u003e\n     \u003c/td\u003e\n\n     \u003c/tr\u003e\n     \u003c/table\u003e\n\u003c/p\u003e\n\n    \n\u003ch1\u003e我们的github:\u003ca href=\"https://github.com/mtjs/mt\"\u003ehttps://github.com/mtjs/mt\u003c/a\u003e , 如果觉得MT是个靠谱的项目，请给我们star,您的支持是我们最大的动力\u003c/h1\u003e\n\n\n\n\n\n\n## Licence\n\nMIT License\n\n\n\n\n\n\n","funding_links":[],"categories":["JavaScript","{{ Builder }}"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtjs%2Fmt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmtjs%2Fmt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtjs%2Fmt/lists"}