10分钟带你初步了解 Service Worker

news2024/11/28 10:35:53

是什么?

  • 服务器与浏览器的中介
  • 持久的浏览器离线缓存

有什么用?

  • 解放主线程,节省资源加载,提高浏览体验

其他描述

  • 基于web worker,并在其基础上,增加了离线缓存的功能
  • 独立于当前网页线程(后台线程)
  • 在网页发起请求进行代理,缓存文件(网络代理)
  • 必须是https的协议
  • 被install后,就永远存在,除非手动卸载

生命周期

在这里插入图片描述

具体展现

在Application,能看到该页面是否激活sw
在这里插入图片描述

也可以在NetWork,查看具体的接口文件,是否缓存于sw
在这里插入图片描述

也可以在Application的Cache Storage中查看缓存的具体内容:
在这里插入图片描述

基本使用

1. 注册

通知浏览器分配一块内存

if ('serviceWorker' in navigator) {
    navigator.serviceWorker
    .register('./serviceworker.js')
    .then((reg) => {
      console.log('ServiceWorker register success: ', reg)
    }).catch((err) => {
      console.log('ServiceWorker register failed: ', err)
    })
}

sw拥有作用域,会监听该作用域下面代理的代所有请求,
例如我只能想要监听my文件夹,就在注册时指定路径:

 navigator.serviceWorker.register('./home/serviceworker.js')

2. 安装

注册后,浏览器就会安装sw,我们可以通过事件监听

// 资源属性
var CACHE_PREFIX = 'cms-sw-cache';
var CACHE_VERSION = '0.0.20';
var CACHE_NAME = CACHE_PREFIX+'-'+CACHE_VERSION;
var ALL_ASSETS = ['./main.css'];

self.addEventListener('install', (event) => {
  //用来强制更新的servicework跳过等待时间
  self.skipWaiting() 
  event.waitUntil(
    caches.open(CACHE_NAME).then(function (cache) {
       return cache.addAll(ALL_ASSETS)
    })
  )
})

3. 激活

self.addEventListener('activate', (event) => {
  var cacheWhitelist = [CACHE_NAME]
  // 保证 激活之后能够马上作用于所有的终端
  self.clients.claim() 
  event.waitUntil(
    caches.keys().then((cacheNames) => {
      return Promise.all(
        cacheNames.map((cacheName) => {
        if (cacheWhitelist.indexOf(cacheName) === -1) {
          return caches.delete(cacheName)
        }
       })
      )
    })
   )
})

在激活sw时需要删除之前的缓存,可将需要的缓存放在有个白名单中
然后通过caches.keys()拿到所有缓存,将不再白名单中的缓存删掉。

4. 拦截网络请求

  self.addEventListener('fetch', (event) => {
    event.respondWith(
      caches.match(event.request).then((response) => {
        if (response) 
          return response;
        return fetch(event.request);
       })
     );
   });

5. 卸载

navigator.serviceWorker.getRegistrations().then(function (registrations) {
    for (let registration of registrations) {
      //安装在网页的service worker不止一个,找到我们的那个并删除
      if (registration && registration.scope === 'http://localhost:8080/') {
        registration.unregister()
      }
    }
  })

总结

在日常迭代项目中,遇到了浏览器缓存的问题,深入研究并发现了sw。
因此本篇文章,仅对于个人对于sw的尝试与学习,初步理解其运用。

进阶文献

网易云课堂 Service Worker 运用与实践
Service Worker简介

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

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

相关文章

3-D HANet:一种用于目标检测的柔性三维 HeatMap 辅助网络

论文背景 室外场景感知使用 Lidar: 1.点云数据不受天气(雾、风暴、雨和雪)的影响,支持稳定的环境感知; 2.点云数据在很大程度上保留了原来中物体的空间结构特征。 3D 目标检测是室外场景感知的重要组成部分。 从一个不完整的点云空间结构中…

如何快速在 Apache DolphinScheduler 新扩展一个任务插件?

作者 | 代立冬 编辑 | Debra Chen Apache DolphinScheduler 是现代数据工作流编排平台,具有非常强大的可视化能力,DolphinScheduler 致力于使数据工程师、分析师、数据科学家等数据工作者都可以简单轻松地搭建各种数据工作流,让数据处理流程…

使用Python绘制多个股票的K线图

K线图是金融领域常用的技术分析工具,可以洞察地展示股票的开盘价、收盘价、最高价和最低价等信息。在投资决策中,对多个股票的走势进行对比分析是非常重要的。随着金融市场的发展,投资者对于多种股票的对比分析需求越来越高。传统的方式是通过…

tokio::net学习

tokio::net 该模块包含TCP/UDP/Unix网络类型,类似于标准库,可用于实现网络协议。 networking protocols Organization TcpListener and TcpStream provide functionality for communication over TCP UdpSocket provides functionality for communication over UDP UnixLi…

