前端性能优化之“离线缓存manifest”

前端性能优化之“离线缓存manifest”在本专栏的这一篇文章中 给各位引出了一个 不同寻常的 性能体验优化方式 离线缓存 并介绍了它的简单用法 本文来详细说说 啥是离线缓存离线缓存又叫 ApplicationC 是从浏览器缓存中分出来一块缓存区 用来存储一定的资源 它是 HTML5 的新特性 你可以使用它将构成 web 应用程序的资源 如 HTML css JavaScript 图片等存储到本地缓存中 这样不仅可以使以后进来时更加方便 还可以在离线状态时 无差别 继续使用 web 应用 离线缓存和普通的浏览器网页缓存有明显的区别

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


啥是离线缓存

离线缓存又叫“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/图片736.jpg /img/Cache_46072b3594a9a6b5..jpg /img/.png /img/logo.png /js/ss1.js NETWORK: * # 这里星号表示除缓存文件外的全部资源 FALLBACK: / /1.html

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

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

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

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


离线缓存的更新

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

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

  1. 修改manifest文件

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

  1. 使用applicationCache对象的update()事件更新资源
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(); } } }) }) 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216952.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午10:40
下一篇 2026年3月18日 上午10:41


相关推荐

  • 四大内置核心函数式接口

    四大内置核心函数式接口

    2021年11月12日
    50
  • kafka零拷贝原理_通俗易解中的解是什么意思

    kafka零拷贝原理_通俗易解中的解是什么意思Kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不是kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝。下面我就画图讲解零拷贝,如果对你有帮助请点个赞支持。传统IOkafka的数据是要落入磁盘的,那么必然牵扯到磁盘的IO,传统磁盘IO又叫缓存IO,效率是很低的,那么为什么效率低呢?我们先来粗略讲讲操作系统的知识。用户空间以及内核空间的概念:我们知道现在操作系统都是采用虚拟存储器。那么对32位操作系统而言,它的寻址空间(虚拟存储空间)

    2026年2月6日
    2
  • md转pdf

    md转pdf2019 独角兽企业重金招聘 Python 工程师标准 gt gt gt

    2026年3月19日
    2
  • Scrapy 框架架构

    Scrapy 框架架构Scrapy 框架架构

    2026年3月26日
    1
  • Advanced System Care官方下载(附激活码)

    Advanced System Care官方下载(附激活码)iobit公司出品的一款系统辅助工具AdvancedSystemCare,它通过对系统全方位的诊断,找到系统性能的瓶颈所在,并将测试结果显示出来。针对系统的瓶颈对其优化,提高效率发挥最大的性能,通过优化后系统性能和网络速度都会有明显提升包含基本功能,注册表清理,垃圾文件清理等。现今系统清理,系统优化工具满天飞,可是很少有对系统全方位的诊断,找到系统性能的瓶颈所在,然后有针对性地进行修改、优化…

    2022年10月20日
    4
  • 腾讯元宝AI在线登录入口 腾讯元宝网页版高效入口

    腾讯元宝AI在线登录入口 腾讯元宝网页版高效入口

    2026年3月14日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号