service worker 是什么?看这篇就够了

系统结
• 阅读 10371

service worker 是什么

一句话概括

一个服务器与浏览器之间的中间人角色,如果网站中注册了service worker那么它可以拦截当前网站所有的请求,进行判断(需要编写相应的判断程序),如果需要向服务器发起请求的就转给服务器,如果可以直接使用缓存的就直接返回缓存不再转给服务器。从而大大提高浏览体验。

以下是一些细碎的描述

  • 基于web worker(一个独立于JavaScript主线程的独立线程,在里面执行需要消耗大量资源的操作不会堵塞主线程)
  • 在web worker的基础上增加了离线缓存的能力
  • 本质上充当Web应用程序(服务器)与浏览器之间的代理服务器(可以拦截全站的请求,并作出相应的动作->由开发者指定的动作)
  • 创建有效的离线体验(将一些不常更新的内容缓存在浏览器,提高访问体验)
  • 由事件驱动的,具有生命周期
  • 可以访问cache和indexDB
  • 支持推送
  • 并且可以让开发者自己控制管理缓存的内容以及版本

如何使用

  1. 注册Service worker 在你的index.html加入以下内容
       /* 判断当前浏览器是否支持serviceWorker */
       if ('serviceWorker' in navigator) {
           /* 当页面加载完成就创建一个serviceWorker */
           window.addEventListener('load', function () {
               /* 创建并指定对应的执行内容 */
               /* scope 参数是可选的,可以用来指定你想让 service worker 控制的内容的子目录。 在这个例子里,我们指定了 '/',表示 根网域下的所有内容。这也是默认值。 */
               navigator.serviceWorker.register('./serviceWorker.js', {scope: './'})
                   .then(function (registration) {
    
                       console.log('ServiceWorker registration successful with scope: ', registration.scope);
                   })
                   .catch(function (err) {
    
                       console.log('ServiceWorker registration failed: ', err);
                   });
           });
       }
       
  1. 安装worker:在我们指定的处理程序serviceWorker.js中书写对应的安装及拦截逻辑
   /* 监听安装事件,install 事件一般是被用来设置你的浏览器的离线缓存逻辑 */
   this.addEventListener('install', function (event) {
        
       /* 通过这个方法可以防止缓存未完成,就关闭serviceWorker */
       event.waitUntil(
           /* 创建一个名叫V1的缓存版本 */
           caches.open('v1').then(function (cache) {
               /* 指定要缓存的内容,地址为相对于跟域名的访问路径 */
               return cache.addAll([
                   './index.html'
               ]);
           })
       );
   });
   
   /* 注册fetch事件,拦截全站的请求 */
   this.addEventListener('fetch', function(event) {
     event.respondWith(
       // magic goes here
         
         /* 在缓存中匹配对应请求资源直接返回 */
       caches.match(event.request)
     );
   });
以上为一个最简单的使用例子,更多内部api请查看mdn service worker

注意事项

Service worker运行在worker上下文 --> 不能访问DOM

它设计为完全异步,同步API(如XHR和localStorage)不能在service worker中使用

出于安全考量,Service workers只能由HTTPS承载

在Firefox浏览器的用户隐私模式,Service Worker不可用

其生命周期与页面无关(关联页面未关闭时,它也可以退出,没有关联页面时,它也可以启动)

兼容情况

有趣的事

在MDN的兼容情况中可以看到Safari 对于Service workers的全线不支持,这是因为通过Service workers可以在浏览器上实现一种类似小程序的功能(PWA)。这将绕过苹果的app store导致苹果不能再和开发者37开分成,所以苹果不喜欢这项技术。ps:不过还是在18年开始支持了😂

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Linux玩转redis从入门到放肆
1\.缓存穿透在大多数互联网应用中,缓存的使用方式如下图所示:!(https://oscimg.oschina.net/oscnet/6a12e0fbee579fa624b2ea1738e89278c3f.png)1.当业务系统发起某一个查询请求时,首先判断缓存中是否有该数据;2.如果缓存中存在,则直接返回数据;3.如果缓存中
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
Http 缓存策略
1)浏览器缓存策略浏览器每次发起请求时,先在本地缓存中查找结果以及缓存标识,根据缓存标识来判断是否使用本地缓存。如果缓存有效,则使用本地缓存;否则,则向服务器发起请求并携带缓存标识。根据是否需向服务器发起HTTP请求,将缓存过程划分为两个部分:强制缓存和协商缓存,强缓优先于协商缓存。强缓存,服务器通知浏览器一个缓存时间,在
Wesley13 Wesley13
3年前
PHP实现异步调用方法研究
浏览器和服务器之间是通过HTTP协议进行连接通讯的。这是一种基于请求和响应模型的协议。浏览器通过URL向服务器发起请求,Web服务器接收到请求,执行一段程序,然后做出响应,发送相应的html代码给客户端。这就有了一个问题,Web服务器执行一段程序,可能几毫秒就完成,也可能几分钟都完不成。如果程序执行缓慢,用户可能没有耐心等下去,就关闭浏览器了
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(