weex更新方案探索(一)

来源:互联网 发布:淘宝企业店铺开店 编辑:程序博客网 时间:2024/05/20 00:36

created by zhenggl

在项目开发过程中发现:
由于网络的波动不稳定,有时weex在线js加载显示会比较慢甚至加载超时;
而资源在安装包内的本地js的方式,每次有B端页面的改动都需要重新打包,也是比较繁琐的。

为了解决上述实际开发中遇到的问题,及减轻服务器端的压力,进行了weex更新方案的探索,现总结归档成系列文章:


1. weex更新方案探索(一)【weex更新方案整体思路】【本篇】
2. weex更新方案探索(二)【weex更新方案vue端实现】
3. weex更新方案探索(三)【weex更新方案IOS端实现】
4. weex更新方案探索(四)【weex更新方案Android端实现】
5. weex更新方案探索(五)【weex更新方案服务器端实现】
6. weex更新方案探索(六)【创建工具构建版本配置文件】
7. weex更新方案探索(七)【遗留问题或后续工作】


weex更新方案探索(一)——weex更新方案整体思路


目标:

1、根据版本配置json文件,管理weex js代码的版本更新(版本更新,下次启动即可进行更新);2、支持两种更新方式:   zip解压包下载、解压、更新;   逐个文件下载、更新;3、大版本更新,弹框告知强制更新;   小版本更新,静默下载更新(适用于修复bug);4、更新失败 或 更新不全的,下次启动继续重新执行更新;   更新不全的,按缓存中配置表中配置方式进行页面加载   (如果本地的,如已下载保存,则是最新的;在线的,则是最新的);5、每次启动都进行版本升级检测或升级;

思路:

1、json配置数据接口,提供最新配置数据;2、根据C端配置数据缓存,与服务端数据比对分析,   获取需更新的文件,进行下载、更新;维护C端配置数据缓存;3、所有页面跳转均基于C端配置表,使用在线的则直接跳转在线页面;   使用本地的则进行防篡改判断,通过则跳转本地页面,不通过则跳转在线页面;

设计方案:

 1. 启动页面使用在线js,集成版本升级检测模块; 2. 应用启动后,进入启动页面,调用获取json配置接口:    a、对于接口异常或数据异常,直接绕开检查更新,按缓存中配置表里的方式进行(在线/本地);      缓存不存在,使用在线;执行原有的业务;    b、对于接口响应和数据正常,拿到配置文件json数据,执行步骤33. 根据app缓存、服务器返回的json数据,进行版本比对分析   (版本规则:1.0,.前面的是大版本,.后面的是小版本)      a、服务器返回的json数据有zip信息且downloadUrl不为空,        则与app缓存中数据进行比对,判断是否使用zip数据更新;     b、对于zip数据更新,获取文件名、下载地址,执行步骤4;     c、对于非zip数据更新,则比对app缓存数据,获取需要更新的文件名、下载地址,执行步骤4;     d、无更新的:使用缓存中原有的配置方式,执行原有的业务;     e、无缓存的,使用服务器返回的json数据全量更新,获取文件名、下载地址、执行步骤4;     f、在b、c、e中,对于大版本更新的,弹框显示强制更新;     g、在b、c、e中,对于小版本更新的,静默下载更新; 4. 更新处理:     a、根据缓存主版本号和服务器返回的json数据主版本号比对 及         是否有下载文件,有且有版本变更,继续后续操作;     b、下载文件(对于单个zip的需进行解压操作);     c、对于使用zip数据更新,根据服务器返回的json数据,       更新app缓存中每个文件的本地文件路径和主版本号;       更新app缓存主版本号; 5. 每个页面跳转,根据文件名查找缓存中的配置表,    获取该文件在配置表中的数据,进行分析处理(本地文件防篡改机制):     a、对于使用在线文件的方式,则直接使用在线地址,跳转页面;     b、对于使用本地文件的方式,则根据本地文件路径判断本地是否有该文件,       无则使用在线方式,如a处理;       一致则跳转本地页面;       不一致则采用在线方式,如a处理;

设计升级配置json结构如下:

{    "version": "1.0",    "list": [        {            "fileName": "history_order.js",            "version": "1.0",            "downloadUrl": "dist/business/history_order.js",            "localUrl": "",            "onlineUrl": "http://www.xxxx.com/xxx/dist/business/history_order.js",            "isUseOnline": "false",            "fileMD5": "789A7E960D581C79BAD891B8BC12B30C"        },         ...    ],     "zip": {        "fileName": "dist.zip",        "version": "1.0",        "downloadUrl": "dist.zip",        "localUrl": "",        "fileMD5": "DB664CD6FF92D6F01A67D7E6BAAA77D2"    }}
//字段说明:{    //主版本号,用于比对大版本还是小版本升级    "version": "1.0",      //所有文件列表    "list": [         {            //文件名,唯一            "fileName": "history_order.js",            //本文件的版本号(主版本号变更,此文件版本号无变更,且下载地址无变更,则不会下载更新该文件)             "version": "1.0",             //本文件的下载地址,相对路径            "downloadUrl": "dist/business/history_order.js",              //本文件在app本地的路径(app端下载本文件后填充)            "localUrl": "",              //本文件的在线路径(对于isUseOnline=true、            //   fileMD5不一致、下载更新后localUrl仍为空的,采用在线js文件)            "onlineUrl": "http://www.xxxx.com/xxx/dist/business/history_order.js",             //是否使用在线js文件            "isUseOnline": "false",              //本文件的MD5值,用于下载到app中,防止app中被篡改了            "fileMD5": "789A7E960D581C79BAD891B8BC12B30C"         },         ...    ],     //升级文件压缩包的配置信息    "zip": {         //压缩包文件名称        "fileName": "dist.zip",        //压缩包的版本号,要跟主版本号一致         "version": "1.0",         //压缩包下载地址(相对路径),若该地址为空,        //   则采用list中的数据,逐个比对更新了的文件,进行下载更新;        //   若该地址不为空,则采用zip的方式,下载zip并解压覆盖,达到更新目的;        //  【注意:对于未获取过全量的,zip里的文件要全量;已获取过全量的,可以是增量】        "downloadUrl": "dist.zip",         //本文件在app本地的路径(app端下载本文件后填充)        "localUrl": "",         //本文件的MD5值,用于下载到app中,防止app中被篡改了        "fileMD5": "DB664CD6FF92D6F01A67D7E6BAAA77D2"     }}

C端需提供的能力:

1、文件下载(单个、批量)及 进度;2、zip解压;3、文件操作;4、文件MD5;5、全局缓存(获取、保存);6、页面跳转改造(防篡改机制、兼容支持打开本地/在线js文件跳转);

(未完,持续更新中…)