JavaScript基础之缓存机制:HTML5离线缓存

2023-05-16

浏览器的缓存机制,多种多样,离线缓存是其中之一,这也是为了更好的用户体验,性能优化的重要一步。我们来讲讲这个离线缓存。

什么是HTML5离线缓存?

离线缓存(Application Cache)就是web应用缓存方式的一种,可以使得用户在离线状态下,依然能够很完美的浏览网站。

HTML5离线缓存的优势?

  • 离线浏览 - 用户可在应用离线时使用它们。
  • 速度 - 已缓存资源加载得更快。
  • 减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。

HTML5离线缓存应用场景?

h5游戏及一些页面内容不经常会变动、相对较为固定的内容。

HTML5离线缓实现原理?

HTML5的离线存储是基于一个manifest文件(缓存清单文件,后缀为.appcache)的缓存机制(不是存储技术),通过这个文件上的清单解析离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态时,浏览器会通过被离线存储的数据进行页面展示。

HTML5离线缓存主要通过html元素的manifest属性指定一个后缀为manifest的文件,该文件为网页指定哪些文件需要被缓存,哪些不需要缓存,以及获取失败的处理方式等等,该文件主要包含四个部分:

  1. CACHE MANIFEST:标题,位于文件首行,如果没有指定标题,会导致文件解析失败

  2. CACHE:该部分指定需要缓存的文件列表,内容为相对路径,对应html文件中引入的路径,一般来说主文档无需添加,默认缓存。

  3. NETWORK:指定不需要缓存的文件,即永远从服务端获取。

  4. FALLBACK:指定文件获取失败后的处理方式。

HTML5离线缓其工作流程?

  1. 首次访问页面,浏览器加载页面和所需资源
  2. 解析到html元素的manifest文件,加载CACHE以及FALLBACK对应的资源到缓存中
  3. 从现在起你将完全使用浏览器缓存中的文件,即使强制刷新也不会生效。随后浏览器会尝试检查manifest文件是否更新(联机状态才会检查)。若manifest文件更新,浏览器会下载所有资源并更新缓存。
  4. 离线状态下访问已缓存的资源时,浏览器会从缓存中读取,而相应的,访NETWORK中的资源则会对应读取FALLBACK

注意点:只有manifest文件更新,浏览器才会重新下载新资源,意味着仅仅更改资源文件内容是不会触发更新的。这一问题可以通过在manifest中添加版本注释来解决。且更新缓存并不会立即生效,需下次访问生效!可通过浏览器API监听相应的事件,提醒用户刷新浏览器。

HTML5离线缓如何使用?

首先在文档的html标签中设置manifest 属性,引用manifest文件 。

然后配置manifest文件,在manifest文件中编写离线存储的资源。

最后操作window.applicationCache进行需求实现。

此外,必须要在服务器端正确的配置MIME-type。

如何更新缓存?

一旦应用被缓存,它就会保持缓存直到发生下列情况:

  • 用户清空浏览器缓存。
  • manifest 文件被修改。
  • 由程序来更新应用缓存。

所以更新缓存应该是这样的:

oAppCache.addEventListener('updateready', function(){
    oAppCache.swapCache();// 更新本地缓存
    location.reload();    //重新加载页面页面
}, false); 

与传统浏览器缓存区别?

 

  • 离线缓存是针对整个应用,浏览器缓存是单个文件。
  •  离线缓存断网了还是可以打开页面,浏览器缓存不行。
  •  离线缓存可以主动通知浏览器更新资源

注意点:

  • 更新清单中列出的某个文件并不意味着浏览器会重新缓存该资源,清单文件本身必须进行更改。
  • 浏览器对缓存数据的容量限制可能不太一样(某些浏览器设置的限制是每个站点5MB)。
  • 如果manifest文件,或者内部列举的某一个文件不能正常下载,整个更新过程都将失败,浏览器继续全部使用老的缓存。
  • 引用manifest的html必须与manifest文件同源,在同一个域下。FALLBACK中的资源必须和manifest文件同源。
  • 浏览器会自动缓存引用manifest文件的HTML文件,这就导致如果改了HTML内容,也需要更新manifest 文件版本或者由程序来更新应用缓存才能做到更新。

 看一个例子:我们做一个离线缓存的例子,文件夹的目录结构大致是这样的:

