【Web缓存机制系列】6 – 进击的Hybrid App,量身定做缓存机制

====索引=====

【Web缓存机制系列】1 – Web缓存的作用与类型

【Web缓存机制系列】2 – Web浏览器的缓存机制 

【Web缓存机制系列】3 – 如何构建可缓存站点

【Web缓存机制系列】4 – HTML5时代的Web缓存机制

【Web缓存机制系列】5 – Web App时代的缓存机制新思路

【Web缓存机制系列】6 – 进击的Hybrid App,量身定做缓存机制

============

前言

前面的文章分别简述了Web缓存、相关机制、以及 html5 和 Web App 时代我们可以选择的缓存思路。转眼过了很长时间,这期间移动互联网成为大家讨论和学习的焦点,部门也有很多同学陆续接触 Mobile Native App 和 Mobile Web App 的开发。同时,还有部分同学专注 QQ 内嵌 Webkit + Client 这种Hybrid App模式的开发,继续推动 QQ 客户端 Web 化的进程。

引用张图,简单粗俗的解释下 Native App、Web App 和 Hybrid App

Navtie App: 使用平台系统提供的原生语言来编写的 App,如果Android用java,ios用objective-c,windows c++等

Web App:主要使用 Web 技术js/html/css进行编写,运行在各平台系统浏览器或浏览器组件中

Hybrid App:混合使用前面两种技术,部分代码以 Web 技术编写,部分代码由某些 Native Container 承担(如 Phongap 插件,PC/手机 QQ客户端等)

现有的缓存机制及问题

移动互联网网速慢、QQ 客户端对 Web 模块可用性要求高,使得我们不管做 Mobile Web App 开发、还是 PC Web App 开发,都必须对 Web 缓存有更深入的理解和利用。PC QQ 和 手机 QQ 都有基本 Webkit 的 Webview,除了传统常规提到的缓存外,参阅《Web浏览器的缓存机制 》,我们最先想到的优化方案就是前面文章提到的 Html5 App Cache,Web Storage,详细请参阅《HTML5时代的Web缓存机制》 和《Web App时代的缓存机制新思路》。

但,使用的过程中,我们发现了一些关于 html5 app cache 的问题:

1、第一次必须联网,在移动网络下首次打开效果非常不理想

2、http 头设置会导致 manifest 无法正常更新,见 http://www.alloyteam.com/2012/01/html5-offline-app-update-problem/

3、Manifest 中缓存文件一旦下载出错,后续的文件将不再下载,抛出错误事件,见:http://stackoverflow.com/questions/6666513/html5-manifest-caching-error

4、Android 系统版本众多,较低版本的浏览器对 manifest 支持不完善

5、引用 manifest 的 html 页面本身也会被缓存

6、《慎用manifest》一文提到的如:页面的参数传递、manifest 的发布、回滚、下线等问题

从上面可以看出,html5 虽然提供基于 manifest 这种离线缓存的机制,但在实际运用过程中还是会遇到非常多的问题,于是,我们开始思考,既然是 hybrid app,与其花大量时间踩坑,有资源有条件,不如更激进一点,尝试利用客户端能力来量身定做一套自己适用的缓存机制。于是 Alloykit 诞生了。

关于 Alloykit

Alloykit 是 PC/手机 QQ 上基于 Webview 开发的一个方便易用的开发组件,能够使基于 Webkit 开发的模块,快速拥有 Web 资源本地化、Common Api、自动种入登录态和续期、诊断上报、DNS管理、开发者工具支持、关键性能数据上报等特性。

Alloykit 各模块及主要功能:

本地化模块:把静态资源下载到本地,然后通过访问本地资源代替去服务器请求
Common Api模块:对常用共性的 Client 接口进行封装,Web可以内嵌 Commonapi.js 进行方便调用
登录态管理模块:web 登录态自动续期,登录态拉取失败走 Pt 跳转
诊断上报模块:诊断修复用户问题(清缓存,DNS,重新加载页面),截屏并收集用户本机网络信息,上报到后台进行分析。
DNS管理模块:域名预加载,域名 ip 验证等
开发模式:开发模式开关,开发者调试工具支持
数据上报:通用控件在不同业务中的关键上报点

下面主要介绍一下本地化缓存模块的设计思路,后面有机会再单独介绍其它的模块。

本地化模块

用一张图大致示意如下:

