无线webapp安装更新机制

简介:

摘要 

为了满足移动终端:节省流量、减少请求、提高客户端性能的需求,我们设计了webapp安装更新程序,把js、css、html和图片这些资源,序列化为字符串存入客户端本地存储,并带上版本号来实现资源细粒度更新。

TAG

webapp 安装启动 性能优化

1、概述

我们认为webapp是一站式的应用,在一个页面里能完成整站的功能。所以,以前通过页面全刷的跳转,现在变成了通过底层框架来支持的局刷和切换动画。为了支持这些功能,会多出不少的代码,再加上app里的功能代码,我们统称为资源,包括底层库js(zepto、iscroll、baiduTemplate等),通用ui组件和app功能性的js、css、html和图片。

如何处理一个页面里的这么多资源,才能降低对性能的影响呢?为此,我们设计了webapp安装更新程序,可以做到减少资源请求,节省流量,提升客户端性能。

 

2、浏览器缓存方案

使用浏览器对资源缓存,这是通常的做法,能快速加载页面,只需设置资源一个较长的过期时间即可,当服务器端资源有更新时,改变资源路径就能使客户端及时获取更新。

但缺点是,在webapp应用场景中,有大量的资源需要被下载,资源请求数可能过多,目前正在开发的贴吧webapp宙斯版,已经有60个请求了,预计会过百,当然我们可以把资源文件合并,但又带来了另外一个问题,下载粒度较大。当更新了一个较小部分,会导致大粒度资源被重新下载。由于手机硬件和手机网络的限制,每多一个连接请求的时间消耗和资源下载导致的流量耗费,都是无线webapp要考虑的重要因素。

另外一个缺点就是只能缓存文件,不能缓存一些常量,比如前端模板html片段。

为此,我们设计的webapp安装更新程序,能够只在一个请求中下载所有资源文件内容。当资源有更新的时候,也是在一个请求中只获取有更新的小粒度文件,并且能在客户端缓存常量,如html片段等。

3、自定义安装更新程序

我们想把资源细粒度的存储在客户端,当资源有更新的时候,客户端能及时同步更新。要解决两个主要问题:1、如何在客户端存储资源;2、如何及时获取更新通知,并执行资源更新。

1)      客户端资源存储

我们把资源序列化为字符串,以键值对的方式存入客户端本地存储(localstorage)。比如基础库zepto.js文件,在本地存储中的key为zglobal/js/base/zepto.js,value就是zepto.js的被压缩后的字符串内容了。同理,css文件,html前端模板都是一样,适合做成base64编码的图片会以base64字符串的形式存在css文件。

在资源被引用的地方,如果是js文件,我们会从本地存储中取出js字符串内容,执行eval函数;如果是css文件,我们会动态创建style元素,包含css内容,追加到HTMLDocument的head部分;如果是html前端模板,就在用到的地方,从本地存储获取前端模板字符串,然后调用模板方法进行渲染。

资源本地存储示例片段:

图一

资源的引用方式sample code:

图二

2)      获取资源更新通知

实现资源更新要依赖于资源版本号。我们把每个资源缓存项都对应一个版本号(文件的md5值的前8位),整站所有资源缓存项对应一个总的版本号(所有资源缓存项的版本号的md5值)。

具体流程是:我们把总版本号存入cookie,在一些入口url的服务器处理程序中,判断客户端cookie是否和当前服务器资源总版本号是否相同,如果相同,则跳过资源更新处理,直接启动app,如果不同,说明有资源更新,此时,客户端发送一个ajax请求,带上当前客户端每个缓存项的版本号,向服务器获取更新项,服务器对比客户端每个缓存项的版本号,就知道客户端哪些资源是需要更新的,哪些资源是被删除了的,因此,服务端就能只返回被更新了的资源。那么,客户端是如何拿到当前客户端每个缓存项的版本号呢?其实是依赖于服务器响应客户端ajax资源更新请求时,会包含每个更新了的资源缓存项的名称、版本号和资源内容字符串,客户端拿到这个结果,会更新本地存储中专门用来记录更新后每个资源项的版本号的一个本地存储项,以一个json对象序列化后的字符串形式存在,因此客户端发送的ajax请求,就是直接带上这个json字符串即可。

程序流程:

图三

图三中的totalItemVersions就是所有细粒度资源缓存项的版本号记录。在客户端本地存储中的key为totalItemVersions,value是{“zglobal/html/frsMostTemplate.html”:”d6670285″,”zglobal/js/base/ajaxStore.js”:”68ce034f”,”zglobal/js/base/appBaseController.js”:”4083dd27″,”zglobal/js/base/appBaseModel.js”:”f1f806f1″,”zglobal/css/common/app.css”:”66153242″,”zglobal/css/common/base.css”:”2731733d”……….}

