HTML5游戏和APP缓存与版本更新

概述

浏览器的缓存可以说是一把双刃剑,一方面可以大大加速用户访问的速度,节约带宽;另一方面在版本更新时,缓存又是一个头疼的问题,浏览器有可能使用缓存而非最新发布的资源。资源包括js脚本、CSS、图片资源等。

使用HTML5开发App或者游戏时,理想状态应该是这样的:用户第一次访问,下载和缓存资源;再次访问时,如果服务器版本没有更新,继续使用缓存的资源,不用重新下载;如果服务器版本有更新,则下载更新的资源,然后进入App/游戏。

HTTP的If-Modified-Since Header可以方便的检查文件是否有更新,我们只需要在服务器配置支持If-Modified-Since Header。nginx默认开启,apache需要手动配置一下。没有更新的文件,服务器返回304,但不会传输文件内容,所以请求返回会非常快;有更新的文件,返回200,并传输文件内容。

实际上,对于js脚本、CSS、文本、JSON等文件,可以使用XMLHTTPRequest下载,大部分浏览器会自动进行If-Modified-Since判断,所以这一部分的版本更新和缓存通常是没有问题的;而对于图片资源,XMLHTTPRequest不能加载Cross-domain的图片,而且只能加载Base64格式图片,会使图片尺寸大幅增加。当然,也可以考虑使用XHR2,或者其他XHR的增强,但是兼容性都还不是特别的好。通常情况下我们使用HTML5的Image元素,设置src属性的方式下载图片资源,但会直接使用缓存的资源。

那么问题来了,怎么确保图片资源的缓存和版本更新没有问题呢?(我使用的测试浏览器包括PC端的Chrome/Firefox/Safari,移动端的Safari/Chrome/微信浏览器/QQ浏览器,其余平台未经测试,本文给出方案在其余浏览器仍需测试验证。)

方案1:直接更改图片资源的访问地址

简单粗暴但是十分有效的方法,每次版本更新之后将更新图片的访问地址直接改变。可以在访问地址后加参数,也可以根据文件的MD5值更改文件名,推荐直接改文件名。需要做的工作就是写脚本自动计算MD5值,更改文件名,在js/html等文件里访问地址也需要自动搜索替换,一键发布,搞定。

不足之处:某些js脚本可能有拼接生成文件访问地址的,例如某个特效序列帧,访问地址为"assets/effect_{0}.png".format(index),这种情况替换就会比较麻烦,需要特殊考虑。(此处我修改了String.prototype.format)

方案2. 使用HTML5的ApplicationCache

ApplicationCache我在之前的博文也有介绍,版本更新时我们只需要对应manifest文件的版本号和CACHE列表即可,浏览器会自动根据manifest文件列表更新文件,始终能保证用户访问到的资源都是最新的。写脚本自动生成manifest文件,一键发布,搞定。

不足之处:如果图片资源很大,我们不希望用户下载所有的图片才进入App/游戏,有很多图片资源可以进入后按需加载。那么这部分按需加载图片就要列入NETWORK列表,或者为了简便直接设置NETWORK: *。问题在于,HTML5规范中NETWORK段是从来不进行缓存的,那么用户再次访问时,按需加载图片资源需要重新下载。所以如果存在按需加载的图片资源,ApplicationCache效果就差很多。

实际测试中,微信浏览器/QQ浏览器对于NETWORK段的资源并没有遵循规范,也进行了缓存,即使用户退出再次访问,按需也会使用缓存的图片,加载速度很快。所以ApplicationCache方案在这两个浏览器就非常适合。Safari/Chrome则不会对NETWORK段资源缓存。

方案3:在服务器配置图片资源的expire时间

第三种思路则是在服务器返回请求时控制图片资源的expire时间,大部分浏览器在文件expire时间到了之后重新从服务器请求下载文件(微信浏览器/QQ浏览器例外,经测试即使expire之后依然会使用缓存图片。。)。我们的App/游戏依然使用浏览器的普通缓存而非ApplicationCache,测试中发现expire后浏览器请求下载文件支持If-Modified-Since,所以只要始终标记图片资源为expired,浏览器就可以自动检查图片是否需要更新。这种方案设置简单,但是非常有效。

比如nginx设置:

location ~* \.(jpg|jpeg|png|ico)$ {
  expires -1;
}

不足之处:在Safari/Chrome的效果非常好,但在对于部分缓存机制比较强的浏览器(微信/QQ浏览器等),这种方案不可行。

总结

以上的方案是我在不停的摸索中总结出来的,但概括来说,缓存和版本更新问题,并没有找到一个完美的通用解决方案,浏览器实现和支持HTML5程度千差万别,还是需要根据发布的平台对应选择方案。如果您有更好的方案,欢迎交流和分享!

时间: 2024-10-13 00:19:02

HTML5游戏和APP缓存与版本更新的相关文章

HTML5游戏实战(4): 20行代码实现FlappyBird

这个系列很久没有更新了.几个月前有位读者调侃说,能不能一行代码做一个游戏呢.呵呵,接下来一段时间,我天天都在想这个问题,怎么能让GameBuilder+CanTK进一步简化游戏的开发呢.经过几个月的努力,虽然还是做不到一行代码做一个游戏,但是GameBuilder的功能已经有了质的突破了.今天我们用FlappyBird为例介绍一下用GameBuilder +CanTK开发游戏的方法,整个游戏用了不到20行代码. CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发H