由上图可以看出,本地化模块主要由下面两个子模块组成:

1、拦截器:采用的一种类似 Fiddler AutoResponse 的本地替换思路,通过拦截所有 web 请求,进行本地化资源匹配,命中则用本地资源直接替换,否则,正常发起请求。

2、更新器:根据更新策略进行新版本资源检测,负责下载和维护本地缓存目录中的资源,并将更新过程关键点通过事件通知到 Web 页面备用。

原理很简单,使用也很简单,主要分为以下几个步骤:

1、客户端开发阶段:新建窗口的时候,只需要通过配置文件,将窗口类型声明为 AlloykitWindow

2、前端开发阶段:开发过程透明,不需要任何特殊处理

3、前端发布阶段:打包静态资源 zip 包

把业务涉及到并且希望离线的域名和资源打包,假设你的页面用到了web.qq.com、cdn.qq.com、test.statics.qq.com等域名,如下图所示,为每个域名建一个目录(若只有一个域名,则只建立一个目录),然后按照资源的url建立各级子目录并把资源放到相应的子目录下。

比如你有这样一个html页面:http://web.qq.com/module1/helloworld.html

把需要离线的页面文件和图片资源放到目录web.qq.com/module1下即可,如图:

使用 zip 压缩软件,将所有资源打包为一个 zip 包。

4、运维发布阶段:

  • 正常发布线上资源
  • 登录资源包管理平台,提交对应 zip 包
  • 需要打包到客户端安装包的资源,单独提交给客户端开发负责打包

Alloykit 本地化 和 H5 manifest 对比

1、Alloykit 可以选择将关键页面直接打包到客户端或App安装包,首次打开不需要依赖网络条件

2、对于没有打包到安装包的页面,也可以通过配置,让客户端启动后提前加载资源包

3、Alloykit 开发过程体验更简单,基本透明

4、Alloykit 把所有资源打包为一个 zip 包进行下载,更高效

5、Alloykit 通过客户端提供的基于 tcp 的下载通道进行下载,并有重试机制,更加稳定可靠

6、Alloykit 可以通过自身封装,支持多平台,避免开发者兼容多平台带来的麻烦

7、Alloykit 可以通过协议的设计,轻松实现刷新缓存、封版、下线离线特性等功能

这个本地化机制目前已有模块开始试用,在享受量身定制的缓存机制带来的性能提升和开发便利的同时,我们开始遇到并思考本地化之后的一些问题。

本地化之后

1、本地化文件的安全问题

缓存目录中本地文件,第三方是有办法找到并进行强制修改,可能存在不安全的因素。有同学可能会说这个担心其实多此一举,比如 Chrome Cache 文件写入磁盘的算法是开源的,如果第三方(类似 ChromeCacheView)软件实现了这个算法,就能对缓存文件进行修改,也存在类似安全问题。话虽如此,可是还是要做最坏的打算,说不定哪天数字搞你一下。要设计一种机制做保障。这种提供两种思路:

1)设计一种类似 Chrome Cache 闭源算法,把获取的资源包以这种算法读写入本地磁盘上。

2)使用非对称加密算法

客户端开发的时候,内嵌私钥

资源包 zip 中加入一个包含所有文件 md5 信息的json文件,并使用对应的公钥进行加密

客户端获取 zip 包后,使用私钥对 json 文件解密,获取 md5 信息,逐个进行校验

2、Web 项目运营思路转变

Web 项目一旦使用了本地化特性,不管是 H5 的 manifest 还是 Alloykit ,都会存在滞后一次更新,所以始终都会存在旧版本的长尾问题。所以这类型的项目给运营提出了更高的要求:

1)后台 CGI 接口,尽量考虑向前兼容,保证协议结构不变,如果确实需要改动,建议启用新路径

2)前端资源文件,建议采用增量的形式发布,比如 main.js ,发布的时候建议编译成 main-****.js(一般使用时间戳或md5后8位)

这样做的好处很明显,可以最大限度避免发布引起的波动,同时也可以支持 web 项目多版本并存,避免多版本相互影响。使用 grunt 或 modjs 可以轻松完成这个自动化构建编译工作。

3)Web 版本的铺量速度有所下降,所以对版本质量的要求更高,不建议太频繁、未经严格测试的版本发布

可见是否使用本地化,也需要做慎重的考虑,在性能和各个方面做权衡。

