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

devtools/2024/11/16 14:20:55/

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

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

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

javascript">//这里是版本控制,以后在cache.addAll中的静态文件有修改,我们修改完后,只需要改CACHE_NAME的值即可,比如cache_v5改成cache_v6
const CACHE_NAME='cache_v5';
//install事件监控,因为返回的都是期约异步,所以都用异步函数,在这里我们添加html" title=缓存>缓存
self.addEventListener('install',async event=>{console.log('install',event);//开启一个html" title=缓存>缓存,得到一个html" title=缓存>缓存对象const cache=await caches.open(CACHE_NAME);//添加需要html" title=缓存>缓存的文件await cache.addAll(['/images/123.jpg','/serviceWorker.html','/serviceworker2.html" title=css>css']);//这段话是立即执行, 会让 service worker 跳过等待,直接进入到 activate 状态await self.skipWaiting();
});//监控激活activate事件,在这里我们可以删除旧的html" title=缓存>缓存
self.addEventListener('activate',async event=>{console.log('activate',event);//获取所有的html" title=缓存>缓存版本,就是我们上面的CACNE_NAME,如果你有其它的html" title=缓存>缓存版本都会在keys中const keys=await caches.keys();//循环出每个版本的html" title=缓存>缓存键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事件,会拦截所有的请求: 走网络或html" title=缓存>缓存
self.addEventListener('fetch',event=>{console.log('fetch',event);const req=event.request;//返回一个新创建的URL对象const url=new URL(req.url);//只html" title=缓存>缓存同源的内容,当然你也可以不要这段,就可以html" title=缓存>缓存CDN或其它源的js文件if(url.origin !==self.origin){return;}//这里的api只是判断走网络还是走html" title=缓存>缓存;如果没有api文件夹也不影响//接口请求优先走网络,静态资源优先走html" title=缓存>缓存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里面,下次访问就是html" title=缓存>缓存responsecache.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.html" title=css>css和图片你自己写和选图,要查看html" title=缓存>缓存,chrome浏览器按F12,–应用–>html" title=缓存>缓存空间;即可看到三个html" title=缓存>缓存文件

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

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

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


http://www.ppmy.cn/devtools/134455.html

相关文章

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解

1.2 课题意义 现如今&#xff0c;信息种类变得越来越多&#xff0c;信息的容量也变得越来越大&#xff0c;这就是信息时代的标志。近些年&#xff0c;计算机科学发展得也越来越快&#xff0c;而且软件开发技术也越来越成熟&#xff0c;因此&#xff0c;在生活中的各个领域&…

深入解析 OpenHarmony 构建系统-3-GN 构建系统管理脚本

引言 OpenHarmony作为一款面向全场景的分布式操作系统,其构建系统在开发过程中扮演着至关重要的角色。本文将详细介绍OpenHarmony构建系统下的一个gn封装脚本,该脚本用于管理和执行 gn 命令,更高效地管理构建过程。 位置:/build/hb/services/gn.py 脚本概述 该脚本定义了…

【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing

HITS: High-coverage LLM-based Unit Test Generation via Method Slicing 1. 来源出处 本文是发表在2024年39th IEEE/ACM International Conference on Automated Software Engineering (ASE)上的论文。作者包括Zejun Wang, Kaiibo Liu, Ge Li和Zhi Jin,他们来自北京的PKU …

C++的一些模版

1、不限制次数的输入数据 vector<int> nums;int num;while (cin >> num) {nums.push_back(num);if (cin.get() \n) break;}2、取模模版 template<int kcz> struct ModInt { #define T (*this)int x;ModInt() : x(0) {}ModInt(int y) : x(y > 0 ? y : y…

反转链表

反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1…

视频编码基础入门

文章目录 前言一、视频编码的目标二、 视频编码基本流程1. 采样与颜色空间转换2. 变换编码&#xff08;例如DCT&#xff09;3. 量化4. 熵编码5. 运动补偿和帧间预测6. 编码输出 三、视频编码的关键技术1. 帧类型2. GOP&#xff08;Group of Pictures&#xff09;结构3. 比特率控…

学习yum工具,进行安装软件

目录 1.Linux 软件包管理器 yum 什么是软件包 2.Linux下安装软件的方案 3.Linux软件生态 Linux下载软件的过程&#xff08;Ubuntu、Centos、other&#xff09; 操作系统的好坏评估--- ⽣态问题 为什么会有⼈免费特定社区提供软件&#xff0c;还发布&#xff1f;还提供云服…