serviceWorker

摘要:
ServiceWorker可以编写脚本来灵活自由地控制缓存。基本用法:1.注册˂!

推荐阅读:Service Worker 简介

在 Service Worker 之前,我们一般用 AppCache 来实现离线体验(就是配置 Manifest 文件的方式),这个会有很多问题(博主曾尝试过,体验非常差,非常难用,而且不灵活)。

而 Service Worker 可以写脚本去灵活自由地控制缓存。

基本使用:

1. 注册

<!-- /report/index.html 片段 -->
<script>
    if (navigator.serviceWorker) {
        navigator.serviceWorker.register('./sw.js').then(res => {
            console.log('注册成功');
            // serviceWorker 是有作用域的,这里作用域是/report,如果是其他路径(例如/alarm)用到这个serviceWorker,它也不会工作。但是/report/**/* 都是可以生效的
            console.log('作用域是:' + res.scope);
        }).catch(e => {
            console.log('注册失败');
        })
    }
</script>

2. 安装

// /report/sw.js 片段
const CACHE_NAME = 'my-cache';
const cacheList = ['./index.html']
this.addEventListener('install', ev => {
    // waitUntil 传入 Promise,判断安装时间和成功与否
    ev.waitUntil(
        // 如果有则打开,不存在则创建这个 'my-cache' 缓存空间
        caches.open(CACHE_NAME).then(myCache => {
            // 往缓存里面存文件
            // return 出去形成 Promise 链,否则,caches.open 成功后, waitUntil 就以为已经安装成功了
            return myCache.addAll(cacheList);
        })
    )
})

3. 拦截请求并缓存

// /report/sw.js 片段
const CACHE_NAME = 'my-cache';

//....

this. addEventListener('fetch', ev => {
    // respondWith 传入一个 Promise,作为返回给页面的响应
    ev.respondWith(
        // 在所有缓存里面找是否有e.request的缓存
        caches.match(ev.request).then(res => {
            if (res) {
                return res;
            }
            return fetch(ev.request).then(res => {
                // 缓存的res需要先克隆,因为 res 会先 return 出去给页面使用,被使用后的 res 添加缓存会报错
                const resClone = res.clone();
                // 缓存新请求
                caches.open(CACHE_NAME).then(cache => {
                    cache.put(ev.request, resClone);
                })
                return res;
            })
        })
    )
})

不克隆,直接加入缓存会报错

serviceWorker第1张

免责声明:文章转载自《serviceWorker》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php5.6安装秀丸编辑器在宏中设置文本替换正则表达式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于Redis缓存预热的思考

系统上线时,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。 这里我考虑2个问题: A、哪些数据需要预热? B、如何预热? 关于问题A,根据不同的业务系统有不同的方法。 可以将已知的热门数据加载到Redis,这种方法适合于基本不变化的数据; 使用redis-faina(https://github.co...

手把手教你Smarty缓存技术(转)

大家应该知道缓存机制能能有效的减轻网站的服务器压力,Smarty模板引擎的一大亮点就是为我们提供了非常简单的缓存操作,下面就让我们学习一下。 首先我们要知道Smarty缓存机制分为全局缓存,部分缓存,局部缓存三种,我们一一介绍。 1、全局缓存 顾名思义,全局缓存就是为整个网站的全部页面都生成缓存页面。 首先我们要操作smarty的配置文件,开启缓存,指定缓...

Nginx压力测试及通用优化

nginx压测工具AB:ab由httpd-tools软件自带 1、安装压测工具AB [root@client1 /]# yum install httpd-tools -y 2、了解压测工具的使用方式 [root@client1 /]# ab -n 200 -c 2 http://127.0.0.1/ -n总的请求熟练 -c并发请求数 -k是否开启长连接...

DateUtil

public class GenernalDate { //一天秒数 public final static long MILLISECONDS_OF_DAY = 1000 * 60 * 60 * 24; public final static int NULL_DATE = 19000101; private fi...

【Web技术】276- WebView缓存原理分析和应用

前言 混合式开发,在产品体验以及页面加载速度的体验上已经非比以往的。今日早读文章由@unclechen分享。 正文从这开始~ 一、背景 现在的App开发,或多或少都会用到Hybrid模式,到了WebView这边,经常会加载一些js文件(例如和WebView用来Native通信的bridge.js),而这些js文件不会经常发生变化,所以我们希望js在Web...

更新js缓存办法

http://zhenggm.iteye.com/blog/680600 遇到的问题:在访问量比较大的系统中,我们需要将一些静态的文件在客户端缓存,以减少下载的流量,从而加快客户端访问的速度。但是缓存会带来一个问题,就是如何在服务端更新完文件之后,客户端能够及时得到更新。 解决思路:1. 在一个配置文件中维护js文件map; 2. 在页面中通过js ma...