3、本地化之后的可用性问题

Alloykit 本地化之后,理论上在断网的情况下,页面也是打开的。但是要保证页面可用,其实还有很长的路要走。

针对那种单机的 h5 游戏或者简单页面,其实无需任何处理就能保证离线的访问效果。但,目前完全单机的 Web App 基本是不存在,大量的动态的数据和社会化的交互。如果本地化之后不做任何处理,那么在离线的情况下,基本也是只有页面框架,大量的页面空白和 ajax 请求超时,基本也相当于不可用。那么,花了这么大力气定制的本地化机制就仅仅保证打开的时候可看不可用吗?有什么办法可以改善吗?

答案是有的,这时 Web Storage 和 Web Database 就可以派上用场了,详细使用可以 Google 或者参考索引中的第4、5篇文章。

一些典型的离线场景及处理方案:

1)离线写操作:将 Ajax 请求以及相关参数保存到 localStorage 队列中,网络上线后,触发执行队列中的操作

2)离线读操作:页面上有需要通过 Ajax 获取动态的数据或远程图片进行渲染的块,可以通过前端 hardcode 一些默认数据,并且将最近一次 ajax 结果存储到 localStorage 中,图片可以转为 base64 字符串才用同样的方式处理

localStorage 有同源限制,大小也有限制,并且只能存储字符串,需要存储图片需要进行转化,比较繁琐耗性能。可否跟激进一些,由客户端提供模拟 localStorage,自行开辟存储空间,提供接口进行存取和校验?完全是可行的,并且现在在一些 Mobile 的项目中进行了相关尝试,接口整合到 CommonApi 模块中。

总结

独立于标准之外重复制造轮子,本身不是太推荐的做法。在目前标准和平台支持未完善,以及在特定场景下有欠缺的情形下,资源允许,我们选择了尝试新方法,针对Hybrid App 这种特殊的运用场景定制了一种本地化缓存和存储的实现方案。时间仓促,方案本身仍处于测试阶段,某些方面考虑难免会有欠考虑,非常欢迎同学们留言指出、改进。

转载: http://ju.outofmemory.cn/entry/57401

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.小程序的优缺点优点:不需下载、卸载使用方便缺点:嵌套在微信中,属于微信的子应用2.使用的技术实际上是Hybrid技术的应用HybridApp(混合模式移动应用),使用网页语言和程序语言共同开发小程序兼具了NativeApp所有优势,也兼具了WebApp使用Html5跨平台开发低成本注:微信小程序与传
端口类型-HybridHybrid端口是交换机上既可以连接用户主机,又可以连接其他交换机的端口。Hybrid端口既可以连接接入链路又可以连接干道链路。Hybrid端口允许多个VLAN的帧通过,并可以在出端口方向将某些VLAN帧的Tag剥掉。华为设备默认的端口类型是Hybrid。 Hybrid端口收发数据帧的规则
不同vlan同段IP通信LSW1vlan1vlan2vlan3interfaceEthernet0/0/1porthybriduntaggedvlan2to3interfaceEthernet0/0/2porthybridpvidvlan2porthybriduntaggedvlan2to3interfaceEthernet0/0/3porthybridpvidvlan3porthybriduntaggedvlan2to3
VLAN中access、Trunk和Hybrid三种端口区别:acesss:1、发送不带标签的报文2、一般与PC\server相连时使用3、只可以属于一个VLANTrunk:1、发送带标签的报文2、一般用于交换机级联端口传递多组VLAN信息使用3、可以属于多个VLANHybrid:1、混合端口可以同时属于多个vlan2、混合端口
这系列文章内容包括:STP、RSTP、MSTP、VLAN、LACP、SuperVLAN。以学习实验配置为主要目标;实验引用华为官方na在线视频中实验。6.3VLAN原理和配置实验截图:配置第一个交换机:修改端口类型acc、配置端口所属vlan、配置trunk端口。实验心得:有一个问题,当你配置e0/0/3为trunk以及al
实验一:交换机端口类型配置1.拓扑图如下图所示:2.实验要求:实现二层网络中工程部和市场部不能互访,但是都能与网络中心的服务器通信3.请写出你的配置思路、配置命令实验思路:将交换机SW1、SW2、SW3之间配置为trunk链路,其他接口配置为Hybrid链路;实验配置名如下:SW1sysnameSW
   这个英文材料对我一个英语一般的学生表示亚历山大啊,不过还是勉强看完了,说说自己的看法吧。   谷歌作为一家商业公司,利润是其基本的追求目标,这一点是毋庸置疑的。但是谷歌并没有被这个基本目标挡住了视野,无数公司失败的经验告诉我们,如果缺少创新,公司的一切发展