HTML5游戏实战(2):90行代码实现捕鱼达人

捕鱼达人是一款非常流行的游戏,几年里赚取了数以千万的收入,这里借用它来介绍一下用Gamebuilder+CanTK开发游戏的方法.其实赚钱的游戏未必技术就很难,今天我们就仅用90来行代码来实现这个游戏. CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发HTML5游戏或者APP的利器,如果你喜欢它,请在github上给它加星,您的支持是我们努力的动力:https://github.com/drawapp8/cantk 0.先Show一下最终成果: 在线运行:htt

HTML5游戏实战(3): 60行代码实现水平跑酷游戏

跑酷游戏无疑是目前最受欢迎的游戏类型之一,3D跑酷游戏可能比较难做一点(这个我不懂),2D跑酷却是非常容易的,只要有美术资源,做一个<天天酷跑>这类流行游戏也并非是什么难事. 这里通过一个松鼠跑酷的游戏介绍一下用Gamebuilder+CanTK开发游戏的方法,这个游戏的主场景仅用了60来行代码. CanTK(Canvas ToolKit)是一个开源的游戏引擎和APP框架,是开发HTML5游戏和APP的利器,如果你喜欢它,请在github上给它加星,您的支持是我们努力的动力:https://g

主流HTML5游戏框架的分析和对比

本文主要选取了Construct2.ImactJS.LimeJS.GameMaker.CreateJS.lycheeJS.Crafty.three.js.melonJS.Turbulenz.Quintus.Cocos2d-html5等进行了简要介绍和对比,主要是根据网上的资料整理而成. 主流框架对比 Construct2 Construct 2是一个运行于Windows平台的游戏制作工具,它可以让没有任何编程基础的用户在短时间内不写一行代码快速开发出一款可运行于所有平台(Windows.Mac.

atitit.html5 vs 原生 app的区别与选择

atitit.html5  vs 原生 app的区别与选择 1. html5的优点 1 1.1. 最大优势::在跨平台(ios苹果,android安卓等) 1 1.2. 开放性 1 1.3. 快速的更新,热更新 2 1.4. 开发成本上 2 1.5. 碎片化 2 2. 原生app 应用的优点 2 2.1. 对游戏等要求性能的app更好 2 2.2. 原生应用最大的优势就是可以访问设备中的所有功能 2 2.3. 对摄像头.电话本,相机,游戏等操作支持的好,对语音,联系人和日历,也支持比较好. 2

javascript+HTMl5游戏下载,开发一个都能月薪上万!舅服你

HTML5时代已经到来许久了,你是否已经掌握了那么一点呢?今天小编给大家讲讲h5的折叠多设备.跨平台特性, 即用HTML5制作游戏.相比flash,HTML5更加灵活方便,随着浏览器技术的不断升级,HTML5一定会广泛使用,至少在网页动画方面,下面是一些利用HTML5完成的游戏作品.你是否能在这个领域有所建树就看你掌握H5多少技能啦? HTML5切水果游戏: 这曾是风靡全球的一款手机APP游戏切水果,现在JS小组已经将其改版成HTML5,并将其开源.下面的所有游戏我都已经用到自己的域名上线了,想

JAVASCRIPT开发HTML5游戏--斗地主(网络对战PART4)

继之前用游戏引擎(青瓷引擎)做了斗地主单机版游戏之后,这里分享下使用socket.io来实现网络对战,代码可已放到github上,在此谈谈自己整个的开发思路吧. 客户端代码 服务端代码 (点击图片进入游戏体验) 前文链接: javascript开发HTML5游戏--斗地主(单机模式part1) javascript开发HTML5游戏--斗地主(单机模式part2) javascirpt开发HTML5游戏--斗地主(单机模式part3) 本文章为网络对战第一部分内容.主要内容如下: 简介 服务端项

微信传播HTML5游戏的特点

一.现阶段微信H5游戏的特点 现在网络上流行的H5游戏大多是轻游戏,而基于微信传播的H5游戏大多具有以下特点: 1)速时 游戏要1分钟甚至是30秒内可以玩完,神经猫,疯狂手指,数钞票,房祖名无不属于这类.疯狂手指甚至短到了10秒,如果在网上搜,可以搜到10秒600次的视频. 2)简单 到迄今为止能火的都是快餐类游戏,特别为开发人员所不屑.但现在轻游戏几百款传播量最大的都是不需什么智商的游戏,基本上都是虐心的小游戏,传播效果很好,这是现实.这点很多人也都意识到了,就不多说了. 3)竞技 这部分体现

HTML5游戏 -《三国战线》发布

关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战,官渡之战到夷陵之战,夷陵之战到五丈原之战等15个关卡.在每个关卡中,你会控制一名三国武将与出现的敌军进行交战以此保护你的主公:同时,你还可以召唤出你的友军,与你并肩作战. 除此之外,本作还提供了人物对话,以及火计.水攻等计谋,使游戏可玩度更高. 操作说明 游戏中,你只需要点击屏幕左右两侧,使你扮演的角色左右移动,当敌军进入你的攻击范围后会自动攻击.你还可以通过点击下方的人物头像进行召唤队友.其他的