H5的一个重要特性就是离线存储,所谓的离线存储就是将一些资源文件保存在本地,这样后续的页面重新加载将使用本地资源文件,在离线情况下可以继续访问web应用,同时通过一定的手法(更新相关文件或者使用相关API),可以更新、删除离线存储等操作;

H5的离线存储使用一个manifest文件来标明哪些文件是需要被存储的,使用如 <html manifest='offline.manifest'> 来引入一个manifest文件,这个文件的路径可以是相对的,也可以是绝对的,如果你的web应用很多,而且希望能集中管理manifest文件,那么静态文件服务器是个不错的选择。

对于manifest文件,要求:文件的mime-type必须是 text/cache-manifest类型。如果你是JAVA工程,在你的web.xml中配置请求后缀为manifest的格式:

<mime-mapping><extension>manifest</extension><mime-type>text/cache-manifest</mime-type>
</mime-mapping>  

这样可以控制请求到的manifest文件格式为text/cache-manifest的。

manifest文件的格式:

CACHE MANIFEST
# 这一句必须存在,而且必须放在头部
# 指明缓存入口
CACHE:
index.html
style.css
images/logo.png
scripts/main.js
# 以下资源必须在线访问
NETWORK:
login.php
# 如果index.php无法访问则用404.html代替
FALLBACK:
/index.php /404.html

其中 CACHE 不是必须存在的,可以直接在 CACHE MANIFEST 行之下直接写需要缓存的文件,在这里指明的文件将被缓存到浏览器本地。在NETWORK之下指明的文件,是强制必须通过网络资源获取的,在FALLBACK下指明的是一种失败的回调方案,比如上述index.php无法访问,那么就发出404.htm请求

这样几步就可以完成对离线存储的支持。接下来要思考的,是如何更新离线存储?

当用户本地再次联网的时候,本地的离线存储资源需要检查是否需要更新,这个更新过程,也是通过manifest的更新来控制的,更新了manifest文件,浏览器会自动的重新下载新的manifest文件并在下一次刷新页面的时候进行资源文件的重新请求(第三次刷新替换本地缓存为最新缓存),而且这个请求是全局性的,也就是所有在manifest缓存列表中的文件都会被请求一次,而不是单独请求某个特定修改过的资源文件,因为manifest是不知道哪个文件被修改过了的。

对于全局更新的担心是不必要的,因为对于没有更新过的资源文件,请求依旧是304响应,只有真正更新过的资源文件才是200.

所以控制离线存储的更新,需要2个步骤,一是更新资源文件,二是更新manifest文件,特别的,更新manifest文件是不需要修改什么特定内容的,只要是这个文件随意一处被修改,那么浏览器就会感知,对于我们的资源文件通常名称是固定的,比如xxx.css,更新内容不会带有文件名更新的情况下,需要更新manifest文件怎么操作呢?一个比较好的方式是更新任意一处# 开头的注释即可,其目的只是告诉浏览器这个manifest文件被更新过。

以上的这些内容,其更新操作都是浏览器自动完成的。同样的,W3C定义了离线存储的API规范:http://www.whatwg.org/specs/web-apps/current-work/#applicationcache

提供了如下API:

// 更新,一般来说更新下载是通过用户代理(如浏览器)自动完成的,但是这个方法适用于一些长期打开的页面,比如邮件系统,可能这个页面是长期打开的,而不会有刷新动作,所以这个就比较适合做自动更新下载
void update();
// 取消
void abort();
// 替换缓存内容 ,对于manifest文件的改变,通常是下一次的刷新才会触发下载更新,第三次刷新才会切换使用新的缓存文件,通过这个方法,可以强制将缓存替换
void swapCache();

提供了如下的事件:

Event handler        Event handler event type
onchecking      checking
onerror                 error
onnoupdate      noupdate
ondownloading       downloading
onprogress      progress
onupdateready       updateready
oncached                cached
onobsolete      obsolete

最后说一个对于manifest比较特别的地方:对于某个文件a.htm,其中有 <html manifest='a.manifest'> ,那么离线存储中,会自动将a.htm加入到列表中,这意味着a.htm的再次刷新将从本地缓存中获取,这样的机制从官方得到的答复是“特别的设计”,而对我们来说,这种强加的特性在后续的开发过程中会有不少问题,比如:

1、如何计算PV UV,由于当前页面被强制加入manifest,那么PV 和UV的统计,成了一个难题,因为请求不再是发送到服务器;

