应用缓存机制可以参考http://www.w3school.com.cn/html5/html_5_app_cache.asp,不再赘述。利用此机制,html5游戏可以实现和native app类似的更新和运行环境,减少文件的频繁下载。

1. Server设置:

nginx, 修改manifest文件的mime type映射,打开文件$nginx/conf/mime.types,增加

text/cache-manifest                   manifest;

2. 网页文件设置:

在index.html的<html>标签修改

<html manifest="jstest.manifest">

其中jstest.manifest文件为缓存控制文件(测试起得名字),与index.html同级目录

3. manifest文件:

包含3个段, CACHE, NETWORK, FALLBACK

CACHE: 可以缓存起来的部分,离线可用

NETWORK: 永远不会被缓存,且离线时是不可用的

FALLBACK: 规定如果无法建立因特网连接,则用 "offline.html" 替代 /html5/ 目录中的所有文件

CACHE MANIFEST
#version -- ::29.247754 CACHE:
res/CloseNormal.png
res/CloseSelected.png
res/favicon.ico
res/HelloWorld.png
src/aaa.js
main.js
project.json NETWORK: FALLBACK:

第一行,CACHE MANIFEST,是必须的,指定此文件为manifest文件

第二行,#version注释,标记版本号,因为应用的缓存会在其 manifest 文件更改时被更新,所以每次通过更新version号来更新缓存

用cocos2d-html5测试游戏,发现第二次加载会报cc undefined,原因是引擎的js文件并没有缓存。

解决方法:写一个python脚本自动生成manifest文件,其中CACHE段用遍历方法将frameworks/cocos2d-html5目录下的文件遍历加入,排除不需要模块。例如:

def listDir(root, exceptArr, result):
  for item in os.listdir(root):
  filepath = root + "/" + item
  if item.startswith("."):
    continue
  if os.path.isdir(filepath):
    if filepath in exceptArr:
      continue
  else:
    listDir(filepath, exceptArr, result)
  else:
    result.append(filepath) engineList = [
  "frameworks/cocos2d-html5/CCBoot.js",
  "frameworks/cocos2d-html5/CCDebugger.js",
  "frameworks/cocos2d-html5/moduleConfig.json",
  "frameworks/cocos2d-html5/Base64Images.js"]
exceptList = ["frameworks/cocos2d-html5/cocos2d/physics",
  "frameworks/cocos2d-html5/extensions",
  "frameworks/cocos2d-html5/external"] listDir("frameworks/cocos2d-html5/cocos2d", exceptList, engineList)
#engine files are stored in engineList

另一个思路是将引擎文件通过uglifyjs等工具压缩为一个js文件,不过在cocos2d-html5 v3.1环境下部分模块是根据运行环境动态加载的,选取哪些脚本压缩比较头疼,试验后放弃此方法。

4. manifest文件更新与游戏更新:

如上面所提,通过jstest.manifest文件的#version xxx更改来通知浏览器进行更新文件。

浏览器会根据manifest自动下载更新,但是游戏启动前需要保证脚本、资源等更新到最新版本再进入游戏。

在js脚本中可以通过window.applicationCache对象来获取更新进度。

var cache = window.applicationCache;

cache.oncached = function() {
cc.game.run();
}
cache.oncheking = function() { }
cache.ondownloading = function() { }
cache.onerror = function() { }
cache.onnoupdate = function() {
cc.game.run();
}
cache.onobsolete = function() { }
cache.onprogress = function() { }
cache.onupdateready = function() {
cache.swapCache();
cc.game.run();
}

当浏览器首次缓存应用时,更新状态依次为:ondownloading -> onprogress(*N) -> oncached;

再次加载,如果manifest文件无更改,状态依次为:onnoupdate;

再次加载,如果manifest文件有更改,状态依次为:onprogress(*N) -> onupdateready;更新完毕后需要调用applicationCache.swapCache()才会更新为最新资源,否则还是使用原来的缓存。

onprogress每更新完一个文件就会触发一次(包括.manifest文件本身),在Chrome下progress event有lengthComputable, total, loaded等属性,可以用total和loaded计算更新进度,但在firefox/safari下没有。

