在 Service Worker 中caches.put() 和 caches.add()/caches.addAll() 方法他们之间的区别

在 Service Worker 中,caches.put(request, response) 和 caches.add(request)/caches.addAll(requests) 方法都用于将资源添加到缓存中,但它们的使用场景和目的略有不同。

caches.put(request, response),一用在fetch事件当中,由网络请求成功后将资源添加到缓存当中

用途:caches.put 方法用于将一个请求(request)和对应的响应(response)作为一个键值对添加到缓存中。这个方法通常在 fetch 事件中使用,用于在网络请求成功后将资源添加到缓存。

手动添加:是的,caches.put 是手动添加资源到缓存的一种方式。它允许你在捕获到网络请求并从网络获取资源后,将这些资源存储到缓存中,以便后续的请求可以直接从缓存中获取。

// 这里便是网络请求,或当网络请求优先时,便用cache.put()手动将网络获取资源添加到缓存中

// 监听 fetch 事件
self.addEventListener('fetch', (event) => {// 使用 event.respondWith() 来拦截请求并提供响应event.respondWith(// 使用 fetch() 从网络获取资源fetch(event.request).then((response) => {// 检查响应是否成功if (response.status === 200) {// 打开缓存return caches.open('my-cache').then((cache) => {// 将请求和响应克隆一份,因为 response 流只能被消费一次const responseToCache = response.clone();// 将请求和响应添加到缓存中cache.put(event.request, responseToCache);// 返回原始响应return response;});} else {// 如果响应不是200,则直接返回响应return response;}}).catch((error) => {// 如果 fetch 失败,则尝试从缓存中获取资源return caches.match(event.request).then((cachedResponse) => {if (cachedResponse) {return cachedResponse;} else {// 如果缓存中没有资源,抛出错误throw error;}});}));
});

这段代码的工作流程如下:

1、监听 fetch 事件:当页面发起网络请求时,Service Worker 会捕获这个请求。
2、从网络获取资源:使用 fetch() 尝试从网络获取资源。
3、检查响应状态:如果响应状态码为 200(即请求成功),则继续处理。
4、打开缓存:使用 caches.open() 打开一个名为 ‘my-cache’ 的缓存。
5、克隆响应:由于 Response 对象的流只能被消费一次,所以需要克隆一份响应,以便同时将其添加到缓存和返回给页面。
6、将资源添加到缓存:使用 cache.put() 将请求和克隆的响应添加到缓存中。
7、返回响应:返回原始的响应给页面。
8、错误处理:如果 fetch() 失败,尝试从缓存中获取资源。如果缓存中没有相应的资源,则抛出错误。

这样,你就可以在 Service Worker 中从后台请求资源,并将其添加到缓存中,以便在离线或网络不佳的情况下使用。

caches.add(request) / caches.addAll(requests),一般使用在install事件当中预先缓存资源

用途:caches.add 和 caches.addAll 方法用于将一个或多个资源添加到缓存中。caches.add 用于添加单个资源,而 caches.addAll 用于批量添加资源。这些方法通常在 install 事件中使用,用于在 Service Worker 安装时预先缓存资源。

预先缓存:这些方法用于在 Service Worker 安装时预先缓存资源,这样在页面加载时可以直接从缓存中获取这些资源,而不需要等待网络请求。

