在 本专栏 的 这一篇文章 中,给各位引出了一个“不同寻常的”性能体验优化方式 —— 离线缓存,并介绍了它的简单用法,本文来详细说说!


啥是离线缓存

离线缓存又叫“ApplicationCache”,是从浏览器缓存中分出来一块缓存区,用来存储一定的资源。它是HTML5的新特性。你可以使用它将构成web应用程序的资源,如HTML、css、JavaScript、图片等存储到本地缓存中,这样不仅可以使以后进来时更加方便,还可以在离线状态时“无差别”继续使用web应用!

离线缓存和普通的浏览器网页缓存有明显的区别:

  1. 缓存目标:任何网页都会自动强制缓存当前网页(无刷新情况下的上一个页面),而离线缓存针对整个web应用程序,且只保存你明确指定的资源。
  2. 离线缓存的安全性高于浏览器网页缓存!
  3. 离线缓存在无网络状态下几乎也能正常运行!

离线缓存的一些特性

1、对象

HTML5离线缓存有一个专门的对象(JavaScript实现),也就是俗称的ApplicationCache API。我们可以通过控制它来动态控制缓存 —— 它可以触发一系列与缓存状态有关的事件。而且它和缓存宿主对象的关系是一一对应的。

比较离谱的是:离线缓存和H5一样,不被IE9及以下的浏览器支持。我们可以用以下代码检测当前浏览器是否支持离线缓存:

if(window.applicationCache){console.log("浏览器支持离线缓存")
}else{console.log("浏览器不支持离线缓存")
}

2、属性

applicationCache对象是有status属性的,它可以返回当前applicationCache的状态 —— 这是很有用的,本文将介绍另一种更新缓存的方法,就和此有关:

  1. 0:未缓存(UNCACHED)
  2. 1:空闲(IDLE),应用缓存已是最新,并且没有被标记为“废弃”
  3. 2:检查中(CHECKING),此时applicationCache对象已经和一个应用缓存关联了
  4. 3:下载中(DOWNLOADING)
  5. 4:更新准备就绪(UPDATEREADY),此状态表示缓存不是最新的,而且可以更新
  6. 5:“废弃”(OBSOLETE),该缓存已过期

其中“ IDLE ”是缓存中最典型的状态,它说明当前应用程序的所有资源都已经缓存,而且不需要更新。

3、事件

对于不同的状态,ApplicationCache API提供了特定的事件和回调特性:

  1. checking:当检查更新,或者第一次下载manifest文件时,首先会被触发
  2. noupdate:当检查到manifest文件不需要更新时触发
  3. downloading:第一次下载或更新manifest文件时触发,而且全程只触发一次!
  4. progress:在manifest文件下载过程中可被周期性触发
  5. cached:manifest文件下载完毕而且缓存成功后触发
  6. updateready:当manifest文件下载完毕后触发,此后可通过重新加载页面读取缓存文件或通过swapCache()方法更新缓存文件
  7. obsolete:请求资源出错(如访问manifest缓存文件404或410)时触发

离线缓存的实现(应用)

它是通过配置一个配置文件manifest进行的,文首链接文章中已经说明:

CACHE MANIFEST
# 2020-10-28 v1.1.0
1.html
/css/ss1.css
/img/cur.png
/img/loading.gif
/img/loading2.gif
/img/QQ图片20190521233736.jpg
/img/Cache_46072b3594a9a6b5..jpg
/img/牌.png
/img/logo.png
/js/ss1.jsNETWORK:
*   # 这里星号表示除缓存文件外的全部资源FALLBACK:
/ /1.html

它实际上是一个文本文件,列出了所有需要执行操作的资源!第一行必须以CACHE MANIFEST开头

manifest文件实际上只包含三个部分:需要缓存的、不能缓存的,和无网时的代替文件:

  1. CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存(到本地)(:以后进来都不请求了直接拿
  2. NETWORK - 在此标题下列出的文件需要每次与服务器连接请求资源,且不会被缓存
  3. FALLBACK - 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面),这里代码中的意思是“当无法建立因特网连接时,用 “1.html” 替代 / (根)目录下的所有文件”

离线缓存不只是前端的事:它需要服务器的支持!
笔者团队在项目中使用的Tomcat服务器,需要更改web.xml文件(conf目录下):
注意: 代码中extension的值必须和你自己写的manifest文件的后缀名一致!

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

注意:
如果manifest文件以及manifest文件所列出的资源无法加载,整个缓存的更新过程则无法进行,浏览器会使用最后一次成功的缓存。
CACHE、NETWORK、FALLBACK在manifest中的顺序是任意的,每一部分可以出现一次或多次。
CACHE是必需的,NETWORK和FALLBACK是可选的。

如何引用?

在web应用程序中每个需要缓存的页面都需要包含manifest文件的引用:

<html manifest="cache.appcache"><!-- manifest属性值为manifest文件路径+名称 -->

这里的路径可以使用绝对URL(http/https开头),也可以使用相对路径!


离线缓存的更新

有一件很可怕的事:服务器资源更新了但是用户看不到!这是由于设置了离线缓存但是缓存文件资源没有更新导致的!

更新HTML5离线缓存目前有两种比较常用的方法:

  1. 修改manifest文件

在上面代码中,你会发现第二行第一个字符是“#”:这表示注释。但是它也可以满足其他用途 —— 修改日期和版本号的注释行是一种使浏览器重新缓存资源文件的方法
(时间和版本号注释行通常在manifest文件的第二行)

  1. 使用applicationCache对象的update()事件更新资源