通过以上,我们能发现,当服务器端无资源更新时,启动的webapp将不会有网络资源请求,直接加载本地资源,然后启动app,后续只是app动态的json数据交互;当服务器有资源更新时,不管被更新的资源的多少,客户端都是通过一个请求获取仅更新的资源,然后加载资源,并启动app。

4、本地build

了解了前面整个客户端和服务器的交互之后,我们可能会关心,这些资源在服务器端是如何生成并存储的?这依赖于一个本地build过程。

在贴吧的前端开发中,是按不同模块来开发的,不同模块包含不同的功能,这样能减少大家同时修改带来的冲突。最后的上线,也是按修改的哪些模块,只上线相应的模块修改即可。

每个模块下都会有本地build脚本,只负责本模块的build工作。对于安装更新这块来讲,本地build输出两个文件,moduleVersion.php和cache.php。

cache.php就是当前模块下所有的资源缓存项,每个项的version就是资源文件的md5值的前8位,cache.php文件如下:

图四

moduleVersion.php表示当前模块的版本号,文件如下:

 

图五

模块版本号的计算方法是当前模块下所有缓存项的版本号的总连接字符串的md5的前八位。这样当任何一个资源文件有修改的话,资源文件的version将会改变,moduleVersion的值也会改变。

在“获取资源更新通知”一节中,提到了整站所有资源缓存项的总版本号,这个版本号的计算方法是,所有模块的版本号的总的连接字符串的md5。

图六

5、使用建议

如果大家也在做无线webapp,建议不妨试试这种资源处理方式,将会有更少的资源请求,并且让资源更快加载,给用户带来更好的体验。

by gaofei









本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/1033694,如需转载请自行联系原作者

相关文章
|
3月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
19 0
|
3月前
|
监控 Dart 安全
创建一个Dart应用,监控局域网上网记录的软件:Flutter框架的应用
在当今数字时代,网络安全变得愈发重要。为了监控局域网上的上网记录,我们可以借助Flutter框架创建一个强大的Dart应用。在这篇文章中,我们将深入讨论如何使用Flutter框架开发这样一个监控局域网上网记录的软件,并提供一些实用的代码示例。
273 1
|
9月前
|
网络协议 网络安全
openWRT软路由AdGuardHome 未运行 未重定向无法更新核心解决办法
openWRT软路由AdGuardHome 未运行 未重定向无法更新核心解决办法
4320 0
|
PHP 数据库 数据安全/隐私保护
|
1月前
|
监控 JavaScript 安全
监控内网电脑软件设计与实现:基于Node.js的服务器端架构分析
在当今信息技术高度发达的时代,监控内网电脑的需求日益增长。企业需要确保网络安全,个人用户也需要监控家庭网络以保护隐私和安全。本文将介绍一种基于Node.js的服务器端架构,用于设计和实现监控内网电脑软件。
90 0
|
4月前
|
JSON 监控 JavaScript
Node.js实战:搭建公司局域网监控软件的实时通知系统
在公司局域网环境中,建立一套实时监控系统对于确保网络安全和维护公司正常运作至关重要。本文将介绍如何利用Node.js搭建一个局域网监控软件,并实现实时通知系统,以便及时响应异常情况。
202 0
|
API 开发工具 vr&ar
【Google Play】App Bundle 使用详解 ( 按条件分发 | 国家地区 | SDK 版本 | 设备功能 | 按需分发 | 资源分发 )
【Google Play】App Bundle 使用详解 ( 按条件分发 | 国家地区 | SDK 版本 | 设备功能 | 按需分发 | 资源分发 )
251 0
【Google Play】App Bundle 使用详解 ( 按条件分发 | 国家地区 | SDK 版本 | 设备功能 | 按需分发 | 资源分发 )
接入高防后为什么有一些网站,APP等会出现延迟,打开速度慢等问题?
我们常见的一些网站,APP等用户在接入高防后,会出现延迟,打开速度慢等问题,假如出现这样的情况请大家不要惊慌失措,短暂的时间内出现延迟,打开速度慢是正常的。
大文件分发下载技术浅谈
p2p分发下载技术可以实现高速下载,按需下载,边下边玩等功能: 1、节省服务器带宽,降低成本 2、支持边下边玩 3、断点续传...
401 0