一、基本概念

离线缓存是HTML5新引入的技术,能够让你的Web应用程序指定哪些文件可以缓存在本地,使得你的网络断开时依然可以通过本地的缓存来进行访问浏览。

二、使用方法

1. MIME type 声明

首先,因为manifest文件必须是一个MIME type为text/cache-manifest类型的存在。文件后缀名可以自定义(建议为.appcache)所以我们需要现在服务端将.appcache后缀的文件类型声明为text/cache-manifest。以apache为例,我们需要在httpd.conf中加上:

AddType text/cache-manifest .appcache

2. 在HTML文件中引入manifest文件

<!-- clock.html -->
<!DOCTYPE html>
<html manifest="clock.appcache">

其中manifest文件的后缀名必须为.appcache,并且和引入该manifest的页面同源

3. manifest文件语法

CACHE MANIFEST
# 上面这行是必须的 # 这是一行注释
# 在这个文件中的任何地方都可以添加
# 它们全部都会被忽略
# 在注释之前可以有空格
# 但必须是在单行前 # 空行也会被忽略 # 这些列在最开始的文件都是需要被缓存的
# 或者是那些列在"CACHE:"里的, "CACHE"头必须写在这些文件之前,如同
# 下面写好的那样
images/sound-icon.png
images/background.png
# 注意,每个文件必须单独一行 # 在线白名单中出现的这个文件,它不会被缓存,并且,
# 对该文件的引用,将绕过缓存,总是会
# 从网络中获取目标(或在用户离线时,尝试从网路上获取)
NETWORK:
comm.cgi # 这是另一块要缓存的文件,这次只有一个css文件
CACHE:
style/default.css

我们也可以书写成这样:

CACHE MANIFEST
#version 1.0
CACHE:
style/default.css
images/sound-icon.png
images/background.png
NETWORK:
*
  • CACHE MANIFEST:这个是必须的,并且一定要写在manifest文件开头
  • CACHE:缓存清单列表,此处列出的为需要进行离线缓存的资源文件
  • NETWORK: 白名单列表,需要与服务端进行交互获取的资源文件,此处必须列出除缓存清单列表以外所有的资源地址(可以使用通配符*星号代替),否则没有列出的资源文件将加载失败

引入manifest的页面,即使没有被列入缓存清单中,仍然会被用户代理缓存。并且无法通过白名单列表去除。

(缓存清单的文件列表可以使用绝对路径或绝对URL地址)

开启离线缓存后,我们可以在chrome中打开f12来看看资源加载有啥区别

可以看出,使用离线缓存后的资源,资源请求的状态码都变为200,并且在size栏中都被标明为(form cache),加载速度也是显而易见的。

4. 缓存如何更新?

资源被离线缓存后,无论我们在后端如何更改资源文件,客户端都不会拉取到修改过的文件。

原来,只有当manifest文件被更新后(修改文件任何地方,包括注释等),客户端才会更新离线缓存文件,并且每次都会更新全部的缓存文件,包括没有被修改的资源文件,但一般这些文件都会走304的缓存策略。

另外,在服务端修改manifest文件后,客户端第一次访问页面需要再刷新一次才能获取最新的资源。因为对于浏览器来说,manifest的加载是要晚于其他资源的. 这就导致check manifest的过程是滞后的。发现manifest改变,所有浏览器的实现都是紧随这做静默更新资源,以保证下次pv,应用到更新。(这一点很蛋疼,但还是有解决办法,请继续往下看)。

5. 离线缓存对象和事件处理

在javascript中我们可以通过window.applicationCache来访问缓存对象,对象中包含了一个status属性以及若干的待监听的事件处理器。

其中status属性代表的是当前离线应用的状态,它可能的值为:

  • UNCACHED (0):未启用离线应用
  • IDLE (1):已开启离线应用,但本地缓存的资源是最新的,并且未标记为废弃资源
  • CHECKING (2):当前更新缓存的状态为“检查中”
  • DOWNLOADING (3):当前更新缓存的状态为“下载资源中”
  • UPDATEREADY (4):当前更新缓存的状态为“更新完毕”
  • OBSOLETE (5):已开启离线应用,但缓存资源都已标记为废弃

离线缓存事件:

  1. checking:在第一次下载manifest文件时,或者检查是否需要更新时触发
  2. noupdate:manifest文件未修改,不需要下载新的缓存文件时触发
  3. downloading:准备更新缓存之前,或者第一次下载资源之前触发
  4. progress:下载资源时触发,每下载一个资源都会触发一次
  5. cached:页面首次启用离线缓存,并且离线缓存下载完毕时触发
  6. updateready:资源更新完毕时触发
  7. obsolete:加载manifest文件时遇到401或404错误时触发
  8. errorEvent加载manifest文件时遇到401或404错误时触发

这样,我们就可以通过updateready事件来让离线缓存更新后自动刷新页面了,虽然还是比较挫:

applicationCache.addEventListener(‘updateready’, function(){
location.href=”test.html”;
}, false);

6. 离线缓存的下线

要将离线缓存下线,我们只需要将服务端的manifest文件删除即可,同时也要将HTML中的  manifest="manifest.appcache" 删除(不删也可以,会在console控制台报错,但不会影响页面访问),删除后用户再第一次访问还是原来的缓存页面,还需要再刷新一次。。。蛋疼吧。

HTML5 manifest离线缓存的更多相关文章

  1. HTML5 manifest离线缓存技术

    干什么用的? 离线缓存为的是第一次请求后,根据manifest文件进行本地缓存,并且在下一次请求后进行展示(若有缓存的话,无需再次进行请求而是直接调用缓存),最根本的感觉是它使得WEB从online可 ...

  2. html5 manifest 离线缓存知识点

    1.最大缓存容量为 5M. 2.manifest文件需要配置正确的MIME-type,即“text/cache-manifest”,这个是在web服务器上进行配置. ②编写.manifest文件,文件 ...

  3. 使用html5的离线缓存技术

    突然想用html5的离线缓存,但是一直没有成功,在各种群里问发现很多人都没什么经验,最终终于在各种论坛找到解决方案了.下面就简单记录一下相关情况. 一.离线缓存的优点 我们都知道离线缓存主要是用来减少 ...

  4. html5的离线缓存

    一个离线网络应用程序就是一个URL的列表,html,css,js,图片,或者其他类型的资源. 把这些资源,在本地缓存下来,当你尝试在没有网络连接时访问网络应用程序,你的浏览器将自动切换并使用本地代替. ...

  5. H5 manifest离线缓存

    请跳转我的有道云笔记查看: http://note.youdao.com/noteshare?id=caaf067c6e38820ba8f87b212c2327a9&sub=23E0F8F7A ...

  6. node.js与HTML5离线缓存

    最近正学到HTML5的离线缓存,却看到需要配置服务器.一下子就懵了,毕竟服务器的有关配置一般是很复杂的,而node.js的服务器是自己的代码生成的,这下要怎么配置?在网上搜索了很久,都没用关于node ...

  7. HTML5离线缓存(Application Cache)

    HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. ...

  8. HTML5离线缓存问题

    HTML5离线缓存问题 1.应用程序缓存 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. ...

  9. HTML5离线缓存

    参考文档:http://www.w3cschool.cc/html/html5-app-cache.html HTML5 应用程序缓存 又称离线缓存 ,即使断线了,刷新后也还是缓存了原来的页面,不会4 ...

随机推荐

  1. 名词释义(ActiveMQ 和 Webservice)

    ActiveMQ一般用来做消息通信,特别是异步的消息处理,把同步的处理变成异步消息,使得系统解耦.消峰平谷. Webservice则是一种RPC,用来远程调用服务,达到打通系统.服务复用的目的. 其实 ...

  2. Java虚拟机的功能

    1:通过ClassLoader寻找和装载class文件 2:解释字节码成为指令并执行,提供class文件的运行环境.即将字节码转换为不同OS下可执行的机器码指令. 3:进行垃圾回收. 4:提供与硬件交 ...

  3. BIEE 配置邮箱服务器

    找个免费邮件服务器126或者163的 登录em地址,点击“部署”——>“邮件”——>“锁定并编辑”——>应用——>激活更改——>重新启动以应用最近更改——>重新启动 ...

  4. BZOJ-1968 COMMON 约数研究 数论+奇怪的姿势

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1513 Solved: 1154 [Submit] ...

  5. 北航 编译实践 PL/0文法

    编译实践-PL\0编译系统实现 姓名:   专业: 计算机科学与技术 学院: 软件学院 提交时间: 2013年12月25日 北京航空航天大学·软件学院 编译实践-PL\0编译系统实现 实验要求 以个人 ...

  6. ubuntu使用ssh登入不执行.bashrc解决方法

    解决方法,可以直接输入 bash即可. 理解 bashrc 和 profile linux bashrc profile SEP 30TH, 2011 BY SUNTEYA 在一般的 linux 或者 ...

  7. mysql 高级查询

    高级查询:1.连接查询select * from Info,Nation #这是两个表名,中间用逗号隔开形成笛卡尔积select * from Info,Nation where Info.natio ...

  8. 如何起草你的第一篇科研论文——应该做&避免做

    如何起草你的第一篇科研论文——应该做&避免做 导语:1.本文是由Angel Borja博士所写.本文的原文链接在这里.感谢励德爱思唯尔科技的转载,和刘成林老师的转发.2.由于我第二次翻译,囿于 ...

  9. TCP的那些事儿(上)

    TCP的那些事儿(上) 原文链接:http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面. ...

  10. Nginx变量的实现机制

    Nginx有两种定义变量的方式,一种是在配置文件中使用set指令(由rewrite模块提供支持),另一种是在模块内定义变量. 变量相关结构体: struct ngx_http_variable_s { ...