self.addEventListener('install', (event) => {event.waitUntil(caches.open('my-cache').then((cache) => {return cache.addAll(['/images/image1.jpg','/images/image2.jpg',// 其他资源...]);}));
});

总结:

caches.put(request, response) 通常在 fetch 事件中使用,用于在网络请求成功后将资源添加到缓存。
caches.add(request) 和 caches.addAll(requests) 通常在 install 事件中使用,用于在 Service Worker 安装时预先缓存资源。
这两种方法都是将资源添加到缓存的有效方式,选择哪种方法取决于你的具体需求和缓存策略。

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

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

相关文章

python高级之面向对象编程

一、面向过程与面向对象 面向过程和面向对象都是一种编程方式,只不过再设计上有区别。 1、面向过程pop: 举例:孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃饭 8. 妈妈给孩子送学校…

shell脚本(1)

免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 Shell脚本 建立一个sh脚本…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet,它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程(如图一所示)。在训练阶段,目标边界框逐渐扩散到随机分布,模型学习逆转这一加噪过程。在推理阶段&#…

ISAAC SIM踩坑记录--ROS2相机影像发布

其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5:Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了,但是都是基于ROS的,现在最新的已经是ROS2,这里把不同的地方简单记录一下。 搭建一个简单的场景&a…

outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务

微软邮箱反垃圾已经很强大了非常敏感,自家的域名的邮件都能给扔到垃圾邮箱里,但还是在本地增加了一层垃圾邮箱功能,然后垃圾邮箱并没有提示,导致错过很多通知,本身并没有提供关闭的功能,但微软有个Microsof…

「Py」Python基础篇 之 Python都可以做哪些自动化?

✨博客主页何曾参静谧的博客📌文章专栏「Py」Python程序设计📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

candence: 原理图生成网表时报错:Duplicate Pin name “xxx“

原理图生成网表时报错:Duplicate Pin name “xxx” 这个错误的意思是,原理图中管脚命名重复 解决这个问题的方法: 1、绘制元件的时候不要用相同的管脚名,比如GND等的,就稍加个后缀做区分2、就是将管脚属性修改为 &qu…

Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分,考虑后Diffusion Policy的重要性很高,加之后续还有一系列基于其的改进工作 故独立成本文,且写的过程中 …

计算机网络学习笔记-3.2介质访问控制

文章目录 介质访问控制静态划分信道 动态分配信道轮询访问介质访问控制随机访问介质访问控制ALOHA协议简介ALOHA协议的工作原理 介质访问控制 介质访问控制(MAC,Medium Access Control),质访问控制的目的是确保多个设备能够高效、…

GitCode光引计划有奖征文大赛

一、活动介绍 GitCode平台汇聚了众多杰出的G-Star项目,它们犹如璀璨星辰,用各自的故事和成就,为后来者照亮前行的道路。我们诚邀广大开发者、项目维护者及爱好者,共同撰写并分享项目在GitCode平台上托管的体验,挖掘平…

深入理解接口测试:实用指南与最佳实践5.0(三)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行

electron-egg一个入门简单、跨平台、企业级桌面软件开发框架https://www.kaka996.com/electron-egg 跳转地址 1,使用 git下载代码到本地,如果没有git需要进行安装 # gitee git clone https://gitee.com/dromara/electron-egg.git # github git clone https://github.com/dro…

DAY112代码审计PHP开发框架POP链利用Yii反序列化POP利用链

一、pop1链的跟踪 1、路由关系 2、漏洞触发口unserialize(base64_decode($data)); 2、__destruct(),魔术法方法调用close函数方法 3、未找到利用链,尝试__call魔术方法 4、逆推找call_user_func 函数 第一部分 namespace yii\db; class BatchQueryResu…

Maven 构建项目

Maven 是一个项目管理和构建工具,主要用于 Java 项目。它简化了项目的构建、依赖管理、报告生成、发布等一系列工作。 构建自动化:Maven 提供了一套标准化的构建生命周期,包括编译、测试、打包、部署等步骤,通过简单的命令就可以执…

任务调度中心-XXL-JOB使用详解

目录 详解 调度中心 执行器 原理 快速入门 源码仓库地址 1.初始化数据库 2.配置调度中心 1.解压源码 2.需改配置文件 3.启动调度中心 3.配置执行器 1.引入pom依赖 2.修改配置文件 3.执行器组件配置 4.部署执行器项目 4.开发第一个任务 BEAN模式(类…

ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析

在安卓14 安卓15的固件中。如果修改了系统级别的app。那么就会触发安卓14 15的应用签名验证。要么会导致修改的固件会进不去系统,或者进入系统有bug。博文将从几方面来解析去除安卓14 15应用签名验证的几种方法。 💝💝💝通过博文了解: 1💝💝💝-----安卓14去除…

批量规范化与ResNet-paddle

批量规范化与ResNet——paddle部分 本文部分为paddle框架以及部分理论分析,torch框架对应代码可见批量规范化与ResNet import paddle print("paddle version:",paddle.__version__)paddle version: 2.6.1批量规范化 批量规范化(Batch Norma…

从零开始快速构建Vue3项目

一、技术选型 组件大类 具体插件 vue3插件 相关插件开发文档 基础架构搭建 初始项目搭建、打包构件工具:vite开始 | Vite路由管理及菜单权限封装vue-router介绍 | Vue Router状态管理Pinia介绍 | Pinia 中文文档API请求及异常封装axiosUI框架 element-uihttps…

74HC245

74HC245:典型的CMOS型缓冲门电路 在这里用于增加电压

BFS 算法专题(三):BFS 解决边权为 1 的最短路问题

目录 1. 迷宫中离入口最近的出口 1.1 算法原理 1.2 算法代码 2. 最小基因变化 ★★★ 2.1 算法原理 2.2 算法代码 3. 单词接龙 3.1 算法原理 3.2 算法代码 4. 为高尔夫比赛砍树 (hard) 4.1 算法原理 4.2 算法代码 1. 迷宫中离入口最近的出口 . - 力扣(…