应用缓存机制可以参考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. 向python文件传递参数

    1. 向python传递单个参数: import sys print sys.argv[0]  ##脚本名 print sys.argv[1]  ## 第一个参数 2. 向python传递数组: pr ...

  2. 博客代码:iframe—网页中嵌入其他网页

    iframe 是一个可以把另外一个网页嵌入到一个网页里的代码,非常有用.对于一个内容不错的网页,要方便地把它搬到自己的博客里,用这个代码最合适.而对于在新浪博客里不支持的一些网页效果和代码,可先把他们 ...

  3. 关于tp.5.0角色管理导致的创建角色登陆报错问题解决!

    今天用tp 5.0的时候,遇到一个问题,就是在利用超级管理员创建管理员角色时,角色账号密码登陆报错的问题 解决方法如下 htaccess文件修改如下 <IfModule mod_rewrite. ...

  4. excel中的TEXT函数

    TEXT 函数可将数值转换为文本,并可使用户通过使用特殊格式字符串来指定显示格式. TEXT(value, format_text) value  必需.数值.计算结果为数值的公式,或对包含数值的单元 ...

  5. iOS 沙盒(sandbox)结构 使用 实例

    声明:该文档是经过自己查找网上的资料以及自己多年的经验后而总结出来的,希望对大家有所帮助,有什么不恰当支出还请大家多指点! iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为 ...

  6. webView 点击页面跳转到浏览器

    @interface ForumDetailViewController ()<UIWebViewDelegate> { NSUInteger _clickedNumber; } @end ...

  7. [OC笔记]@property之个人理解,大神轻拍

    /** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...

  8. 关于JS 事件冒泡和onclick,click,on()事件触发顺序

    今天在给JQgrid中的标签添加click事件的时候,发现一个问题. JQgrid的table中,点击任何位置,都会勾选点击行的checkbox,而我希望在点击我的标签的时候,不要勾选checkbox ...

  9. Windows XP SP3 VC6环境下成功编译openssl-0.9.8zh

    1.下载openssl-0.9.8zh解压到f:\openssl-0.9.8zh 下载nasm-2.12.03rc1解压到D:\develop\nasm-2.12.03rc1并把添加到系统环境变量PA ...

  10. MVC拦截器记录操作用户日志

    主要是用于记录用户操作动态, public class OperationAttribute:ActionFilterAttribute { /// <summary> /// 方法名称 ...