离线包系统,使用nodejs开发 。 离线包指将一些资源以包的形式下发给APP ,从而优化这些资源的下载和使用方式。 我们可以将 H5资源、React-Native包 、 Weex
包 ,甚至安卓的插件都可以通过离线包的形式进行下发, 所以离线包是一种统一的资源下载管理的方式。(简单的比较是,离线包相当于react-native
里面的code-push
, 只不过我们这里的离线包是从APP角度考虑的资源管理, 而code-push
是从react-native
开发角度考虑的包管理)
离线包用于管理动态化的资源,所以属于axe系统中的动态化部分。
- 支持 差分 ,使用 bsdiff
- 支持 多种下载时机配置
- 支持 跟随APP打包 (一个资源虽然以离线包的形式管理,我们也可以将其打包后直接放到APP中, 即使一些关键模块在APP安装后即可使用)
- 离线包可以上传到
oss
中保存 (目前只支持阿里云)
安装
npm install offline-pack-server -g
使用, 在一个文件夹下,或者指定一个文件夹 ,启动服务 :
offline-pack-server helloworld
然后在 helloworld
文件夹下,有一个config.js
, 可以进行一些定制。
包的保存目前支持两种。
一种是保存在本地文件中, 使用nginx
或者offline-pack-server
来分发资源。默认配置就是这样,可以查看配置文件了解详情。
一种是上传到阿里云的oss中,详情查看配置文件。
当前管理页面和app
的请求是放在一起的, 那如何隐藏管理页面呢 ?
我的建议是,在node
前面还是要有一层nginx
来控制与转发。 对于管理页面的路径与请求,限定ip,以做到内网才能访问。
包内不要有中文路径和中文文件, 否则会解压出错!!!
包的版本号,建议使用构建号来标记。
限定从指定 APP版本号开始 , 可以使用该离线包。
包跟随APP版本,是因为包内内容可能使用了新版本的APP中才有的接口或功能。 而由于有这个限定,所以对于一个模块,生产上可能同时有多个版本的包。
而这里,我们对包的更新发布做了一定限定 : 新添加的包的版本号必须增加,即会覆盖旧版本内容。 而且我们只维护最新版本APP的上的包,不维护旧有的包。如 :
- 一开始发布一个模块A的初始化包,APP版本从0.1开始
- 然后更新的版本都是限定 0.1开始
- 然后我们使用了新接口,发布了一个不兼容旧版本APP的包, 限定APP版本1.0
- 再更新模块A时, 对于模块A就分了两个阶段: 在APP版本 0.1-1.0之间, 和在APP版本1.0以上的部分。
- 然后再有需求更新模块A时, 我们说,系统只支持更新最新版本包,不支持继续维护旧包
即这里我们采用APP开发的思路,尽量升级版本,而不是维护旧版本。 在旧版本上维护的花费较大,且大部分用户都是会升级APP的。
首先,对于离线包检测的时机是固定的, 启动时, 以及进入前台间隔10分钟。
更新时机指定的是 当APP检测到某个模块有新版本时, 何时进行包的下载。暂时有3个选项 :
- 立即更新 : 即检测到需要更新时, 立即下载。
- 按需更新 : 即真正使用到该模块时, 才会下载。
- WIFI时更新 : 检测时, 如果网络是WIFI状况, 或者 网络变更为WIFI状况时开始下载。 但是 使用模块时,及时没有WIFI也会下载。
默认选项为 WIFI时下载 。
指当使用模块时, 是否弹出弹框,以进行离线包的更新。
- 强制更新 : 目的是确保模块每次运行时,都能保持最新版本。
- 静默更新 : 会使用旧版本的内容, 但是后台会进行下载更新。 如果当前模块本地没有旧版本, 还是会弹出弹框以下载离线包的。
默认选项是 强制更新, 保持离线包版本最新, 是很重要的。
标签,用于继续细分一个模块的不同包。 如果设置了tag
,则 前端也要设定相应的tag
, 才能下载该模块。
主要用于 灰度测试 或者 AB测试, 即一个模块有两个不同版本, 根据业务需求,下发不同的版本给不同的用户。
只能设置一个
tag
。 做AB测试时, 必须对命中与不命中的版本都设置tag
, 如我们设置一个tag 叫做hit
, 以使用离线包的 11版本, 则对于正常 10版本的离线包上也要设置一个tag
,如设置为unhit
.
默认为 空, 即不设置规则。
- 优化 tags 功能 : 支持设置多个tag
- 添加 模块 关闭功能
- 代码检视和优化