比较疑惑的是:这种方式必须也要更新manifest文件!
使用这种方式触发时需要先调用事件:applicationCache.update() ,这将使浏览器尝试更新用户的缓存。然后判断当 applicationCache.status 处于 UPDATEREADY 状态(前面说过的“更新准备就绪”)时,调用 applicationCache.swapCache() 即可将原缓存换成新缓存:

var appCache=window.applicationCache;
appCache.update();
//...
if(appCache.status==window.applicationCache.UPDATEREADY){appCache.swapCache();
}

上面这段代码是通过按钮点击来手动执行资源更新检测 —— 这也很常见!

当然,上面这段代码可以放到head中每次执行:

window.addEventListener("load",function(e){window.applicationCache.addEventListener("updateready",function(e){if(window.applicationCache.status==window.applicationCache.READY){window.applicationCache.swapCache();if(confirm("资源有更新,是否重新装载?")){window.location.reload();}}})
})

前端性能优化之“离线缓存manifest”相关推荐

  1. 前端性能优化之http缓存

    前不久,公司前端开会,领导抽问了4个问题,前3个简单大家都答起来了,第4个问题关于缓存的这方面我只是了解,结果刚好问到我了(会的不问,专门挑我不熟悉的问,我这运气真是没话说),20多个前端看着我,答得 ...

  2. speeding up your web site 前端性能优化规则(一)

    接上一篇:speeding up your web site 前端性能优化 -------------------------------------------------------------- ...

  3. 前端性能优化 - 设置缓存

    前言 前端性能优化系列,记录在优化过程中的问题,可能有十万个为什么,待以后懂了再记录,毕竟太菜啥都不懂. 而且部分优化(设置缓存.gzip压缩.使用CDN加速服务)非开发人员来控制,而是网站服务器管理 ...

  4. 使用缓存实现前端性能优化——浏览器缓存机制、缓存分类

    前端性能优化探讨及浏览器缓存机制 一.缓存如何实现前端性能优化 1.什么是浏览器缓存 2.js请求,一般会有哪些地方有缓存处理? 3.静态资源 ① 什么是静态资源 ② 静态资源的缓存策略 二.缓存的类 ...

  5. Web前端性能优化,应该怎么做?

    本文将分享一些前端性能优化的常用手段,包括减少请求次数.减小资源大小.各种缓存.预处理和长连接机制,以及代码方面的性能优化等方面. base64:尤其是在移动端,小图标可以base64(webpack ...

  6. 前端性能优化常用代码

    前端性能优化常用代码 为什么要做性能优化?性能优化到底有多重要? 网站的性能优化对于用户的留存率.转化率有很大的影响,所以对于前端开发来说性能优化能力也是重要的考察点. 性能优化的点非常的多,有的小伙 ...

  7. 暴肝!7000 字的前端性能优化总结 | 干货建议收藏

    为什么要做性能优化?性能优化到底有多重要? 网站的性能优化对于用户的留存率.转化率有很大的影响,所以对于前端开发来说性能优化能力也是重要的考察点. 性能优化的点非常的多,有的小伙伴觉得记起来非常的麻烦 ...

  8. 讲武德,你们要的7000字前端性能优化干货 ,来了

    为什么要做性能优化?性能优化到底有多重要? 网站的性能优化对于用户的留存率.转化率有很大的影响,所以对于前端开发来说性能优化能力也是重要的考察点. 性能优化的点非常的多,有的小伙伴觉得记起来非常的麻烦 ...

  9. 前端性能优化及其度量方法

    前端性能优化及其度量方法 前端页面性能对用户留存.用户直观体验有着重要影响,当页面加载时间超过 2 秒后,加载时间每增加一秒,就会有大量的用户流失,所以做好页面性能优化,对网站来说是一个非常重要的步骤 ...

最新文章

  1. QQ2012 Under Ubuntu
  2. Specification使用notin
  3. html中content属性,CSS3的content属性用法详解
  4. Windows10下通过anaconda安装tensorflow
  5. Netty ByteBuf(图解之 2)| 秒懂
  6. 152. 乘积最大子数组
  7. DSP之GPIO(转)
  8. 前端学习(3001):vue+element今日头条管理--项目初始化总结
  9. 在C#中运用 SQLite
  10. angular input_快速地上手Angular组件开发
  11. WayOs 聊天软件号码登记器,让找人变得更简单
  12. 解决方案-Visual Studio生成库(DLLLIB)以及如何调用
  13. 挑战malloc极限,看看你的系统有多大的内存分配能力
  14. Linux C++11——多线程类thread
  15. tomcat设置编码
  16. 软件安全测试之应用安全测试
  17. Java多线程编程实战指南(核心篇)读书笔记(二)
  18. 高中数学如何考120以上高中数学如何快速提高
  19. Python 练习实例21 猴子吃桃问题
  20. Spring Boot 打包分离依赖 JAR 和配置文件

热门文章

  1. VUE的两种跳转push和replace对比区别
  2. maplesim matlab,MapleSim 2020
  3. Exynos_4412——轮询与中断
  4. 【滴水逆向笔记】C语言结构体
  5. 教你一个快速查找批量文件的好方法
  6. LaTex笔记:参考文献、常用公式符号、图表、注释
  7. python学习 - 标准库概览
  8. 基于区块链的学生课程成绩查询系统
  9. 单元测试框架NUnit 之 Attributes特性(一)
  10. 创建gushi.txt文件,并写入一首古诗。