简介:VLAN10内通信,VLAN20内通信,VLAN30与VLAN10、VLAN20、VLAN30皆可通信Hybrid接口应用拓扑图:  一、配置PC机ip并测试相互能否ping通 PC名称IP子网掩码网关PC110.1.1.1255.255.255.010.1.1.254PC210.1.1.2255.255.255.010.1.1.254PC310.1.1.3
通常情况下,公司对内网的使用远远高于对外网的使用。公司的内部网络是由二层交换网络构建的,所以二层网络设计的好坏直接影响公司的正常业务。好的设计不仅使功能得到体现,还可以应对一些未知的隐患,如线路损坏、设备损坏等。下面我们主要对华为的二层设备进行了解,不过首先要了解的就
手机app代表了互联网时代的发展,促使我们的日常生活也变得越来越轻松,不管是哪个行业或者企业,在人们手机上存在最多的还是APP,手机APP逐渐的超越了网络,本身这些APP系统就是一个大型的APP系统,具体APP怎么开发呢?开发出来的手机APP,主要还是通过编程的方式设计出来的,有了变成那么就需要程
我想导出一种简单可靠的方法来自动提升正在运行的批处理,而无需使用其他线程中建议的额外的VBS文件或提升的快捷方式.通过javascript从批处理调用UAC对话框可确保简短的简单代码.在对话框中选择“是”,但错误对话框弹出时(在Cmd窗口外部)“Windows找不到’test.bat’”,下面的脚
无论如何,我可以在FORTRAN程序中使用BoostGraphLibrary(BGL)来使用图形数据结构.任何人都可以帮助我或给我一个提示.我想在我的MPI-FORTRAN代码中的几个处理器上进行并行图结构.是否可以使用BoostGraphLibrary(BGL)来达到此目的!亲切的问候,谢夫解决方法:你必须构造一个用C语
原文链接:http://www.cnblogs.com/iamzyf/p/3515889.html其实问题很简单:我的产品页面在 http://www.gdtsearch.com/products.spiderstudio.docapi.htm,这是一个静态页面;而我所有的技术博客都在博客园中.为了让访问者能够直接在产品页面中看到我最
Hybrid接口是华为特有的一种接口Hybrid接口是既可以连接普通终端的接入链路,又可以连接交换机间的干道链路。简单说就是Hybrid接口既能实现Access的功能又能实现Trunk接口的功能。实验模拟:实验拓扑:实验编址:测试连通性:查看交换机接口类型(默认情况下都是hybrid类型)displayportvlan
原生APP开发-NativeApp:需要用户下载安装使用,可访问手机的所有功能(GPS,摄像头,重力加速器),拓展性强,是专门为某种操作系统开发的(IOS,Android,黑莓等),但是开发和维护的成本都比较高 webApp:html5语言写出的app,不需要下载安装,基本上就是触屏版的网页,可以在多个设备上运行,有很大的局限性
拓扑图如下:(1)sw1的配置:<Huawei><Huawei>system-view//切换到系统视图Entersystemview,returnuserviewwithCtrl+Z.[Huawei]sysnamesw1//配置主机名Oct25201916:29:31-08:00sw1DS/4/DATASYNC_CFGCHANGE:OID1.3.6.1.4.1.2011.5.25.191
程序员常用等宽字体1SourceCodePro2CourierNew(传统)3Consolas4Monaco5中文雅黑混合版(YaHeiConsolasHybrid)
Japan'shybridmodelinventoryofhairEwhaRinkaLead:passed37thbirthdayofthepear,theeyesofeveryonestillhasaLolita-likegirltemperament,herinterpretationoftheinvolutionBOBlongghdhairstraightener hair,andevensetoffinas
1url不要用hash模式,如果涉及到外部如firebase方式直接发送给客户端动态链接,要求打开app内h5地址的时候,这个#会被截断,客户端无法解析2尽量在多页面,当客户端由不同入口进入的时候,前端尽可能做多业务拆分,避免以后所有模块在一起,一次修改要全部上线,3移动端输入框键盘要求输