离线缓存manifest用于前端优化

2022-09-20  本文已影响0人  涅槃快乐是金

离线缓存

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

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

离线缓存的特性

1、对象

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

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

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

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

3、事件

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

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文件实际上只包含三个部分:需要缓存的、不能缓存的,和无网时的代替文件:

离线缓存不只是前端的事:它需要服务器的支持!
项目中如果使用的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离线缓存目前有两种比较常用的方法:

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();
            }
        }
    })
})
上一篇 下一篇

猜你喜欢

热点阅读