综述

移动 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:

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 格式记录了新版本和上一个版本的版本号。

混合式app php怎么打包,如何实现混合 App Web 资源的打包与增量更新相关推荐

  1. vue做混合式app_Vue Cordova教程-Vue+Cordova打造跨平台可安装的混合APP视频教程(大地)...

    Vue+Cordova打造跨平台可安装的混合APP视频教程 必看说明: 目前购买此教程送Html5+Cordova+Ionic智能电视(TV)应用开发教程视频教程: 购买过Ionic的同学可以直接在( ...

  2. html5混合app原理,HTML5混合App开发

    内容简介 在竞争激烈的移动互联网环境下,HTML5技术一直备受关注.HTML5混合App开发与原生App开发模式之间也争议不断.相对于原生App来说,HTML5混合App开发的成本更低.周期更短,而且 ...

  3. 开发缺点_成都嗨创科技:原生APP开发与混合APP开发的优缺点对比

    原生APP开发 1.开发语言: 安卓APP:Java开发语言: 苹果APP:Objective-C 或Swift 开发语言: 均为官方规定开发语言: 2.优点 1)使用体验较好,能够实现较为复杂的交互 ...

  4. 原生 APP、Web、混合 APP,三种开发模式有何不同?

    前言 原生 App 又称Native App,该开发针对 IOS.Android.Windows 等不同的手机操作系统要采用不同的语言和框架进行开发:无论是从开发难度,价格还是周期来看,原生开发都更复 ...

  5. webApp,原生App,混合App的区别

    什么是原生APP: 原生APP别名又叫Native App,该APP开发模式主要是针对 IOS.Android.Windows等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是由&quo ...

  6. 原生app、webapp、混合app的区别介绍

    目前市场上主流的APP分为三种:原生APP.Web APP(即HTML5)和混合APP三种,相对应的定制开发就是原生开发.H5开发和混合开发.那么这三种开发模式究竟有何不同呢?下面我们就分别从这三者各 ...

  7. flutter打包的app有多大_Flutter原生混合开发

    使用 Flutter 从头开始写一个 App是一件轻松惬意的事情.但是对于成熟产品来说,完全摒弃原有 App 的历史沉淀,全面转向 Flutter 并不现实.用 Flutter 去统一 iOS/And ...

  8. 如何进行混合APP的打包,再到手机上进行下载运行

    1.打开HBuilder X 添加一个名叫5+app的项目后,在项目中的一个html页面添加web项目的登录或首页的html代码 如图: 打开natapp官网:https://natapp.cn/,然 ...

  9. h5+混合app打包步骤

    运用工具HbuildX 1.对项目运行build成操作,生成dist文件; 2.点击文件-->新建-->项目-->选择5+app-->项目命名-->文件路径: 3.选择项 ...

最新文章

  1. Python的Tkinter点击按钮触发事件
  2. 错误: 找不到或无法加载主类 helloworld_全面剖析虚拟机类加载机制
  3. hdu 1251 统计难题 (Trie树)
  4. 王道 —— 操作系统的发展与分类
  5. Windows Phone开发(16):样式和控件模板 转:http://blog.csdn.net/tcjiaan/article/details/7367260...
  6. 【Go语言】【15】GO语言的面向对象
  7. 手动为linux系统添加新用户——过程详解
  8. pywin32官方说明文档_为什么你应该看官方文档而不是搜索博客文章
  9. iOS开发证书和配置文件的使用
  10. 爱河许云上计算机乐谱,爱河简谱(歌词)-神马乐团演唱-桃李醉春风记谱
  11. stream().sorted 排序
  12. c 实现走迷宫流程图_C语言走迷宫游戏流程图和代码框架
  13. 计算机音乐因为我刚好遇见你,因为我刚好遇见你歌曲
  14. 公积金约定提取周期如何更改(不跑线下实体店,可以直接在个人公积金网站自助办理)
  15. 程序设计入门——C语言 翁恺 第一次单元测试
  16. Maven中scope标签详解
  17. ACL占用TCAM情况测试
  18. 期权套利组合 matlab,商品期权常见的组合套利策略(上)
  19. 超级计算机控制人的电影,想知道这部电影的名字,讲述通过超级计算机进入人脑.回到过去.其中有个老教授死亡留下一封信给给主角。...
  20. vsto 隐藏前面的列滚动条在后面需要滚动到最前面

热门文章

  1. Selenium - 简介
  2. PowerDesigner16建表在SQL SERVER 2008报 对象名 'sysproperties' 无效。
  3. 雅虎公司C#笔试题(之二)
  4. python通过opencv使用图片制作简单视频(亲测)
  5. 什么是Sentinel?它能做什么
  6. Master选举原理
  7. Django——2 路由分配设置 re_path正则匹配 include总路由 url传参 name使用 模板渲染render方法 模板渲染方法...
  8. pymysql单条插入数据和批量插入数据:
  9. 为VMware虚拟机中的Linux系统设置固定IP的方法
  10. Linux安装composer出现usr/bin/env: php: No such file or directory)