丁香园 F2E

花厂设计招待所

hybrid资源包增量更新机制: 优化与安全

增量更新的使用已有一段时间,面对出现的一些问题,对初始的增量更新机制进行了扩展与优化。

丁香医生hybrid开发遇到的问题

  1. 增量更新的安全

    如何保证客户端获取到的增量包不被篡改。

  2. 资源包 diff 的不高效

    目前前端大多使用一些前端构建工具,如webpack, gulp, 将分散的源码合并成一个文件。在这种情况下,使用原先的 diff 算法并不能减少增量包的体积。


增量包的安全

通过采用数字签名技术保证增量包不被篡改。

签名方案:

  1. 前端对生成的增量包和全量包进行签名,将签名文件与源文件放在同一目录,并一起发布。

  2. 客户端更新时,在获取增量包时,同时获取增量包的签名,通过客户端中预先存储的公钥对签名文件和源文件进行校验,校验成功才进行下一步的更新。

签名工具:

安装 npm install dxy-assets-sign --save-dev

使用

	require('dxy-assets-sign')({
    publish_folder : publish_folder, //资源发布目录
    api : 'http://192.168.200.135:3000/sign', //必须
    verify : true, // 可选,是否对签名进行验证
    hash : 'sha1', //可选
    format : 'base64', //可选
    sign : 'RSA-SHA256', //可选
    hash_format : 'hex'
  })();

bsdiff

bsdiff 可以生成基于二进制的差量包,它的体积比原先算法生成的增量包小很多。尤其是对单文件这种极端情况。

以丁香医生的React Native的资源包为例,原先的增量包的体积为197KB,使用bsdiff算法后的增量包体积为5KB

由于兼容旧算法,如果需要使用bsdiff算法,只需要添加bsdiff字段

require('gulp-assets-incremental-update')(gulp, {
  publish_folder : publish_folder,
  name : 'article_detail.zip',
  base_url : 'http://assets.dxycdn.com/assets/app/dxydoctor/hybrid-publish',
  assets_folder : assets,
  limit : 6,
  bsdiff : true
});

相关文章

  1. hybrid资源包增量更新机制: 起步

  2. RDS(前端资源分发系统)

原创
下一篇:RDS(前端资源分发系统)