推荐阅读:Service Worker 简介

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

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

基本使用:

1. 注册

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

2. 安装

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

3. 拦截请求并缓存

  1. // /report/sw.js 片段
  2. const CACHE_NAME = 'my-cache';
  3.  
  4. //....
  5.  
  6. this. addEventListener('fetch', ev => {
  7. // respondWith 传入一个 Promise,作为返回给页面的响应
  8. ev.respondWith(
  9. // 在所有缓存里面找是否有e.request的缓存
  10. caches.match(ev.request).then(res => {
  11. if (res) {
  12. return res;
  13. }
  14. return fetch(ev.request).then(res => {
  15. // 缓存的res需要先克隆,因为 res 会先 return 出去给页面使用,被使用后的 res 添加缓存会报错
  16. const resClone = res.clone();
  17. // 缓存新请求
  18. caches.open(CACHE_NAME).then(cache => {
  19. cache.put(ev.request, resClone);
  20. })
  21. return res;
  22. })
  23. })
  24. )
  25. })

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

serviceWorker的更多相关文章

  1. WebWorker SharedWorker ServiceWorker

    WebWorker 是什么? 为 JavaScript 引入线程技术 不必再用 setTimeout().setInterval().XMLHttpRequest 来模拟并行 Worker 利用类似线 ...

  2. Web离线应用解决方案——ServiceWorker

    什么是ServiceWorker 在介绍ServiceWorker之前,我们先来谈谈PWA.PWA (Progressive Web Apps) 是一种 Web App 新模型,并不是具体指某一种前沿 ...

  3. ServiceWorker.state

    [ServiceWorker.state] ServiceWorker.state The state read-only property of the ServiceWorker interfac ...

  4. 初识 ServiceWorker

    初识ServiceWorker 初识ServiceWorker 在8月份的时候.W3C更新了一个叫Service Workers的API. 了解过HTML5中的Web Worker的人可能会对这个AP ...

  5. ServiceWorker pwa缓存

    index.js if ( navigator.serviceWorker ) { console.log("cache index") window.addEventListen ...

  6. js操作serviceWorker缓存静态文件

    js操作serviceWorker缓存静态文件 serviceWorker的作用就是用来做离线应用的,在手机端程序中用的较多 先看下效果 index.html <!DOCTYPE html> ...

  7. service-worker实践

    service-worker虽然已列入标准,但是支持的浏览器还是有限制,还有比较多的问题. 1. 生命周期 注册成功-------installing--------------> 安装成功(i ...

  8. PWA之serviceWorker应用

    1.serviceWorker介绍service worker是一段运行在浏览器后台的JavaScript脚本,在页面中注册并安装成功后,它可以拦截和处理网络请求,实现缓存资源并可在离线时响应用户的请 ...

  9. webpack3 + vue 添加 serviceWorker

    新的vue脚手架已经可以自带pwa了,本文主要针对旧版的webpack. 先装三个插件: $npm i register-service-worker sw-precache-webpack-plug ...

  10. 利用ServiceWorker实现页面的快速加载和离线访问

    Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理.它们旨在(除其他之外)使得能够创建有效的离线体验,拦截网络请求并基于网络是 ...

随机推荐

  1. C#用户控件实战01_CSS布局

    很多应用系统的主页布局,一般采用如下案例所示布局较多,如下图的CSS布局框架,上.中.下,接下来我们演示,在C#中实现如下的业务架构布局. 代码范例: 在<body></body&g ...

  2. DropDownList下拉控件

    <asp:DropDownList    ID="DropDownList1" runat="server" Width="177px" ...

  3. .net mvc 迁移到 .netcore

    迁移的时候发现,ef6 不能添加 到  .NET Standard2  的类库,因为不兼容, 6 以上的版本只能用于  .net 4.5 以上 只能用别的

  4. 如何将SolidWorks文件另存为.obj文件及如何打开.obj格式文件

    原网站:http://fans.solidworks.com.cn/forum.php?mod=viewthread&tid=40238) OBJ文件是Alias Wavefront公司为它的 ...

  5. 【转】Java最常见的200+面试题

    今天看到一份面试题总结,感觉很到位,主要包括以下模块:Java基础.容器.多线程.反射.对象拷贝.Java Web模块,异常.网络.设计模式.Spring/Spring MVC .Spring Boo ...

  6. 采用localStorage做定时缓存

    背景 页面采用ajax获取数据时,每访问一次就会发送一次请求向服务端获取数据,可是呢. 有些数据更新的又不频繁,所以我就想着使用localStorage进行本地存储,然后在固定间隔时在去更新数据.(下 ...

  7. day01-02

  8. sql server存储过程解密

    解密存储过程: USE [RYTreasureDB] GO /****** Object: StoredProcedure [dbo].[sp__windbi$decrypt] Script Date ...

  9. Android 在同一台设备上安装多个同一项目的apk

    如果设备上已经安装了一个apk,再次安装这个apk就会提示覆盖前面的应用 解决办法: 方法一:手动改包名 不好改,改了几次都不成功(可能是代码在svn管理的原因,改完后文件夹里的代码就没了),确实不实 ...

  10. Centos 6.5 Apache服务安装

     Apache是什么: Apache HTTP Server(简称Apache)是Apache软件基金会的一个高性能.功能强大.稳定可靠.又很灵活的开发源代码的web服务软件,对linux的支持相对好 ...