5. 浏览器查看应用缓存

我使用的是firefox浏览器,地址栏输入about:cache可以查看网页缓存和应用缓存

appcache

Number of entries: 274
Maximum storage size: 512000 KiB
Storage in use: 1816 KiB
Storage disk location: /Users/xxx/Library/Caches/Firefox/Profiles/9loj6ek4.default/OfflineCache
List Cache Entries

点击List Cache Entries即可查看应用缓存

Html5应用程序缓存ApplicationCache的更多相关文章

  1. HTML5应用程序缓存实现离线Web网页或应用

    HTML5应用程序缓存和浏览器缓存的区别.(有些)浏览器会主动保存自己的缓存文件以加快网站加载速度.但是要实现浏览器缓存必须要满足一个前提,那就是网络必须要保持连接.如果网络没有连接,即使浏览器启用了 ...

  2. HTML5: HTML5 应用程序缓存

    ylbtech-HTML5: HTML5 应用程序缓存 1.返回顶部 1. HTML5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线 ...

  3. cookie,sessionStorage,loclaStorage,HTML5应用程序缓存

    cookie Cookie 是一些数据,由服务器生成,发送给浏览器,一旦用户从该网站或服务器退出,Cookie 就存储在用户本地的硬盘上,下一次请求同一网站时会把该cookie发送给服务器.Cooki ...

  4. 【HTML5】浅析HTML5应用程序缓存(ApplicationCache)

    一.为什么需要Web应用程序缓存 在移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无法访问网站,这对于web的伤害是很大的    ...

  5. HTML5应用程序缓存Application Cache

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  6. HTML5应用程序缓存Application Cache详解

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  7. HTML5之appcache语法理解/HTML5应用程序缓存/manifest缓存文件官方用法翻译

    习惯性的贴几个参考链接: W3School-HTML 5 应用程序缓存 官方 MDN window.applicationCache 接口文档 官方 MDN 用法示例 看所有的教程不如直接看最原始的官 ...

  8. HTML5应用程序缓存Application Cache详解.RP

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  9. HTML5应用程序缓存Application Cache.RP

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

随机推荐

  1. 如何在SqlServer中获取前端连接的IP地址,计算机名等信息

    在一些需求中,可能我们需要知道连接到SqlServer的前端程序的一些系统信息,比如前端连接的计算机名称,IP地址,什么时候开始请求连接,什么时候结束连接等信息. 如果你对SqlServer的系统函数 ...

  2. js判断input输入框长度(支持中英文输入)

    function CheckTxtLength(txt) { var num = txt.replace(/[^\x00-\xff]/g, 'xx').length; if (num <=11) ...

  3. 微信支付-“申请退款”接口遇到curl出错,错误码:58

    该错误是没有 使用证书 导致的. 解决办法: 1. 下载证书. 2. 拷贝到 WxPayPubHelper/cacert/目录下 重试退款,OK

  4. awk的涂鸦

    awk太牛了,博大精深,学不透,学了不用,又忘. 所以花了一天,自己总结了基础,以后就当字典查(容易忘).有不对的地方,忘大家指出. [ganzl@cmdb ~]$ more /etc/passwd ...

  5. .net中的 InitializeComponent方法

    自己做笔记用,纯碎自己做笔记,谁看不惯想喷的请绕道 在winform开发中每一个窗体在构造函数的方法就需要 InitializeComponent方法,就是初始化 窗体组件  例如 TextBox,T ...

  6. SQL Server类型的对应关系

    bit bool tinyint byte smallint short int int bigint long real float float double money decimal datet ...

  7. 三款Javascript SPAs框架资料整理和总结

    一.框架介绍 RequireJS 资料:http://www.requirejs.cn/RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可 ...

  8. JavaScript 随笔1

    第一章 JavaScript实现 JavaScript由三个不同部分组成: ECMAScript,提供核心语言功能 DOM,提供访问和操作网页内容的方法和接口 BOM,提供与浏览器交互的方法和接口. ...

  9. Redis 缓存 + Spring 的集成示例

    参考网址:http://blog.csdn.net/defonds/article/details/48716161

  10. logback 配置详解(一)

    一:根节点<configuration>包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文 ...