pwa学习整理 service worker

pwa学习整理 使用cacheStorage在离线时访问缓存资源 cacheStorage 在pwa中,我们要实现访问一个断网的页面,显示上一次的数据的功能,就必须将上一次的数据存储到缓存中,具体的就是存储到cacheStorage中。 使用一个在service worker中使用cacheStorage的例子来讲述缓存的过程 初始化各文件 首先建立目录如下 <!-- index.html --> <!DOCTYPE html> &... 阅读详情

Service Worker

Service Worker本质上是一个与JavaScript线程分离的单独js文件,可以拦截网络请求,缓存资源或从缓存中检索资源,传递推送信息。
与Web Worker不同,Service Worker是长期存在的,而Web Worker是临时的,计算的数据并不能保存起来。
Service只能在HTTPS或者http://localhost下运行,前者是为了保证安全,后者是为了调试的方便。
一旦Service Worker被install,就不会自动清除,除非手动unregister,用到的时候会自动唤醒,不用的时候会自动休眠。
Service Worker是异步实现的,使用promise
默认情况下,Service Worker激活后,会在下一次刷新的时候才生效
Service Worker中无法通过XMLHTTPRequest来发送请求,只能通过fetch API来发送请求

注册Service Worker

文件目录
在这里插入图片描述
注册Service Worker可以直接使用navigator对象的serviceWorker中的register来注册,要注意的是,为了兼容性处理,要首先判断当前浏览器是否支持Service Worker

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('worker.js')
}

这样就可以注册Service Worker,但是这样写存在一些问题,就是我们会在页面首次打开就去注册Service Worker,这样Service Worker线程在下载预存资源时,会占用部分主线程的带宽,对CPU和性能有一定的损耗,而且在刚打开页面时,很多资源都要加载,这个时候来注册Service Worker显然不是一个明智的决定,我们应该在页面加载完再注册Service Worker。

if ('serviceWorker' in navigator) {
    window.addEventListener('load',()=>{
        navigator.serviceWorker.register('worker.js')
    })
}

接下来,我们知道,Service Worker有拦截网络请求的作用,那么它会拦截哪些文件的网络请求,这里可以使用注册时返回的promise响应里面的registration.scope来获取拦截的内容

if ('serviceWorker' in navigator) {
    window.addEventListener('load',()=>{
        navigator.serviceWorker.register('worker.js').then(registration=>{
            console.log(`register success , scope is ${registration.scope}`)
        }).catch(err=>{
            console.log(`register failed , err is ${err}`)
        })
    })
}

在这里插入图片描述
这里我的worker.js放在根目录下,而默认情况下Service Worker文件会拦截文件所在的目录及以下的子目录,所以会拦截服务器下所有文件的请求
当然,我们也可以在注册的时候传入其他参数来设置拦截的目录。

if ('serviceWorker' in navigator) {
    window.addEventListener('load',()=>{
        navigator.serviceWorker.register('worker.js',{
            scope:'/js'
        }).then(registration=>{
            console.log(`register success , scope is ${registration.scope}`)
        }).catch(err=>{
            console.log(`register failed , err is ${err}`)
        })
    })
}

在这里插入图片描述
这里设置在worker.js所在目录的js文件夹,因为worker.js在根文件夹,所以最后的拦截目录就是根目录下的js文件夹

Service Worker生命周期

install:在Service Worker注册成功的时候触发,主要用于缓存资源,在注册成功时就将一些不怎么会发生变化的资源缓存下来,一旦断网还可以通过缓存继续访问这些资源。如果worker.js发生了改变,就会触发install事件
activate:在Service Worker激活的时候触发,主要用于清除旧的缓存。如果不进行清除的话,缓存会越来越多,最后空间不足。
fetch:在接收请求的时候触发,主要用于操作缓存和读取网络资源。fetch会捕获所有的请求,当读取网络资源失败时,就可以去操作缓存,将缓存中的资源渲染到页面上,这就是断网后还能看到一些资源的原因。

这里在worker.js中注册各个生命周期对应的事件

self.addEventListener('install', event => {
    //
    console.log('install',event);
});

self.addEventListener('activate', event => {
    console.log('activate',event)
});

self.addEventListener('fetch', event => {
    console.log('fetch',event)
});