第一步:在文档的html标签中设置manifest 属性,引用manifest文件 。 

要将清单与网页关联,需将html 元素的 manifest 属性值设置为manifest文件名 。manifest 属性可指向绝对网址或相对路径,但绝对网址必须与相应的网络应用同源。清单文件可使用任何文件扩展名,但必须以正确的 MIME 类型提供,“.appcache"是官方推荐的文件扩展名。 demo.html的代码应该是这样的:

<!DOCTYPE html>
<html lang="en" manifest="demo.appcache">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
</head>
<body>
    <img src="img.jpg" height="500" width="900" alt="">
    其它内容...
</body>
</html>

第二步:配置manifest文件,在manifest文件中编写离线存储的资源。

manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容)。

manifest 文件可分为三个部分:

  • CACHE  - 在此标题下列出的文件将在首次下载后进行缓存。
  • NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓存。可以使用*,表示除CACHE 外的所有其他资源/文件都需要因特网连接。
  • FALLBACK - 在此标题下列出的文件规定当页面无法访问时的替代页面。 

注意:CACHE MANIFEST写在第一行

demo.appcache的代码应该是这样的:

CACHE MANIFEST
#version 1.0
CACHE:
    img.jpg
NETWORK:
    *
FALLBACK:
    /demo/ /404.html

demo.appcache中的配置意为:demo.html中的img在首次下载后进行缓存;其他文件内容都需要因特网连接;如果无法建立因特网连接,则用 "404.html" 替代 /demo/ 目录中的所有文件。

第三步:操作window.applicationCache进行需求实现。

window.applicationCache 对象是对浏览器的应用缓存的编程访问方式。其 status 属性可用于查看缓存的当前状态。status的值为:

  • 0(UNCACHED) : 无缓存, 即没有与页面相关的应用缓存。
  • 1(IDLE) : 闲置,即应用缓存未得到更新。
  • 2 (CHECKING) : 检查中,即正在下载描述文件并检查更新。
  • 3 (DOWNLOADING) : 下载中,即应用缓存正在下载描述文件中指定的资源。
  • 4 (UPDATEREADY) :更新完成,所有资源都已下载完毕。
  • 5 (IDLE) : 废弃,即应用缓存的描述文件已经不存在了,因此页面无法再访问应用缓存。

浏览器会对下载进度、应用缓存更新和错误状态等情况触发相应事件。 

  • checking :每当应用程序载入的时候,都会检查该清单文件,也总会首先触发“checking”事件。
  • noupdate :如果没有改动,同时应用程序也已经缓存了“noupdate”事件被触发,整个过程结束  。
  • downloading :如果还未缓存应用程序,或者清单文件有改动,那么浏览器会下载并缓存清单中的所有资源 ,触发"downloading"事件,同时意味着下载过程开始。
  • progress:在下载过程中会间断性触发“progress”事件,通常是在每个文件下载完毕的时候  。
  • cached :下载完成并且首次将应用程序下载到缓存中时,浏览器会触发“cached“事件  。
  • updateready :当下载完成并将缓存中的应用程序更新后,浏览器会触发”updaterady”事件。
  • error :如果浏览器处于离线状态,检查清单列表失败,则会触发“error“事件,当一个未缓存的应用程序引用一个不存在的清单文件,也会触发此事件
  • obsolete :如果一个缓存的应用程序引用一个不存在的清单文件,会触发“obsolete“,同时将应用从缓存中移除之后不会从缓存而是通过网络加载资源
     function handleCacheEvent(e) { 
            对应操作...
        } 
        function handleCacheError(e) { 
           alert('Error: Cache failed to update!'); 
        }; 
        //在浏览器为应用缓存查找更新时触发
        oAppCache.addEventListener('checking', handleCacheEvent, false); 
        //在检查描述文件发现文件无变化时触发
        oAppCache.addEventListener('noupdate', handleCacheEvent, false); 
        // 在开始下载应用缓存资源时触发
        oAppCache.addEventListener('downloading', handleCacheEvent, false); 
        //在文件下载应用缓存的过程中持续不断地下载地触发
        oAppCache.addEventListener('progress', handleCacheEvent, false); 
        //在应用缓存完整可用时触发 
        oAppCache.addEventListener('cached', handleCacheEvent, false); 
        //在页面新的应用缓存下载完毕触发
        oAppCache.addEventListener('updateready', function(){
              oAppCache.swapCache();// 更新本地缓存
              location.reload();    //重新加载页面页面
            }, false); 
        //在检查更新或下载资源期间发送错误时触发
        oAppCache.addEventListener('error', handleCacheError, false); 
        //缓存清单不存在时触发
        oAppCache.addEventListener('obsolete', handleCacheEvent, false); 

    第四步:在服务器端正确的配置MIME-type