信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册)

信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册) 目录 应用背景操作步骤 应用背景 如果我们想把图片弄成相册,或者弄成一段有音乐的视频分享给朋友。我们可以利用PPT来制作。那我们如何用PPT制作电子相册或视频呢?可以跟…

21天学会C++:Day13----动态内存管理

CSDN的uu们,大家好。这里是C入门的第十三讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 加深对内存四区的理解 2. new-delete 与 malloc-free 2.1 能否用 fre…

Django:一、创建项目、APP及启动Django

一、准备工具 Pycharm企业版 二、创建项目 打开Pycharm企业版,创建Django项目。 注意:①删除项目下的templates文件夹;②删除setting.py文件中的一行代码 默认文件介绍: 三、创建APP 点击Pycharm左下角Terminal,打…

基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 数据增强3. 模型构建4. 模型训练及保存5. 模型评估6. 模型测试1)权限注册2)模型导入3)总体模型构建4)处理视频中的预览帧数据5)处理图片数…

区块链技术:解密去中心化的革命

文章目录 区块链的基础概念什么是区块链?区块链的核心原理1. 分布式账本2. 区块3. 加密技术4. 共识机制 区块链的工作原理区块链的交易过程区块链的安全性共识机制的作用 区块链的应用领域1. 金融服务2. 供应链管理3. 物联网4. 医疗保健5. 政府与公共服务 区块链的未…

图像练习OpenCV(01)

提取出里面最大矩形的四个顶点坐标 源图像 结果展示 代码 void getLine(std::vector<int>& data, int threshold) {for (int x 0; x < data.size(); x){if (0 data[x]){continue;}int maxValue 0, maxLoc -1, i -1;for (i x; i < data.size(); i){if …

【2023集创赛】Arm杯二等奖作品:基于Arm Cortex-M3的体感节奏音乐游戏机

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;安谋科技杯全国二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电…

跑腿系统开发:构建实时任务分配算法的技术挑战

在跑腿系统中&#xff0c;实时任务分配算法是确保任务快速高效完成的关键因素之一。本文将介绍构建实时任务分配算法时可能面临的技术挑战&#xff0c;并提供一个简单的Python示例来解决这些挑战。 技术挑战&#xff1a; 实时数据处理&#xff1a; 跑腿系统需要处理大量的实时任…

Ganache本地测试网+cpolar内网穿透实现公网访问内网

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问 4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互联网&am…

K8S:Pod概念、分类及相关的策略

文章目录 一.pod相关概念&#xff11;.Pod基础概念&#xff12;.Kubrenetes集群中Pod两种使用方式&#xff13;.pause容器的Pod中的所有容器共享的资源&#xff14;.kubernetes中的pause容器主要为每个容器提供功能&#xff1a;&#xff15;.Kubernetes设计这样的Pod概念和特殊…

本地搭建CFimagehost私人图床——“cpolar内网穿透”

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

7.algorithm2e中while怎么使用

algorithm2e中while怎么使用 在 algorithm2e 宏包中&#xff0c;要使用 while 循环&#xff0c;您可以使用 \While 和 \EndWhile 命令来定义循环的开始和结束。以下是如何使用 while 循环的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorit…

Mac电脑音视频播放器: Infuse for Mac中文

Infuse是一款流行的多媒体播放器应用程序&#xff0c;适用于iOS、tvOS和macOS平台。它由Firecore开发&#xff0c;旨在提供出色的媒体播放体验&#xff0c;并支持广泛的视频和音频格式。 以下是Infuse的一些主要功能和特点&#xff1a; 多媒体格式支持&#xff1a;Infuse支持…

ROS2 从头开始​​:第 1 部分 — 机器人操作系统简介

火星上的机器人&#xff08;AI生成图像&#xff09; 一、说明 ROS2是机器人的朋友&#xff0c;一个他们所依赖的平台&#xff0c;用于沟通、协调和控制&#xff0c;帮助他们实现目标。ROS2以DDS为核心&#xff0c;帮助机器人探索新世界、新任务、新可能性&#xff0c;是一个方…

代码随想录--链表-反转链表

题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双指针 public class Main {public static class ListNode {int val;ListNode next;ListNode(int x) {val x;}}public ListNode reverseList(L…

涨知识,关于代码签名证书10大常见问题解答

在当今互联网时代&#xff0c;各种软件程序充斥着这个网络世界&#xff0c;大大小小的软件层出不穷&#xff0c;如何让用户信任软件并下载软件&#xff0c;是众多软件开发公司需要解决的问题&#xff0c;由此代码签名证书应运而生&#xff0c;提供了软件程序的身份认证、完整性…