要怎么判断自己是否已经成功注册Service Worker呢,和manifest一样,可以在Application中看到Service Worker的相应信息
在这里插入图片描述
这里是我之前就注册了的Service Worker,为了看到打印的内容,这里将之前注册好的Service Worker unregister掉
unregister后刷新查看控制台
在这里插入图片描述
因为这里只是注册了Service Worker,还没有发送请求,所以没有触发fetch事件
在这里当我们刷新时会发现控制台不再打印出install和active,这是因为原来的那个Service Worker已经存在了,要重新触发这两个事件,首先如上面所说,只要worker.js发生了改变,就会再次触发install事件,即使发生改变的只是添加一个注释
修改worker.js如下

self.addEventListener('install', event => {
    // install
    console.log('install',event);
});

self.addEventListener('activate', event => {
    console.log('activate',event)
});

self.addEventListener('fetch', event => {
    console.log('fetch',event)
});

在这里插入图片描述
可以看到,install事件重新触发了,但是activate事件并没有触发,这是因为虽然worker.js修改了,导致注册了一个新的Service Worker,但是原来的那个Service Worker还在运行中,要在原来的那个Service Worker终止后,才会激活现在的这个新注册的Service Worker,在原来的终止之前,新注册的只能处于等待状态,无法激活activate事件,可以看看Application中的Service Worker的状态
在这里插入图片描述
可以看到新的Service Worker正在等待中,此时只要按下skipWaiting就可以跳过等待,触发activate事件,控制台也就会打印出相应的内容
在这里插入图片描述
一般情况下我们希望注册后就能直接跳过等待,但是我们不可能都来控制台手动跳过等待,Service Worker提供了一个skipWaiting方法来跳过等待,返回一个promise对象
修改worker.js如下

self.addEventListener('install', event => {
    // install
    console.log('install',event);
    // 跳过等待,进入激活状态,触发activate
    self.skipWaiting();
});

self.addEventListener('activate', event => {
    console.log('activate',event)
});

self.addEventListener('fetch', event => {
    console.log('fetch',event)
});

保存刷新页面,可以发现这次activate事件也打印出来了。
在这里插入图片描述
但是这样写还存在一个问题,因为self.skipWaiting()返回的是一个promise对象,所以可能会存在promise对象中的内容还没执行完,就走到了activate生命周期中,为了避免这个问题,我们采用event.waitUntil()来接收这个方法返回的promise对象,该方法会在接收的promise结束后才进入下个生命周期,就避免了上面提到的问题。
修改worker.js如下

self.addEventListener('install', event => {
    // install
    console.log('install',event);
    // 跳过等待,进入激活状态,触发activate
    // 等待skipWaiting返回的promise结束后才进入activate周期
    event.waitUntil(self.skipWaiting());
});

self.addEventListener('activate', event => {
    console.log('activate',event)
});

self.addEventListener('fetch', event => {
    console.log('fetch',event)
});

上面也已经提过了,Service Worker激活后,是在下一次刷新页面的时候才生效的,那么如果我们要让其立即生效,可以使用self.clients.claim()来立即获取控制权
修改worker.js如下

self.addEventListener('install', event => {
    // install
    console.log('install',event);
    // 跳过等待,进入激活状态,触发activate
    // 等待skipWaiting返回的promise结束后才进入activate周期
    event.waitUntil(self.skipWaiting());
});

self.addEventListener('activate', event => {
    console.log('activate',event)
    // 表示Service Worker激活后,立即获取控制权
    // 在确定获得控制权后才让fetch得以触发
    event.waitUntil(self.clients.claim());
});

self.addEventListener('fetch', event => {
    console.log('fetch',event)
});

接下来看看fetch,我们在index.html中引入一个新写的css
css文件如下

body {
    background-color: aqua;
}

在html的head标签中引入css

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="index.css">
</head>

刷新后可以看到,fetch被触发了
在这里插入图片描述
而且看这里请求,是css文件的请求被Service Worker抓到了

上面已经提及了,在Service Worker中无法使用XMLHttpRequest请求,只能通过fetch API发送请求
fetch(url,config)用于发送http请求,返回一个包含响应结果的的promise对象
当我们配置完缓存后,我们要拦截请求,查看缓存中是否有相应的数据,如果没有数据的话,使用fetch发起请求,如果有就使用缓存中的数据
(关于fetch和缓存处理配置祥见另外的博客)

