18

前端性能优化之“离线缓存manifest” 动手实践指导

 3 years ago
source link: https://blog.csdn.net/qq_43624878/article/details/109399149
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

啥是离线缓存

离线缓存又叫“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提供了特定的事件和回调特性:

swapCache()

离线缓存的实现(应用)

它是通过配置一个配置文件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.js

NETWORK:
*   # 这里星号表示除缓存文件外的全部资源

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();
			}
		}
	})
})

Recommend

  • 49
    • zhuanlan.zhihu.com 6 years ago
    • Cache

    Tree-Shaking性能优化实践 - 原理篇

    Tree-Shaking性能优化实践 - 原理篇一. 什么是Tree-shaking先来看一下Tree-shaking原始的本意

  • 30
    • studygolang.com 3 years ago
    • Cache

    使用Go进行io_uring的动手实践

    在Linux中,系统调用(syscalls)是一切的核心。 它们是应用程序与内核交互的主要接口。 因此,至关重要的是它们要快。 尤其在后Spectre / Meltdown后世界中,这一点尤为重要。 如果觉得看完文章有所收获的话,可以关注我一下哦

  • 13
    • 微信 mp.weixin.qq.com 3 years ago
    • Cache

    自己动手打造性能监控平台

    在做性能测试的时候,你是如何监控被测试系统的硬件资源的,如果是云平台,那么一般提供的有可视化的监控信息,如果是本地服务,只能通过系统命令(如ps、top、lsof等)查看。 我们可以自己打造一个可视化的系统系统资源监控平台...

  • 7

    性能是每个前端工程师都应该关注的话题,通用的优化手段已有许多文章和实践,就不再赘述,本篇以百度 App 个人主页为例,聊聊针对业务特点进行的一些性能优化实践。适用于:传统意义的优化手段能用的都用了:打包拆包,缩减体积和 HTTP 请求数、...

  • 5

    V2EX  ›  程序员 大型老旧的前端项目,如何动手优化?   firhome · 17 小时 52 分钟前 · 164...

  • 4
    • www.geekjc.com 2 years ago
    • Cache

    前端性能优化最佳实践

    前端性能优化最佳实践时间: 02/03/2020作者: ll浏览量: 663本文主要考量客户端性能、服务器端和网络性能,内容框架来自 Yahoo Developer Network,包含 7 个类别共 35 条前端性能优化最佳实践,在此基础上...

  • 6

    作者:李振,腾讯云前端性能监控负责人 对于前端来说,最重要的是体验,而在前端体验中,最为核心的就是性能。 腾讯云前端性能监控 RUM...

  • 4
    • developer.51cto.com 2 years ago
    • Cache

    京东PLUS前端H5性能优化实践

    京东PLUS前端H5性能优化实践-51CTO.COM 京东PLUS前端H5性能优化实践 作者:PLUS前端团队 2022-06-27 09:48:15 随着移动互联网的发展,用户对产品的使用体验要求越来越高。H5 作为业务...

  • 1

    背景 字节各类业务拥有众多用户群,作为字节前端性能监控 SDK,自身若存在性能问题,则会影响到数以亿计的真实用户的体验。所以此类 SDK 自身的性能在设计之初,就必须达到一个非常极致的水准。 与此同时,随着业务不断迭代,功能...

  • 2

    字节各类业务拥有众多用户群,作为字节前端性能监控 SDK,自身若存在性能问题,则会影响到数以亿计的真实用户的体验,所以此类 SDK 自身的性能在设计之初,就必须达到一个非常极致的水准。 与此同时,随着业务不断迭代,功能变得越来越多,对监控的需求也会变...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK