利用服务工作线程serviceWorker缓存静态文件css,html,js,图片等的方法,以及更新和删除及版本控制

news2024/11/17 7:30:44

Service Worker 是一种运行在浏览器背后的独立线程,可以用来处理推送通知、后台同步、缓存等任务。以下是使用 Service Worker 来缓存图片的一个基本示例:
1、注册 Service Worker: 首先,你需要在你的 JavaScript 文件中注册 Service Worker。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
        <title>测试serviceworker添加缓存,并删除缓存,并更新缓存</title>
        <link rel="stylesheet" href="serviceworker2.css" type="text/css">
        
    </head>
    <body>
        <div id="container">
            <div class="imgTitle">图片展示</div>
            <div class="imgContainer"><img src="images/123.jpg" alt="Img 1"></div>
        </div>
        <script type="text/javascript">
            window.addEventListener('load',()=>{
                if('serviceWorker' in navigator){
                // 由于 127.0.0.1:8000 是所有测试 Demo 的 host,如果你是phpstudy那么要用localhost才行
        		// 为了防止作用域污染,将安装前注销所有已生效的 Service Worker
        		//这里只是查看注册了那些版本的service Worker
                    navigator.serviceWorker.getRegistrations()
                    .then(regs=>{
                        for(let reg of regs)
                        {
                        	//查看注册的service worker
                            console.log(reg);
                            //如果你要删除所有已经注册的生效的service worker,可以用下面的
                            //reg.unregister();
                        }
                        //注册新的service worker
                        navigator.serviceWorker.register('serviceWorker.js')
                        .then(registration=>console.log(registration))
                        .catch(error=>console.log);
                    })
                }
            })
        </script>
    </body>
</html>

2、编写 Service Worker 脚本 (serviceWorker.js): 在 Service Worker 中,你可以监听 install 事件来缓存资源,以及 fetch 事件来拦截网络请求并提供缓存的资源。

//这里是版本控制,以后在cache.addAll中的静态文件有修改,我们修改完后,只需要改CACHE_NAME的值即可,比如cache_v5改成cache_v6
const CACHE_NAME='cache_v5';
//install事件监控,因为返回的都是期约异步,所以都用异步函数,在这里我们添加缓存
self.addEventListener('install',async event=>{
    console.log('install',event);
    //开启一个缓存,得到一个缓存对象
    const cache=await caches.open(CACHE_NAME);
    //添加需要缓存的文件
    await cache.addAll([
        '/images/123.jpg',
        '/serviceWorker.html',
        '/serviceworker2.css'
    ]);
    //这段话是立即执行, 会让 service worker 跳过等待,直接进入到 activate 状态
    await self.skipWaiting();
});

//监控激活activate事件,在这里我们可以删除旧的缓存
self.addEventListener('activate',async event=>{
    console.log('activate',event);
    
    //获取所有的缓存版本,就是我们上面的CACNE_NAME,如果你有其它的缓存版本都会在keys中
    const keys=await caches.keys();
    //循环出每个版本的缓存键
    keys.forEach(key=>{
    	//如果键不等于cache_v5,都删除掉,就是其它版本cache_v4等或你自定义mycachev1/2/3等版本
        if(key!==CACHE_NAME){
            return caches.delete(key)
        }
    })
    //  self.clients.claim() 表示 service worker 激活后,立即获得执行权
    await self.clients.claim();
    
})

//监控fetch事件,会拦截所有的请求: 走网络或缓存
self.addEventListener('fetch',event=>{
    console.log('fetch',event);
    const req=event.request;
   //返回一个新创建的URL对象
    const url=new URL(req.url);
    //只缓存同源的内容,当然你也可以不要这段,就可以缓存CDN或其它源的js文件
    if(url.origin !==self.origin)
    {
        return;
    }
	//这里的api只是判断走网络还是走缓存;如果没有api文件夹也不影响
	//接口请求优先走网络,静态资源优先走缓存
    if(req.url.includes('/api'))
    {
        event.respondWith(networkFirst(req));
    }else
    {
        event.respondWith(cacheFirst(req));
    }
})

//走网络资源
async function networkFirst(req)
{
    const cache=await caches.open(CACHE_NAME);
    try{
        const fresh=await fetch(req);
      //此处一定要添加 clone,因为它只是一个流,请求只有一次,如果是第一次需要先克隆里你请求键request里面,下次访问就是缓存response
        cache.put(req,fresh.clone());
        return fresh;
    }catch(e)
    {
        const cached=await cache.match(req);
        return cached;
    }
}
//走静态资源
async function cacheFirst(req)
{
    const cache=await caches.open(CACHE_NAME);
    const cached=await cache.match(req);
    if(cached)
        {
            return cached;
        }else{
            const fresh=await fetch(req);
            cache.put(req,fresh.clone());
            return fresh;
        }
}

至于serviceworker2.css和图片你自己写和选图,要查看缓存,chrome浏览器按F12,–应用–>缓存空间;即可看到三个缓存文件

更新缓存策略: 当你的网站更新了图片资源后,你需要更新 Service Worker 的缓存策略。在上面的代码中,缓存的名称是 ‘cache-v5’。当你需要更新缓存时,只需更改这个名称(例如,改为 ‘cache-v6’);

然后重新部署 Service Worker。新的 Service Worker 将会注册,并且 install 事件将会使用新的缓存名称来缓存资源——>这句话的意思就是让你关闭测试中的页面,重新再打开,不然,看不到修改后的页面,因为是缓存页面;

请注意,Service Worker 的注册和脚本需要在 HTTPS 环境下运行,因为 Service Worker 需要访问缓存等敏感功能。此外,Service Worker 的调试和测试可能需要在本地服务器上进行,因为浏览器对 Service Worker 的限制较多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

新人如何做好项目管理?|京东零售技术人成长

“管理是一种实践&#xff0c;其本质不在于知&#xff0c;而在于行”——彼得德鲁克 作为一名初入职场的校招生&#xff0c;你是否有过这样的疑问&#xff1a;项目经理究竟扮演着怎样的角色&#xff1f;是老板的传声筒&#xff0c;单纯地传达上级的指令&#xff1f;还是团队的…

MySQL社区版的启动与连接

1.启动&#xff1a; 注意&#xff1a;MySQL是默认开机自启的 方式一&#xff1a; 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称&#xff0c;然后鼠标右键点击启动 方式二&#xff1a; 1.在开始选项中搜索“cmd”命令提示符&#xff0c;使用管理员身份运行 …

FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,

也就是将摄像头采集到的YUV 的数据换成 AVFrame&#xff0c;然后再次转成 AVPacket&#xff0c;那么这AVPakcet数据要怎么办呢&#xff1f;分为三种情况&#xff1a; 一种是将AVPacket存储成h264文件&#xff0c;由于h264编码器在将avframe变成avpacket的时候就是按照h264的格…

TCP(下):三次握手四次挥手 动态控制

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! TCP(上)&#xff1a;成熟可靠的传输层协议-CSDN博客 &#x1f95d;在上篇博客中&#xff0c;我们针对TCP的特性,报文结构,连接过程以及相对于其他协议的区别进行了探讨&#xff0c;提供了初步的理解和概览。本…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

菲涅耳全息图

菲涅耳全息图&#xff1a;记录介质在物光波场的菲涅耳衍射区(物体到记录介质表面的距离在菲涅耳衍射区内)。 一、点源全息图的记录和再现 1.1 记录 设物光波和参考光波是从点源O(xo, yo, zo)和点源 R(xr, yr, zr)发出的球面波, 波长为λ1, 全息底片位于z0 的平面上, 与两个点源…

Pygame坦克大战游戏开发实验报告

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

微搭低代码入门05循环

目录 1 for 循环2 while 循环3 do...while 循环4 break 语句5 循环展示组件总结 在编程中&#xff0c;循环是一种非常强大的控制结构&#xff0c;它允许我们重复执行一段代码直到满足某个条件为止。在微搭中&#xff0c;我们一般用循环来处理我们数据库返回的结果。 在微搭中&a…

C++:基于红黑树封装map和set

目录 红黑树的修改 红黑树节点 红黑树结构 红黑树的迭代器 红黑树Insert函数 红黑树的默认成员函数 修改后完整的红黑树 set、map的模拟实现 set map 测试封装的set和map 红黑树的修改 想要用红黑树封装map和set&#xff0c;需要对之前实现的key-value红黑树进行修…

【深度学习基础 | 预备知识】数据预处理

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

前端面试笔试(四)

目录 一、数据结构算法等综合篇 1.线性探查法解决哈希冲突 2.请求分页系统中文件区和对换区 3.RADIUS认证协议&#xff0c;运行在哪个网络协议上 二、代码输出篇 1.res[1,2,100].map(parseInt) 如果我们想要输出为[1,2,100]&#xff0c;可以&#xff1a; 还可以换map里…

从零开始学习 sg200x 多核开发之 milkv-duo256 编译运行 sophpi

sophpi 是 算能官方针对 sg200x 系列的 SDK 仓库 https://github.com/sophgo/sophpi &#xff0c;支持 cv180x、cv81x、sg200x 系列的芯片。 SG2002 简介 SG2002 是面向边缘智能监控 IP 摄像机、智能猫眼门锁、可视门铃、居家智能等多项产品领域而推出的高性能、低功耗芯片&a…

【客户服务】互联网时代客户投诉处理金点子

互联网时代客户投诉新特点 客户投诉渠道广投诉的内容涉及到企业的各个方面客户维权意识越来越强负面效应很难管 卓越客户体验成为企业核心竞争力 移动互联网与社会化媒体背景下&#xff0c;客户的全方位感知、情感、卓越体验、高效需求成为驱动技术、应用、终端以及服务持续…

SQL 审核在 CloudQuery 的四大场景应用

数据库作为数据的核心载体&#xff0c;其安全性和稳定性对业务的影响至关重要。而在我们日常业务中&#xff0c;SQL 编写不当是引起数据库故障的一个重要原因&#xff0c;轻则影响数据库性能&#xff0c;重则可能直接导致「雪崩」。因此&#xff0c;SQL 审核作为 SQL 代码投入生…

【前端知识】Javascript前端框架Vue入门

前端框架VUE入门 概述基础语法介绍组件特性组件注册Props 属性声明事件组件 v-model(双向绑定)插槽Slots内容与出口 组件生命周期完整示例1. 创建 Vue 项目&#xff08;如果还没有&#xff09;2. 定义和使用组件3. 在主应用中使用组件4. 运行应用完整项目结构 参考文献 概述 V…

Jmeter基础篇(24)Jmeter目录下有哪些文件夹是可以删除,且不影响使用的呢?

一、前言 Jmeter使我们日常做性能测试最常用的工具之一啦&#xff01;但是我们在和其他同学协同工作的时候&#xff0c;偶尔也会遇到一些问题&#xff0c;例如我想要给别人发送一个Jmeter工具包&#xff0c;但这个文件包往往会很大&#xff0c;比较浪费流量和空间&#xff0c;…

Python_爬虫3_Requests库网络爬虫实战(5个实例)

目录 实例1&#xff1a;京东商品页面的爬取 实例2&#xff1a;亚马逊商品页面的爬取 实例3&#xff1a;百度360搜索关键词提交 实例4&#xff1a;网络图片的爬取和存储 实例5&#xff1a;IP地址归地的自动查询 实例1&#xff1a;京东商品页面的爬取 import requests url …

StructuredStreaming (一)

一、sparkStreaming的不足 1.基于微批,延迟高不能做到真正的实时 2.DStream基于RDD,不直接支持SQL 3.流批处理的API应用层不统一,(流用的DStream-底层是RDD,批用的DF/DS/RDD) 4.不支持EventTime事件时间&#xff08;一般流处理都会有两个时间&#xff1a;事件发生的事件&am…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…