若遇到如此报错“Application Cache Error event: Manifest fetch failed (404)”,其原因是manifest文件需要正确的配置MIME-type(描述该消息的媒体类型),即“text/cache-manifest”,必须在服务器端进行配置。不同服务器配置方式不一样,举在tomcat服务器配置的例子。

在tomcat服务器中的conf/web.xml中添加:

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

在开发者工具的Network面板下,可以看到img.jpg的Size为(from disk cache),意味着是从缓存中读取的。 

HTML5的离线缓存,没那么难。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript基础之缓存机制:HTML5离线缓存 的相关文章

  • ADI公司器件Pspice模型导出原理图symbol

    用于仿真的Pspice模型 xff0c 需要从ADI公司网站下载模型文件 xff0c 格式为 cir 不同于 mod文件 xff0c cir文件导出的管脚与原理图管脚不匹配 xff0c 刚开始会有点无从下手 我自己也是纠结了很长时间 xff
  • Capture到Allegro按页摆放遇到的小问题以及解决办法

    笔者利用网上的方法 xff0c 一遍遍的尝试 xff0c 一遍遍的不行 xff0c 自己定义的user defined property始终在Allegro中找不出来 作为新手 xff0c 纠结了半天 xff0c 甚是郁闷 xff0c 最终
  • 自定义元件package时,元件的新建属性在原理图中无显示

    在制作元件package封装 xff0c 选择package type 封装为Heterogeneous xff0c 给元件新定义封装 xff0c 却在原理图中显示不了 在调出的编辑属性中没用选项 xff0c 无法更改数值 以至于自动分配标
  • 在Altium Designer中使用AUTOCAD快速制作元件封装

    笔者通过使用AutoCAD处理图形 xff0c 并将其导入Altium Designer中 xff0c 快速绘制元件封装 xff0c 省去算间距的时间 本例中以NPN管 B772 封装为SOT 89为例 xff1a 第一步 xff1a 使用
  • 飞思卡尔中出现NO TBDML Interface found

    1 xff0c 安装BDM的驱动器 xff0c 安装完成之后检查USBDM上的绿灯是否闪烁 xff0c 有时候驱承购安装之后 xff0c 但绿灯不亮 xff1b 2 xff0c 若绿灯不亮 xff0c 而且在电脑属性里面的驱动安装成功之后
  • ubuntu装RTL8111/8168B网卡驱动

    给本本装了ubuntu xff0c 结果被上网的问题搞疯了 表现为开机后有较小概率网卡能正常工作 xff08 这两天来N次能用的时候有2次 xff09 正常的时候网络连接信息显示都和win下一样 不能联网的时候网络信息上全部显示0 0 0
  • LabVIEW如何调用C#Winform

    界面交互并不是Labview的强项 xff0c 使用Labview创建UI时候总会受制于VI有限的控件 xff0c 有限的皮肤和有限的控件事件 而当需要实现UI的多文档的窗口 xff0c 窗口的浮动停靠 xff0c 动画等功能时还需要花很大
  • Intellij IDEA 社区版集成 Database Navigator 数据库管理工具

    Intellij IDEA 社区版集成 DB Navigator数据库管理工具 第一步 xff1a 打开IDEA xff0c Intellij IDEA gt Preferences gt Plugins 第二步 xff1a 在Plugin
  • LabVIEW类方法浏览器-Class Method Browser

    随着LabVIEW的类编程应用增多 xff0c 当打开较多的VI进行编辑时候 xff0c 添加该类对应的VI方法到程序后背板上操作显得繁琐 xff08 需要在Project浏览器或类浏览器或库浏览器中找到该类的方法VI xff0c 然后再拖
  • vue学习笔记—bootstrap+vue用户管理

    vue xff0c 读音view xff0c 简单易用的前端框架 特点如下 xff1a 1 一个mvvm的前端框架 xff0c 内部做好了html中dom对象和后台用js语言定义的变量的双向绑定 2 中国人尤雨溪维护的个人项目 xff0c
  • Mysql查询创建和导入操作

    如何安装 xff1a https www cnblogs com bigbrotherer p 7241845 html 登录 xff1a mysql uroot p 输入密码 xff1a xxxx 显示当前数据库 xff1a show d
  • Typescript日期Date如何做格式化字符串

    使用一个date fns format的库 安装npm i date fns save import format from 39 date fns format 39 const newdate 61 new Date console l
  • C#匿名类型和动态解析减少定义传输类模板

    C 作为强类型语言 xff0c 在序列化和反序列化 xff08 json xff09 场景中对字符串解析常常需要定义强类型模板 xff0c 造成编码上的繁琐 其实可以使用匿名类型和动态解析减少json序列化时候的数据模板定义 xff1b s
  • Sourcetree 克隆代码,将git@打头路径,写入URL显示无效路径的处理

    情景 xff1a 刚安装完sourceTree 点击 43 xff0c 进行Clone项目 xff0c 输入 git 64 195 178 10 181 datas sys git路径 xff0c 提示 无效路径 信息 处理方法 xff1a
  • docker安装samba,网络硬盘

    安装好docker之后可以安装 dperson samba 使用下面的语句 xff0c 创建默认的用户 docker run it name samba p 139 139 p 445 445 v home ftpserver smb mo
  • Linux下执行可执行文件提示:No such file or directory的解决方法

    最近在Linux下安装交叉编译链工具 xff0c 解压完成后执行却提示 xff1a No such file or directory 查了一下发现我是64位的Ubuntu系统但是执行的是32位程序 xff0c 缺少32位lib库所以无法执
  • C语言typeof详解

    typeof 是 GNU C 标准里特有的扩展 xff0c 标准的 ISO C 并没有这个关键字 xff0c 所以在编译的时候不能加任何 ISO 的 C 标准选项 xff0c 否则会报错 使用时加入 std 61 gnu90 即 GNU 的
  • S5PV210-uboot解析(二)-start.S解析

    start S解析 首先是头文件包含 include lt config h gt include lt version h gt if defined CONFIG ENABLE MMU include lt asm proc domai
  • MPV播放器快捷键

    MPV播放器快捷键 Location of user defined bindings config mpv input conf Lines starting with are comments Use SHARP to assign t
  • u-boot学习总结

    1 移植前准备 Ubuntu 配置ssh tftp nfs 烧写uboot前格式化SD卡 1 Unsupported SD reader 2 dev sdb is NOT identified Vmware出问题在控制面板 gt 程序和功能

