博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ServiceWorker入门
阅读量:5963 次
发布时间:2019-06-19

本文共 2615 字,大约阅读时间需要 8 分钟。

使用前提

  • 站点必须是https的,不过本地开发若是localhost访问,则本地可以是http协议
  • 浏览器支持情况,数据来源,
  • SW里面的API要求是异步的,所以localStorage不能使用,下面的demo可以看到大量的promise

基础使用

scope

  • scope作用域,一开始以为是同静态资源的作用域,后来才个发现这个作用域是hmtl的作用域,即只要html页面在这个作用域里,那页面的请求就会被fetch回调捕捉到。

下面的sw.js的路径是/,或是把sw.js的Header加上``头,当前涉及到运维的事都会比较麻烦啦。所以就是前端把sw.js放在/下会简单些。

设置成功后就输出这样子:reg success with scope https://domain.com/sw/

navigator.serviceWorker.register('/sw.js', {
scope: '/'}) .then(reg => { console.log('reg success with scope', reg.scope) }) .catch(err => { console.log('serviceWorker reg fail', err) })复制代码

/** *  * 改了这个文件,在浏览器里禁用了缓存,sw.js也不会再加载,在index.html里加上时间戳就会重新加载 */const VERSION = 'v2'self.addEventListener('install', onInstall)self.addEventListener('activate', onActivate)self.addEventListener('fetch', onFetch)function onInstall(event) {    // waitUntil 的第一个参数是Promise    event.waitUntil(        Promise.all([            self.skipWaiting(),            // caches,不是cache            caches.open(VERSION).then(cache => {                // 在某一个cache集合里添加                return cache.addAll([                    // 这里的路径是相对于reg的scope的,而是网站的root                    // 所以推荐写绝对路径                    '/0.0.js',                    '/2.2.js',                    '/3.3.js',                    '/4.4.js',                ])            })        ])    )}function onActivate(event) {    let cacheWhiteList = [VERSION]    event.waitUntil(        caches.keys().then(function (keys) {            return Promise.all(keys.map(function(key) {                if (cacheWhiteList.indexOf(key) === -1) {                    // 删除某一个Cache集合                    return caches.delete(key).then(suc => {                        return clients.claim()                    })                }                // 强制更新service worker                return clients.claim()            }))        })    )}function onFetch(event) {    let url = new URL(event.request.url)    if (url.pathname !== event.request.pathname)) {        return event.respondWith(            fetch(event.request)        )    }    // index.html的请求也会进来    event.respondWith(        caches.match(event.request).then(resp => {            return resp || fetch(event.request, {                credentials: 'omit'   // 不发送cookie            }).then(response => {                const cacheKey = VERSION                return caches.open(cacheKey).then(cache => {                    // put 得是某一个cache                    cache.put(event.request, response.clone()).then(() => {                    }).catch((e) => {                    })                    return response                })            })        })    )}复制代码

参考

转载地址:http://imjax.baihongyu.com/

你可能感兴趣的文章
后台调用gps
查看>>
HTML5标签的语义认知和理解(1)
查看>>
MySQL日志功能详解(2)
查看>>
HP LaserJet 305X 和 339X 系列一体机如何设置手动或自动接收传真?
查看>>
linux之权限之隐藏权限
查看>>
系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常...
查看>>
XDCTF成长记录
查看>>
registered the JDBC driver [com.mysql.jdbc.Driver]
查看>>
Linux系统中的文本处理工具
查看>>
IDE---Python IDE之Eric5在window下的安装
查看>>
python---LineReceiver实现记录服务器
查看>>
Mybatis调用Oracle中的存储过程和function
查看>>
telnet :No route to host
查看>>
基本安装lnmp环境
查看>>
yum源资料汇总
查看>>
7、MTC与MTV,http请求介绍
查看>>
logstash消费阿里云kafka消息
查看>>
第四节课作业
查看>>
angularJS 限制字符串输出长度
查看>>
顺序表的实现---动态
查看>>