2、对于某个使用manifest的文件,其带有的参数可能是随机性的统计参数,如sid=123sss, sid=234fff ,尤其是比如商品详情的id字段等,这样每个页面都自动加入到manifest中,将会带来很大的存储开销,而且是毫无意义的;

所以伴随而来的,是如何在现有的体系架构下进行数据统计的难题,一个常规的方案是进入离线存储页面后自动发出ajax请求,以告知服务器统计PV UV;

对于第二个问题,可能就比较棘手,但是将GET请求的方式改成POST的方式确实是个解决问题的方案。

[html5]离线存储相关推荐

  1. 神奇的HTML5离线存储(应用程序缓存)

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接前端小尚,谢谢! 前言 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. HTML5引入 ...

  2. html5离线保存需要联网吗,html5 离线存储

    在html页面中引入manifest文件 在服务器添加mime-type text/cache-manifest 如下: sample.appcache内容如下: CACHE MANIFEST #ve ...

  3. HTML5离线存储利与弊

    一.概念 离线存储是HTML5中的一个重要特性,顾名思义就是将一些资源文件保存在本地,这样后续的页面重新加载将使用本地资源文件,这样子使得你的web应用可以在用户离线的状况下进行访问,很显眼有三个好处 ...

  4. html5离线存储图片,HTML5教程 离线存储技术详解

    本篇教程探讨了HTML5教程 离线存储技术详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 随着Web App的发展,越来越多的移动端App使用HTML5 ...

  5. HTML5 离线存储之Web SQL

    HTML5 在离线存储之Web SQL 本篇没有考虑异步,多线程及SQL注入 WebDatabase 规范中说这份规范不再维护了,原因是同质化(几乎实现者都选择了Sqlite), 且不说这些,单看在H ...

  6. html5 application cache 空间限制,HTML5离线存储之Application Cache

    关于html5的离线存储,大致可分为: localStorage, sessionStorage indexedDB web sql application cache 可以在chrome的debug ...

  7. html离线教程,HTML5离线存储整理

    前端html部分 //canvas.html 浏览器离线存储 配置文件 CACHE MANIFEST #v1.0.5 #需要缓存的文件 CACHE: /photos/canvas.png #不需要缓存 ...

  8. html5 将资源存于客户端,HTML5离线应用与客户端存储的实现

    html5几种在客户端存储数据的实例详解 LocalStorage LocalStorage用于持久化的本地存储,存储资料在客户端(client)的浏览器上,除非主动删除数据,否则数 据是永远不会过期 ...

  9. HTML5 Web 客户端五种离线存储方式汇总

    为什么80%的码农都做不了架构师?>>>    最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利 ...

最新文章

  1. vue怎么vw布局好用_vue 实现 rem 布局的 或者 vw 布局的方法
  2. MySQL:Database connections will be migrated官方说明
  3. ​AMD放出超强新算法,旧N卡也能焕发第二春
  4. ModuleNotFoundError: No module named ‘mmcv._ext‘
  5. POJ 3225 线段树+lazy标记
  6. 深度学习中的数据增强
  7. 天极游戏2005年度回顾:电视游戏篇
  8. socket编程:recv()函数详解
  9. 常见植被指数总结(一)
  10. arduino步进电机程序库_Arduino步进电机控制示例
  11. 照片变老html源码,变老教程,利用ps把年轻人变成老年人效果
  12. python随机数种子seed()的讲解
  13. Mysql 事务的隔离性(隔离级别)
  14. photoshop cs之菜单栏功能介绍
  15. 米家接入HomeKit系列四:HomeBridge搭建、配置与接入米家设备
  16. 集合竞价规则及集合竞价的产生条件
  17. 如何用intellij生成全英文javadoc
  18. 量化交易是如何赚钱的?
  19. 建设网络强国,迎接Linux曙光
  20. 518抽奖软件——极简设计、极致体验

热门文章

  1. 医学图像分割评判标准及程序代码
  2. 第12期 《顿开金锁走蛟龙》2月刊
  3. 20行Python代码,轻轻松松获取各路书本,你还在花钱买着看嘛~
  4. mac os平台使用python爬虫自动下载巨潮网络文件
  5. STM32 usb 游戏手柄
  6. 记录一些常用工具类方法
  7. 谷歌adwords—点击诱饵被拒登
  8. 【ESP32_8266_BT篇(二)】Beacon信标广播
  9. 区块链、AI遇上艺术,科技突破艺术的想象空间
  10. 2020年5月份世界计算机编程语言排行榜