随机推荐

  • setjmp和longjmp

    setjmp 和 longjmp 在C标准库 lt setjmp h gt 中 setjmp jmp buf j 必须首先被调用 它表示 使用变量 j 记录现在的位置 函数返回 0 longjmp jmp buf j int i 可以接着被
  • GNU C typeof

    typeof 是 GNU C 标准里特有的扩展 xff0c 标准的 ISO C 并没有这个关键字 xff0c 所以在编译的时候不能加任何 ISO 的 C 标准选项 xff0c 否则会报错 使用时加入 std 61 gnu90 即 GNU 的
  • linux内核常用宏container_of

    linux内核常用宏 container of 定义如下 xff1a linux 2 6 38 8 include linux kernel h container of cast a member of a structure out t
  • 【c语言】对结构体数组按照某项规则进行排序

    这是基于qsort 函数进行的简单排序 xff08 附带其他类型的数组使用qsort 进行的排序 xff09 目录 一 qsort 函数 二 compare 函数 1 结构体数组 1 xff09 升序实现 2 xff09 降序实现 2 整型
  • iOS TextFiled、TextView 关于键盘的收起以及处理键盘遮挡

    在iOS开发中 xff0c UITextFiled和UITextView是很常见的两个控件 xff0c 当我们设置好这两个控件后 xff0c 点击文字输入区域 xff0c 系统会自动弹出键盘 xff0c 但是如何收起键盘 点击哪里收起键盘
  • 【2023最新版】超详细Kali安装保姆级教程,Kali Linux环境配置和使用指南,看完这一篇就够了

    Kali 安装教程 第一步 xff1a 新建一台Debian虚拟机 1 xff09 选择客户机操作系统 2 xff09 设置虚拟机名称 存储位置 3 xff09 设置处理器 1颗1核心 设置内存2048MB 设置网络类型NAT 4 xff0
  • Mac Time Machine恢复系统 Time Machine还原系统教程

    Mac下的 Time Machine是一个OS X自带的非常强大的功能 xff0c 之前PC6小编有教大家如何设置 Time Machine的备份盘 xff0c 当我们的Mac系统崩溃时 xff0c 可以使用Time Machine来恢复系
  • selenium常用API介绍

    selenium常用API介绍 文本的清空与提交 br span class token punctuation span find element by id span class token punctuation span span
  • Beego打包部署到Linux

    Beego打包部署到Linux 打包 打开Terminal 定位到工程的 main go 文件夹目录 使用命令 bee pack be GOOS 61 linux 进行打包 打包成Windows 命令 bee pack be GOOS 61
  • MPV快捷键

    mpv keybindings Location of user defined bindings config mpv input conf Lines starting with are comments Use SHARP to as
  • RedHat 服务器离线安装不匹配软件引起的故障及修复

    转自 xff1a 学习日记 https www learndiary com 2022 02 redhat wrong installed package 这里简述一起在 RedHat 6 5 服务器上错误强制离线安装 CentOS 7 x
  • rancher rke环境清理

    如果删除容器失败情况下 xff0c 可以先停止docker再进行清除 bin bash 杀死所有正在运行的容器 docker kill docker ps a q 删除所有容器 docker rm f docker ps qa 删除所有容器
  • 硬盘安装Debian7(Wheezy)以及初级配置

    引子 xff1a 记得本科二年级的时候开始在Redhat Enterprise 5 下折腾嵌入式 xff0c 然后在开源社区的影响下迷恋fedora和它的激进气质 然后的然后 xff0c 逐渐觉得数学和算法才是王道 xff0c 准备在一个机
  • CMake 的常用命令

    目录 0 CMake常用的命令或函数 xff1a 1 定义项目 project 2 多个目录 add subdirectory 3 常用命令 add executable add library 4 常用命令 改变最终目标文件输出位置 5
  • ❤️geoserver集群部署❤️(geoserver、jms集群部署 + redis、tomcat实现session + nginx负载均衡)

    由于条件原因 xff0c 我是在同一台服务器上利用了三个tomcat配置geoserver集群 xff08 多台服务器配置基本上差不多 xff09 为了后面好区分将三个tomcat分别命名为tomcat geo1 xff0c tomcat
  • ISBN从10位升为13位,执行日期为2007年1月1日

    国际标准化组织 ISO 日前发布了新版的国际标准图书编号标准 ISBN 最新发布的ISO 2108 信息和文件 国际标准图书编号 xff0c 规定新的13位数的国际标准图书编号的执行日期为2007年1月1日 国际标准图书编号 标准对全球的图
  • antd 时间类组件的国际化 locale 设置不生效 解决方案汇总

    antd 时间类组件的国际化 locale 设置不生效 xff0c 踩坑之路和解决办法 问题 如图所示 xff0c antd 时间类组件中英文混合显示 xff1a 初始配置代码如下 xff1a span class token keywor
  • 【CCF 201809-3】元素选择器

    思路 处理每一行 xff1a 每一行都处理为一个结构体 xff0c 包含3个属性 xff1a 级别 xff08 rank xff09 元素名称 xff08 element xff09 id名称 级别 61 点的数量 2 元素名称 amp i
  • 无需上架,接入穿山甲广告和广点通广告 sdk

    我们都知道广告是商业流量变现最重要的方式之一 xff0c 所以基本所有的游戏或者app都会接入广告sdk 而我们都知道穿山甲广告sdk和广点通广告sdk是国内收益相对比较高的 xff0c 但是想接入穿山甲广告sdk 你的游戏或者app必须上
  • JavaScript基础之缓存机制:HTML5离线缓存

    浏览器的缓存机制 xff0c 多种多样 xff0c 离线缓存是其中之一 xff0c 这也是为了更好的用户体验 xff0c 性能优化的重要一步 我们来讲讲这个离线缓存 什么是HTML5离线缓存 xff1f 离线缓存 xff08 Applica