Google Earth Engine ——在 GEE 中计算面积含各类要素计算(土地分类为例) 在遥感应用中工作时,许多操作需要计算面积。例如,需要在监督分类后计算每个类所覆盖的面积,或者找出灾害后区域内受影响的面积。计算栅格和矢量的面积在大多数软件包中是一个简单的操作,但在 Google Earth Engine 中以稍微不同的方式完成 - 这可能会让初学者感到困惑。在这篇文章中,我将概述计算矢量和图像面积的方法。我们将涵盖以下主题,从简单到复杂。 特征的面积计算,即矢量数据 图像的面积计算(单类) 按类别计算图像的面积 按区域按类别计算图像的面积 按年按地区按类别计算图像的面积 准备数据 阅读详情

相关推荐

自定义串口通讯协议

自定义串口通讯协议的实现方法

qq_44826038的博客 2172

Service Worker实战:离线缓存、推送通知与PWA落地避坑指南

Service Worker是现代Web应用实现离线可用、秒级加载和主动触达的核心机制,其本质是一个运行在浏览器后台、可拦截网络请求并自主管理缓存的持久化代理进程。它不同于localStorage的简单键值存储或CDN的被动缓存,具备请求拦截优先级、后台持久化运行和细粒度缓存控制三大不可替代能力。这些能力支撑Progressive Web Apps(PWA)达成接近原生App的体验,尤其适用于电商、政务、医疗等对可靠性与用户触达要求高的场景。本文聚焦真实项目中Service Worker的注册时机、Cach

weixin_33907511的博客 334

CTP开发实战:如何高效处理预埋单与委托单的完整流程(附代码示例)

本文深入探讨了CTP开发中预埋单与委托单的完整处理流程,从订单生命周期理解、核心代码实现到异步事件处理与系统健壮性构建。通过详细的代码示例和状态机分析,为开发者提供了构建高可靠订单处理系统的实战指南,重点解决了状态同步、异常恢复等关键工程挑战。

weixin_29234239的博客 116

pwa-之service worker 基本概念

pwa-之service worker 基本概念pwa-之service worker 离线文件处理 学习service worker 基本概念 在本章,将涵盖以下内容 service worker准备工作 注册service worker 注册service worker细节 调试 出现错误时提供稳定版本 创建mock响应 处理请求超...

weixin_33802505的博客 467

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第一篇)安装调试

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼调试 本文内容大部分来自Kris,我们的K大,在VTOL领域的大牛,在此,非常感谢K大。能引用K大的成果也是自己的荣幸,不便之处还请K大多多包涵,在此引用只是为方便自己日常学习,部分参数表里根据自身情况,增加了相应参数。 1.安装及下载Ardupilot官方固件: VTOL固件的来源可分为Ardupilot官方固...

u011322358的博客 3万+

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

Service Worker:PWA背后的守护者

Service Worker是一种运行在浏览器后台的脚本,独立于网页上下文,可以拦截网络请求并缓存资源,从而在离线状态下依然能提供应用功能。它是Web应用向原生应用靠拢的重要一步,赋予了Web应用更多可能性。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1232

20-CUDA规约算法:并行求和优化策略-✨

本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。

2301_79143213的博客 171

渐进式 Web 应用 (PWA) 理论篇之 Service Worker

作者 | 宁旭初1万小时的锤炼是任何人从平凡变成超凡的必要条件前言PWA(Progressive Web Apps) 即渐进式网络应用程序,由于其出色的用户体验,正在变得越来越流行。如果...

杏仁技术站 712

