谈谈混合 App Web 资源的打包与增量更新

综述

移动 App 的运行环境具有带宽不稳定,流量收费,启动速度比较重要等特点,所以混合 App 如何加载 Web 资源并不是一个新问题。本文目的是总结出一种资源打包下载的思路和方案,并且提供一种打包工具。本文提到的思路只是一家之言,基本没有参考现有方案,各位方家有不同意见欢迎留言。另外本文没有涉及到 App 内部如何加载资源的问题,这部分我会专门撰写一篇文章讨论。

需求梳理

一般来说,Hybrid-app 对于 Web 资源下载有如下需求:

  • 页面开启速度要快,所以资源的下载和使用不是在同一时间进行的,有一个“预下载”的过程。
  • 资源不能重复下载,所以要有缓存,但是有更新的时候必须及时更新。鉴于 WebView 的缓存可控性不强,所以要有一套自定义缓存机制。
  • 为了节省流量加快速度,如果资源以压缩包为单位整体下载,那么资源更新时要支持增量更新。同时,对于设备端资源与最新版本相隔一个版本以上的情况,要提供全量更新。
  • 为了维持一定的健壮性,Web 资源在设备本地和线上应各有一份部署,可以随时切换。尤其是当设备本地缓存被删除时,可以临时切换到线上。

资源打包方案

为了方便开发和部署,笔者设计了如下打包方案:

发布包分为四部分:

第一,是将整个 Web 资源目录打成一个压缩包(bundle.zip)。

第二,基于上一个版本,构建一个最新版本的增量压缩包(update.zip)。为了简化开发,我使用了文件级的 diff 算法——也就是说,对比两个版本的程序目录,将新增和有改动的文件连带目录结构打成压缩包。对于新版本中被删除的文件,本方案忽略,因为 Web 前端程序中多一个文件并不会有任何影响。

第三,整个 Web 资源目录以目录的形式存在于发布包中,目录名为 /web,当设备端本地资源不能用时,可以直接使用 Web 目录中的线上资源。另外,为了方便单步调试,调试版 App 也使用线上资源。

第四,版本信息文件 update.json,本次发布的版本号、上一个版本号,以及发布时间存在于这个文件中,供 App 定时下载检查。update.json 格式如下:

{"releaseTime":"160530161454","version":9601,"lastVersion":9596}

以上就是整个发布目录结构,将这个目录整体上传到后端云存储,提供下载链接,App 即可实现下载更新等功能。在暂时不用考虑 App 版本和 Web 版本配合问题的前提下,为了方便 App 开发,笔者使用了恒定不变的 URL,比如:

http://www.url_prefix.com/some_folder/webapp/app_name/update.json
http://www.url_prefix.com/some_folder/webapp/app_name/bundle.zip
http://www.url_prefix.com/some_folder/webapp/app_name/update.zip
http://www.url_prefix.com/some_folder/webapp/app_name/web/

这样做的好处是设计 App 时约定好 URL,这些 URL 就不会变了,App 只要定时拉取 update.json 检查版本,该更新更新即可,Web 资源发布时只要替换掉相应的文件即可,流程比较简化。这样的方案导致线上只有一个版本,所以如果你的项目中不同版本 App 需要不同版本的 Web 资源配合,那么你就不能使用这种方式。

资源打包工具

方案确定后,我们还需要一个打包工具,方便开发人员发布资源。显然,这个工具不能要求开发人员自己保留老版本目录,所以我们需要依托于版本控制工具。笔者使用 node.js 开发了一个基于 svn 的命令行打包工具 packr:

https://github.com/yusangeng/packr

packr 的原理很简单:由发布人员确定发布项目的 svn 地址、本次要发布的 svn 版本号,以及上次发布的 svn 版本号,packr 会按照上面的方案将资源打成一个发布包。如果你用 git 的话,可以简单改一下底层的版本控制组件。这个工具本身和前端开发无关,你可使用它为任何项目打发布包。

packr 的使用说明如下:

静态资源打包工具(packr)使用说明

综述

packr 是专为移动 app 混合开发设计的 web 静态资源打包工具。

packr 通过比较两个 svn 版本的区别(目前还不支持
git),将静态资源项目打包为全量更新包、增量更新包,以及线上资源目录,同时生成版本信息 update.json。

运行环境

  • packr 基于 nodejs 实现,使用前请先安装 nodejs。
  • packr 依赖的 npm 模块需要联网安装,请确保连入互联网。
  • packr 依赖 svn 命令行工具,使用前请安装 svn 并确保环境变量 Path 中有相关目录。
  • packr 没有 svn 账户设置入口,使用前请确保 svn 已经保存了可用的账户名。
  • packr 为命令行工具,使用前请确保环境变量 Path 中有 packr 根目录。

运行前准备

假设 packr 根目录为 /usr/local/packr

cd /usr/local/packr npm install

命令参数

packr 命令格式如下:

packr -p=${prefix} -c=${currentVersion} -l=${lastVersion} -r=${repositoryURL}

其中:

  • prefix 为输出目录,如果不设置,则输出于当前目录。
  • currentVersion 为当前发布版本的 svn 版本号。
  • lastVersion 为上一个版本的 svn 版本号。
  • repositoryURL 为 svn 版本库地址。

输出

packr 输出为一个 zip 压缩包,其中有如下文件或目录:

  • bundle.zip 新发布版本的全量更新包。
  • patch.zip 增量更新包,其中有新增和改动过的文件。
  • web 线上资源目录,供客户端或浏览器在不使用缓存时直接访问。
  • update.json 版本信息文件,其中以 json 格式记录了新版本和上一个版本的版本号。
