`

无线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,建议不妨试试这种资源处理方式,将会有更少的资源请求,并且让资源更快加载,给用户带来更好的体验。

转自:http://stblog.baidu-tech.com/?p=1964
分享到:
评论

相关推荐

    基于mui的webapp版本更新方法 基于mui的版本更新方法 iOS热更新安卓版本

    本篇文章将详细探讨如何在基于Mui的Webapp中实现版本更新,包括iOS的热更新和Android的apk安装包下载。 1. **Mui框架基础** Mui是阿里巴巴淘票票团队开源的一款轻量级前端框架,它的设计目标是简化多端开发,支持...

    PhoneGap做的手机WebAPP安装程序

    PhoneGap做的手机WebAPP安装程序

    idea开发webapp 热部署

    idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发webapp 热部署idea开发...

    nexus-webapp-1.9.2.4安装文件

    标题中的"nexus-webapp-1.9.2.4安装文件"指的是Nexus仓库管理器的一个特定版本,即1.9.2.4。这个版本的Nexus是作为Web应用程序来部署的,因此以".war"(Web ARchive)文件格式提供。.war文件是Java Web应用的标准...

    training/webapp镜像

    training/webapp镜像,方面一些内网用户无法直接pull镜像时下载: 使用方法: docker load -i training-webapp.tar.gz

    QtWebApp应用例程

    **QtWebApp应用例程详解** QtWebApp是一款基于Qt框架的开源库,它使得开发者能够在C++环境中轻松地创建Web应用程序。这个库的核心功能是将HTTP服务器与Qt应用程序集成,使得用户可以通过Web浏览器与本地应用程序...

    C# Webapp C# WebappC# WebappC# Webapp

    C# Webapp的开发中,表示层主要负责用户交互,使用ASP.NET技术如ASP.NET MVC或ASP.NET Core来创建动态网页。业务逻辑层处理应用程序的核心功能,通过C#编写服务类实现业务规则。数据访问层则与数据库进行交互,例如...

    webapp开发综合案例

    1.了解Web工程概念及与传统软件工程的区别 2.理解WebApp的概念、特点和开发过程 3.掌握WebApp的分析、设计和测试方法 4.掌握WebApp综合开发方法及课程设计过程

    Android应用程序之WebApp开发实战

    WebApp是一种基于Web技术构建的应用程序,用户可以在浏览器中直接访问和使用,而无需安装。对于Android平台,WebApp可以通过WebView组件实现,这是一个内置的浏览器控件,能够加载和显示HTML、CSS和JavaScript内容。...

    组件方式开发webApp源码

    通过研究这个源码,开发者可以学习到如何组织和实现组件化WebApp,理解组件间的通信机制,以及如何利用现代前端工具进行项目构建。这有助于提升开发者的技能,使他们能够创建出高效、可维护的Web应用程序。 总之,...

    webapp 部署

    1. 准备服务器:设置好操作系统,更新系统包,安装必要的安全补丁。 2. 安装依赖:根据应用需求安装JVM、Python解释器、数据库等。 3. 配置环境变量:设置与应用相关的环境变量,如数据库连接字符串、密钥等。 4. ...

    ssh webapp 先方方

    6. **Web服务器配置**:SSH也可能涉及到Web服务器的配置,如Apache或Nginx,它们可能需要通过SSH进行远程管理,包括更新配置、安装扩展或优化性能。 7. **故障排查**:如果Web应用遇到问题,开发者可能需要通过SSH...

    webApp和壳的接口.docx

    同时,壳能够实时反馈视频播放的状态,使得WebApp可以根据这些信息进行进一步的操作,如更新用户界面或者记录播放进度。 总结起来,WebApp与Android壳的接口协议是混合式移动应用开发中的关键技术,它使得WebApp...

    webkit webApp 开发技术要点总结

    本文将深入探讨WebKit WebApp开发中的核心知识点,包括视口管理、链接资源优化以及事件处理机制,旨在帮助前端开发者更好地掌握移动Web开发技巧。 #### 一、Viewport:掌控可视区域 Viewport是移动设备浏览器中...

    Android 原生webApp的运行壳

    6. 发布与更新:WebApp的更新通常比原生应用更简单,因为只需更新服务器上的HTML、CSS和JavaScript文件,用户无需重新下载整个应用。 三、安全与性能优化 1. 安全性:由于JavaScript可以直接调用Android方法,所以...

    Web基础——WebApp之初体验(三)

    WebApp是互联网技术的重要组成部分,它们允许用户在浏览器中直接访问和使用各种功能丰富的应用程序,无需下载和安装独立的软件。随着移动设备的普及,WebApp已经成为开发人员和用户之间连接的重要桥梁。 首先,...

    移动WebApp开发框架Clouda.zip

    Clouda是基于node.js的Webapp开发框架,在使用Clouda时需要安装node.js和MongoDB。 Clouda 是百度推出的一款面向资深开发者的WebApp开发框架。在Clouda中开发app,可以在多终端下实现数据同步、任务迁移。并且Clouda...

    ios 网站套壳源码 webapp

    iOS Webapp 是一种将网页应用打包成类似原生应用的形式,用户可以在iOS设备上通过安装这个“壳”来访问和使用基于Web技术构建的应用。这种方式通常用于快速开发,或者作为原生应用的补充,特别是在不需要频繁更新...

    webapp框架

    Webapp框架是构建Web应用程序的一种结构化方法,它旨在简化开发流程,提高代码复用性和项目的可维护性。在这个特定的压缩包文件中,我们关注的是一个包含了登录、主界面框架以及播放器Demo的实现。这表明这个框架...

    cas-server-webapp

    CAS(Central Authentication Service) 是 Yale 大学发起的一个开源项目,据统计,大概每 10 个采用开源构建 Web SSO 的 Java 项目,就有 8 个使用 CAS 。

Global site tag (gtag.js) - Google Analytics