TML5提供了一种离线应用缓存机制,使得网页应用可以离线使用,这种机制在移动端浏览器上支持度非常广,所有版本的android和ios浏览器都能很好的支持。我们可以放心的使用该特性来加速移动端页面的访问速度。

开启离线缓存的步骤也非常简单:

(1) 准备缓存清单文件(menifest text/cache-manifest),用于描述页面需要缓存的资源列表

(2) 在需要离线使用的页面中添加menifest属性,用于指定缓存清单文件的路径

让我们首先理解浏览器实现离线缓存的详细步骤,然后探讨使用离线缓存加速移动端网页访问速度的方案。

1. 下载/更新缓存的详细步骤

(1)当浏览器访问一个包含 manifest 特性的文档时,如果应用缓存不存在,浏览器会加载文档,然后获取所有在清单文件中列出的文件,生成应用缓存的第一个版本。

(2)对该文档的后续访问会使浏览器直接从应用缓存(而不是服务器)中加载文档与其他在清单文件中列出的资源。此外,浏览器还会向 window.applicationCache 对象发送一个 checking 事件,在遵循合适的 HTTP 缓存规则前提下,获取清单文件。

(3)如果当前缓存的清单副本是最新的,浏览器将向 applicationCache 对象发送一个 noupdate 事件,到此,更新过程结束。注意,如果你在服务器修改了任何缓存资源,同时也应该修改清单文件,这样浏览器才能知道它需要重新获取资源。

(4)如果清单文件已经改变,文件中列出的所有文件—也包括通过调用 applicationCache.add() 方法添加到缓存中的那些文件—会被获取并放到一个临时缓存中,遵循适当的 HTTP 缓存规则。对于每个加入到临时缓存中的文件,浏览器会向 applicationCache 对象发送一个 progress 事件。如果出现任何错误,浏览器会发送一个 error 事件,并暂停更新。

(5)一旦所有文件都获取成功,它们会自动移送到真正的离线缓存中,并向 applicationCache 对象发送一个 cached 事件。鉴于文档早已经被从缓存加载到浏览器中,所以更新后的文档不会重新渲染,直到页面重新加载(可以手动或通过程序).

以上只是一些详细步骤,具体也有一些值得注意的细节,比如menifest文件中列出的资源url必须和menifest本身使用同样的网络协议,如果menifest文件使用的是http协议,则列表中https协议的文件就会被忽略。总之,每当在使用Application Cache的过程中遇到奇怪的问题时,随时查阅W3C标准文档。

2.离线缓存事件流

浏览器在解析HTML文档的过程中,遇到HTML标记的menifest属性时,就立即在后台开启一个新的进程下载需要离线缓存的资源。在下载离线缓存的过程中,会在ApplicationCache上触发一系列事件。

离线缓存事件流

关于离线缓存中要触发的事件,有一个很有趣的特性。从离线缓存W3C标准中,我们经常看到如下描述:'queue a post-load task to fire a simple event named (checking|noupdate|downloading)',每一个HTML文档都有一个离线缓存事件队列(queue),离线缓存下载过程中的事件都存放在这个队列里,用于在文档的onload事件触发后执行。也就是说,所有的ApplicationCache事件都在html的onload事件触发后才触发。

3.使用离线缓存加速移动端网页开发

上文提到过,Application Cache在移动端支持的很好,几乎所有的android浏览器和ios浏览器都能很好的支持。事实上使用Application Cache加速移动端网页访问速度是行业类普遍采用的优化方案,在包括新浪微博和QQ浏览器等大型产品中都有非常广泛的使用。但是在使用离线缓存时,我们需要留意一些问题。

(1).二次更新的问题

我们知道每次使用离线应用时,在有网络连接的情况下,浏览器都会逐字节的检查menifest文件是否有更新,而当menifest文件有更新时,就会重新下载menifest文件中列出的所有资源,资源下载成功后会触发updateready事件。这时离线应用本身并不会立即更新,而会在下次访问时才更新,这就是我们所说的二次更新。我们在开发web程序时,一般都是前端页面和后端接口同步更新,但是二次更新问题会导致页面更新不受控制,无法和后端接口同步更新,因此要做好后端接口的向前兼容,这迫使我们抛弃传统的web开发思路而采取native开发思路来管理离线应用。我们可以通过检测updateready事件,在新的缓存可用时通知用户更新。

window.addEventListener('load', function(e) {

window.applicationCache.addEventListener('updateready', function(e) {

//缓存更新完毕

if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {

//切换为最新缓存

window.applicationCache.swapCache();

if (confirm('新版本已经更新完成,是否重新加载?')) {

window.location.reload();

}

}

}, false);

}, false);

(2).超出大小限制的问题

Application Cache的W3C标准中并没有对大小限制做出详细的描述。因此浏览器实现起来也是参差不齐,为了最大化的使用离线缓存,我们应该清楚自己业务的目标浏览器的离线缓存大小限制,使用chrome://appcache-internals/可以轻易的管理chrome浏览器的离线缓存。我们可以写一个DEMO,采用二分搜索法,不断的测试浏览器的Application Cache大小限制,直到触发相应的error事件。这个链接可以测试Application Cache的大小限制。通过监听Application的error事件来能够处理超出离线缓存大小限制的情况:

window.applicationCache.addEventListener('error',function(e){

if(e.reason == 'quota'){

//超出离线缓存大小限制

}

});

离线缓存的是一套网页加速方案,超出Application Cache的大小限制后,会对我们的应用有不同的影响,具体表现就是:

首次下载缓存时超出大小,所有资源都不会缓存,而是请求网络,应用功能正常。

更新资源后超出大小,缓存不会更新,应用无法更新。

(3).webview中的问题

在标准的html5浏览器中,我们可以放心的使用Application Cache,并且不需要任何设置。但是在webview中,则可能需要显示的设置,比如android系统的webview默认是不支持Application Cache的,因此需要显示设置:

webView.getSettings().setAppCacheEnabled(true);        //默认是关闭的

webView.getSettings().setAppCacheMaxSize(1024*1024*5); //缓存大小

webView.getSettings().setAppCachePath("路径");          //缓存路径

html5 客户端数据缓存机制,深入理解HTML5离线缓存机制相关推荐

  1. HTML5客户端数据存储机制Web Storage和Web SQL Database

    引言 html5本地存储可以选择两种方式,一种是本地存储,一种是sqlite. 比如开发html5的购物车功能,就可以考虑选择其中之一,进行本地存储与操作. 又或者保存用户登录信息,可以使用local ...

  2. HTML5(3) -- 离线缓存与客户端存储总结

    1.离线检测 可以使用navigator.onLine属性来检测 <!DOCTYPE html> <html lang="en"><head>& ...

  3. serversocket 返回浏览器图片_深入理解浏览器的缓存机制

       戳蓝字「前端技术优选」关注我们哦! 一.前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽 ...

  4. html开启页面离线缓存,HTML5 离线缓存

    离线缓存 applicationCache 第一次加载后将数据缓存,如果没有清除缓存,下一次没有网络也能加载. 使用 1. 使用 manifest 属性,引入 .appcache 文件 每个指定了 m ...

  5. 如何理解Spring对缓存的支持

    1.Spring缓存机制的理解 在Spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: pack ...

  6. mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制

    轻松理解MYSQL MVCC 实现机制 轻松理解MYSQL MVCC 实现机制 #### 1. MVCC简介 ##### 1.1 什么是MVCC MVCC是一种多版本并发控制机制. ##### 1.2 ...

  7. Java类加载机制的理解

    算上大学,尽管接触Java已经有4年时间并对基本的API算得上熟练应用,但是依旧觉得自己对于Java的特性依然是一知半解.要成为优秀的Java开发人员,需要深入了解Java平台的工作方式,其中类加载机 ...

  8. UIScrollView的重用机制的理解[转]

    UIScrollView的重用机制的理解 UIScrollView的重用机制的理解.大家都知道这个UIScrollView.UItableVIew是继承UIScrollView的UItableVIew ...

  9. android h5 离线缓存,H5 应用程序缓存(离线缓存)

    离线缓存这个功能的实现有以下步骤: 1,以nginx做web服务器为例,在mime.types文件中添加一行:text/cache-manifest     manifest,作用是为了让服务器识别该 ...

最新文章

  1. Android开发--多媒体应用开发(一)--MediaPlayer的使用介绍
  2. 域用户绑定计算机批量设置,Windows 2008 AD域账户与计算机名批量绑定
  3. adb刷入第三方recovery_橙狐Recovery一款另类功能丰富的第三方刷机工具支持MIUI OTA...
  4. sql入门基础知识分享
  5. python中文版电脑下载-Python IDLE下载
  6. html tab键自动填充,HTML tabindex — TAB按键操作
  7. 计蒜客:区间整数操作-区间更新-区间和
  8. mysql 8.0.11 Windows安装
  9. java applet的方法_Java Applet的常用方法
  10. 2021中国科学院文献情报中心期刊分区表 计算机
  11. 《一个人工智能的诞生》学习记录
  12. wordpress+000webhost+dot.tk 搭建免费独立博客
  13. oracle表空间不足影响,oracle表空间不足
  14. u盘插电脑上不显示怎么办?数据恢复还有希望吗
  15. 2019年云计算将有哪些变化?云计算未来前景
  16. DevOps之不中断服务的蓝绿部署
  17. REST and RPC
  18. PID算法实现及参数整定图解(附代码)
  19. 大数据可视化热门工具
  20. 关于Oracle表空间不足问题(ora-01144)

热门文章

  1. android 保存联系人,保存android联系后获取联系人ID
  2. Java Lambda表达式的使用
  3. Jsoup从一个文件加载一个文档
  4. Struts 2框架创建的第一个项目
  5. linux系统安装serv u,建立第一个可用的FTP服务器
  6. java中的mod运算_Java中的运算符与控制语句
  7. linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek
  8. java中的.运算符_java中的各种运算符
  9. C++函数模板5分钟入门
  10. Appium+PythonUI自动化测试之uiautomatorviewer和Inspector元素定位