时间: 2024-12-12 05:44:10

谈谈混合 App Web 资源的打包与增量更新的相关文章

移动web:原生开发打包,嵌入h5页面 webApp:全部都是H5开发的应用 混合APP:使用第三方开发平台从apicloud,appcan,hbuilder等开发,cordova技术打包 原生APP:就是eclipse开发或者studio等工具开发

论坛43213 移动端webApp兼容问题解决 谈谈App混合开发 Hybrid APP混合开发的一些经验和总结 PhoneGap是一个采用HTML,CSS和JavaScript的技术,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够在网页中调用IOS,Android,Palm,Symbian,WP7,WP8,Bada和Blackberry等智能手机的核心功能--包括地理定位,加速器,联系人,声音和振动等,此外PhoneGap拥有丰富的插件,可以调用. Cordova提供了一组设备相关的

转转hybrid app web静态资源离线系统实践

一.前言 目前的转转app是一个典型的hybrid app,采用的是业内主流的做法: 客户端内有大量业务页面使用webview内加载h5页面承载. 其优点是显而易见的,即:web页面上线频度满足快速迭代的业务需求,不受客户端审核和发版的时间限制,也可以将各个业务线的开发工作分摊到各个业务的fe团队上,使得个业务线可以并行开发. 而缺点,则不言而喻的在于客户端内webview加载h5页面,准确来说是web应用的性能和体验,是肯定不及客户端的.本篇文章中,笔者将会梳理立足于本团队内,根据团队的特点和

怎么判断一个APP是原生APP、混合APP还是WEB APP ?

1.看断网情况 通过断开网络,刷新页面,观察内容缓存情况来有个大致的判断,可以正常显示的就是原生写的,显示404或者错误页面的就是html页面. 2.看布局编辑 3.看复制文章的提示,需要通过对比才能得出结果. 比如文章资讯页面可以长按页面试试,如果出现文字选择,粘贴功能的是H5页面,否则是native原生的页面. 有些原生APP开放了复制粘贴功能或者关闭了,而H5的CSS屏蔽了复制选择功能等情况,需要通过对目标测试APP进行对比才可知. 在支付宝APP.蚂蚁聚宝是可以判断的. 4.看加载的方式

【原】移动web资源整理

[原]移动web资源整理 回顾2014年,刚转来到新的部门,非常渴望做出一个所谓的成功产品,心态几乎变了,每天都忙忙碌碌在项目中,把原来阅读和学习的习惯给忽视了,作为一个技术人员,没有通过学习新的知识来充实自己,跟进时代的步伐,是比较致命的:另外一点是运动也缺少了,感觉身体不如从前,例如工作太累,晚上容易失眠,让自己感到惶恐,想想就不开心.于是简单给自己定个2015上半年的计划: 贷款买个房子 每周羽毛球.跑步.骑单车 阅读<自控力>.<大数据时代>.<逻辑思维> 学习

横向浅谈移动技术------( 原生,混合,web --- 谁能问鼎移动开发的明天)

目前移动互联网基本采用了NativeApp.WebApp.HybridApp三种开发模式,很难说这三种模式那种更优越,目前的情况可以说是三分天下吧,不同的开发者可以根据自己的实际情况选择不同的开发模式.谈论那种模式最好实际上事非常无聊的事情. 1.1.     APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等).金融(各手机行业.P2P借贷等).医疗(智慧医疗).交通(滴滴.Uber等).教育(慕课网等).餐饮(饿了吗.美团等)……反正只要是个企业,无论规

原生app,WEBAPP,混合app

什么叫做原生App? 原生App是专门针对某一类移动设备而生的,它们都是被直接安装到设备里,而用户一般也是通过网络商店或者卖场来获取例如    The App Store  与  Android Apps on Google Play . 随便说几个原生App的例子,比如iOS 的 Camera+  以及Android 的  KeePassDroid 什么叫做移动Web App? 一般说来,移动Web App都是都是需要用到网络的,它们利用设备上的浏览器(比如iPhone的Safari)来运行,

原生app,WEBAPP,混合app的差异

原生应用.Web应用.混合应用优缺点分析 原生App vs 移动Web App :定义 什么叫做原生App? 原生App是专门针对某一类移动设备而生的,它们都是被直接安装到设备里,而用户一般也是通过网络商店或者卖场来获取例如    The App Store  与  Android Apps on Google Play . 随便说几个原生App的例子,比如iOS 的 Camera+  以及Android 的  KeePassDroid 什么叫做移动Web App? 一般说来,移动Web App

混合app开发

学习目标: 了解目前移动app开发的三种模式 了解mvc和mvvm架构模式 熟悉混合app的开发应用场景 掌握混合app开发的概念 掌握angularjs.ionic.和cordova在混合app开发中的作用. 目前移动app开发主要分为三种模式 Native App . Web App .Hybrid App 原生ap是使用相应平台特有的开发工具进开发 外观和性能极佳 但开发成本高 因为每一种移动操作系统都需要独立开发项目 web App 网页应用程序 需要依赖于移动端浏览器 主要使用html

混合App 框架选型

个人一直想做个App,但是学习 IOS 的过程发现 原生的做界面还是听麻烦的就放弃了.后来就转到混合式App阵营了 混合式App 定义 Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具"Native App良好用户交互体验的优势"和"Web App跨平台开发的优势" 平台框架选择 APICloud Dcloud Ionic 平台对比 Dcloud 平台 大量使用H5接口 提供一些原生Api(官方号称40万A