uniapp(全端兼容) - 最新详细实现双色球开奖走势图功能组件,uni-app红球走势图/蓝球走势图,解决双色球 “蓝球连线“ 问题,双色球效果及用线连接每个号码详细教程(同样适用于彩票开奖走势图

uni-app,双色球,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,红球走势,蓝球走势,连线,uniapp(vue):js实现双色球开奖走势图带连线,vue2,vue3,uniApp双色球组件插件,uniapp如何实现双色球走势图和连线,彩票走势图,前端 Vue实现彩票走势图,详细示例,走势图,彩票项目,绘制股票走势图,前端 JS实现彩票开奖走势图 连线,Uniapp有没有双色球的页面代码,红球蓝球的走势图如何做,双色球红球和值尾走势图,

✅ 精选推荐文章 3345

30天入门 SAP BTP 开发系列之二:了解 SAP BTP Region 的概念,包含账号申请的详细步骤

SAP BTP 的 Region,实际是一组按地理位置划分的、由 SAP 或合作 Hyperscaler 承载的基础设施栈。这些基础设施栈至少包含多可用区网络、对象存储、计算节点及自动化运维等服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1462

【PWA】Service Worker 全面进阶_pwa servicewwork(2)

资料过多,篇幅有限开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】自古成功在尝试。不尝试永远都不会成功。勇敢的尝试是成功的一半。// 检测是否删除成功});# 通过,可以通过 Promise.all 的形式来删除多个 cache object});CacheStorage.keys(): 以数组的形式,返回当前 Cache Storage 保存的所有 Cache Object Name。### 最后。

2401_84419009的博客 651

AUTOSAR进阶图解==>AUTOSAR_SWS_COM

AUTOSAR COM模块是AUTOSAR通信堆栈的核心组件,提供信号导向的通信服务。该模块位于通信服务层,连接RTE与PDU Router,主要功能包括信号封装/提取、传输模式管理、信号路由、超时监控和字节序转换等。COM模块架构分为应用层、通信服务层和通信抽象层,包含信号管理、I-PDU处理、传输模式管理等组件。其配置结构包括顶层容器、I-PDU组、I-PDU和信号等多层次配置对象,支持丰富的参数设置。模块采用严格的状态管理机制,包括模块状态和I-PDU组状态转换,确保通信可靠性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1243

超详细的图文PWA-H5 Web App优化探索之路(Service Worker,Lighthouse)

PWA是什么? Progressive Web App 渐进式web应用程序,简单来说,就是可以让你的WEB App,带来与原生App相媲美的用户体验。。 为什么要用PWA? 简单来说,是为了web应用更好的用户体验。 当你的web页面处于离线或者弱网情况,可以调用预先缓存资源,使你的应用正常加载。 部分资源无需经过网络,页面秒开。 你的页面可以被搜索引擎收录。 可以通过message进行离线消息推送。 应用可以被添加到手机桌面,像原生应用一样可以全屏,推送 怎么用PWA? 使用HTTPS 使用Se.

tangdou369098655的博客 1819

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

在项目中使用Service Worker 与 PWA

Web Worker 是浏览器内置的线程,用于执行非阻塞事件循环的 JavaScript 代码。由于 JavaScript 是单线程语言,一次只能处理一个任务。复杂任务的出现可能导致主线程被阻塞,严重影响用户体验。Web Worker 的作用是允许主线程创建 worker 线程,使它们可以同时运行。Worker 线程主要负责处理复杂的计算任务,然后将结果返回给主线程。简而言之,worker 线程执行复杂计算,同时保持页面(主线程)的流畅性,不会造成阻塞。

linwu的博客 901

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Service Worker与PWA:下一代Web应用核心技术解析

Service Worker作为现代Web开发的关键技术,通过在浏览器后台独立运行的JavaScript线程,实现了资源缓存、离线访问和推送通知等原生应用功能。其工作原理包括注册、安装、激活和运行四个阶段,结合PWA(渐进式Web应用)技术,能够显著提升Web应用的用户体验和留存率。通过合理的缓存策略,如CacheFirst、NetworkFirst等,可以有效优化应用性能。Service Worker与PWA的结合不仅适用于天气应用等简单场景,还能在电商、新闻等复杂应用中发挥巨大价值,是构建下一代Web应

weixin_30385925的博客 327

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PWA持久化攻击与Service Worker劫持:从入门到实战的终极指南

这种基于Service Worker的劫持技术,是浏览器持久化控制领域的前沿,它模糊了Web页面与原生应用之间的界限,也对传统的前端安全边界构成了重大挑战。当拦截到请求时,它会克隆(clone)这个请求,将Cookie等信息发送到攻击者的服务器,然后再将原始请求发往网络,并将网络的响应返回给页面,从而在用户无感知的情况下完成数据窃取。最可怕的是,由于这个假秘书已经“入驻”了客户的办公室,所以即使当初被收买的前台被开除了(XSS漏洞被修复),只要假秘书不被揪出来,他就会一直潜伏在那里,持续作恶。

Alfadi联盟 萧瑶的博客 1144

如何利用 Service Worker 实现离线缓存?Vue 项目 PWA 入门实战教程

//.*/i, handler: 'StaleWhileRevalidate', options: { cacheName: 'api-cache', expiration: { maxEntries: 50 } } } ] } }}构建后(npm run build),会在 dist 目录下自动生成 service-worker.js 和 manifest.json。

HHHHH1010HHHHH的博客 278

Service Worker —这应该是一个挺全面的整理

作为一个比较新的技术,大家可以把 Service Worker 理解为一个介于客户端和服务器之间的一个代理服务器。在 Service Worker 中我们可以做很多事情,比如拦截客户端的请求、向客户端发送消息、向服务器发起请求等等,其中最重要的作用之一就是离线资源缓存。

qq_40229790的博客 1603

PWA入门指南:小白也能懂的渐进式Web应用

简单来说,它能让网页具备原生应用的特性,比如离线访问、添加到主屏幕、推送通知等。最近在学习PWA(渐进式Web应用)开发,发现这个技术能让网页像原生应用一样运行,特别适合想要提升用户体验的开发者。作为一个刚入门的小白,我整理了一份简单易懂的学习笔记,希望能帮助到同样想学习PWA的朋友。最重要的是动手尝试,从一个简单的项目开始,逐步添加功能,你会发现自己也能开发出不错的PWA应用。Service Worker是PWA的核心技术,它像一个在后台运行的脚本,可以拦截网络请求、缓存资源,实现离线访问功能。

JetRaven12的博客 920

探索 Awesome PWA:打造未来互联网应用的新范式

探索 Awesome PWA:打造未来互联网应用的新范式 是一个精心整理的资源列表,专注于渐进式Web应用程序(Progressive Web Apps, 简称PWA)。这个项目由Hemanth HM维护,旨在为开发者提供最新的PWA工具、库、框架和教程,帮助他们构建更快速、更可靠且功能丰富的网络应用。 什么是 Progressive Web App (PWA) PWA是一种介于传统网页与原生应用...

gitblog_00095的博客 385

为什么选择Voice Memos?探索这款PWA录音应用的独特优势 [特殊字符]

在数字化时代,语音备忘录已成为我们日常生活和工作中不可或缺的工具。Voice Memos作为一款创新的渐进式Web应用,为录音和语音管理提供了全新的解决方案。这款基于现代Web技术的录音应用,不仅功能强大,还具备许多独特的优势,让它成为众多用户的首选录音工具。 ## 什么是Voice Memos? 🤔 Voice Memos是一款完全基于Web技术构建的录音应用,采用PWA(渐进式Web应用

gitblog_01055的博客 479

chandra OCR移动端适配:PWA应用封装教程

本文介绍了如何将Chandra OCR模型封装为PWA应用,以实现移动端便捷的文档识别。通过星图GPU平台,用户可以自动化部署Chandra镜像,快速搭建服务。该方案的核心应用场景是:用户通过手机拍照,即可将图片或PDF中的文字、表格等内容,精准转换为保留排版的Markdown或HTML格式,极大提升了移动办公与学习效率。

weixin_28888459的博客 375

PWA学习整理

PWA简介PWA( 全称:Progressive Web App )也就是说这是个渐进式的网页应用程序,是一个具有响应式布局的Web应用,可以离线工作,并能够安装到设备的主屏幕上。其实是在主屏幕上添加该Web应用的快捷方式。其主要解决以下问题: * 可以添加至主屏幕,点击主屏幕图标可以实现启动动画以及隐藏地址栏 * 实现离线缓存功能,即使用户手机没有网络,依然可以使用一些离线功能

lwjaiyjk3的专栏 1181

【PWA学习与实践】(8)使用Service Worker进行后台同步 - Background Sync

《PWA学习与实践》系列文章已整理至gitbook - PWA学习手册,文字内容已同步至learning-pwa-ebook。转载请注明作者与出处。 本文是《PWA学习与实践》系列的第八篇文章。本文中的代码可以在learning-pwa的sync分支上找到(git clone后注意切换到sync分支)。 PWA作为时下最火热的技术概念之一...

weixin_34112208的博客 690
上一篇: pwa学习整理 manifest的配置
下一篇: pwa学习整理 fetchAPI
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值