离线与缓存

资源请求的拦截代理:

1、资源请求的判断:

(1)fetch 事件会拦截页面上所有的网络资源请求,但我们通常只对部分资源请求进行处理,

其余的请求会继续走浏览器默认的资源请求流程

(2)fetch 事件回调参数的 event.request 属性描述了当前被拦截的资源请求,可以通过它来进行判断分类。

event.request 是 Request 对象的实例,包含了资源请求的 URL、请求模式、请求头等全部信息

(3)一般情况下,资源请求的判断可以通过对 event.request.url 进行匹配来实现

// 全等匹配
if (event.request.url === 'http://127.0.0.1:8080/data.txt') {
// 匹配成功
} // 正则匹配
if (/\/data\.txt/.test(event.request.url)) {
// 匹配成功
} // 借助 URL 进行匹配
let url = new URL(event.request.url)
if (
url.hostname === '127.0.0.1' &&
url.port === '8080' &&
url.pathname === '/data.txt'
) {
// 匹配成功
}

注:正则表达式可参考我之前的随笔 https://www.cnblogs.com/lemonyam/p/10649030.html

2、资源请求的响应:

(1)fetch 事件回调参数的方法 event.respondWith(r) 可以指定资源请求的响应结果

(2)respondWith(r) 方法的参数 r 可以是一个 Response 对象实例,也可以是一个 Promise 对象,这个 Promise 对象

在异步执行完成的时候同样需要 resolve 返回一个 Response 对象实例作为请求的响应结果

// 直接返回 Response 对象
event.respondWith(new Response('Hello World!')) // 等待 1 秒钟之后异步返回 Response 对象
event.respondWith(new Promise(resolve => {
setTimeout(() => {
resolve(new Response('Hello World!'))
}, 1000)
}))

3、异步资源请求响应:

(1)event.respondWith 方法与 install、activate 事件回调参数中的 event.waitUntil 类似,

起到了扩展延长 fetch 事件生命周期的作用

(2)在 fetch 事件回调同步执行完毕之前如果没有调用 event.respondWith(r) 指定资源响应结果,

那么就会进入浏览器默认的资源请求流程当中

// 错误用法
self.addEventListener('fetch', event => {
if (event.request.url === 'http://127.0.0.1:8080/data.txt') {
setTimeout(() => {
event.respondWith(new Response('Hello World!'))
}, 1000)
}
}) // 正确用法 // 等待 1 秒钟之后异步返回 Response 对象
event.respondWith(new Promise(resolve => {
setTimeout(() => {
resolve(new Response('Hello World!'))
}, 1000)
}))

4、资源请求响应的错误处理:

(1)当使用了 event.respondWith 指定资源响应之后,无论是以同步还是异步的方式,最终都需要返回 Response 对象

(2)在调用 event.respondWith 的时候,需要主动捕获并处理错误、异常返回结果

5、资源请求与响应操作的管理:

fetch 事件回调当中主要进行着资源请求匹配和响应结果返回的操作,可以把这个过程当做一个路由分发的问题,

因此我们可以封装一个 Router 类来实现对路由的匹配规则和操作分发的统一管理

本地存储管理:

1、因为基于性能上的考虑,Service Worker 在设计标准时就要求了任何耗时操作必须异步实现。这也导致了在

Service Worker 作用域下能够使,目前只有 Cache API 和 IndexedDB,因为目前只有二者在功能实现上全部

采用了异步形式,而其他诸如 localStorage 属于同步方法,因此无法在 Service Worker 中使用

2、Cache API 与 IndexedDB 的应用场景:

(1)Cache API 适用于请求响应的本地存储:为资源请求与响应的存储量身定做的,它采用了键值对的数据模型

存储格式,以请求对象为键、响应对象为值,正好对应了发起网络资源请求时请求与响应一一对应的关系

(2)IndexedDB 是一种非关系型数据库,它的存储对象主要是数据,比如数字、字符串、Plain Objects、Array 等,

以及少量特殊对象比如 Date、RegExp 等等,对于 Request、Response 这些是无法直接被 IndexedDB 存储的

(3)Cache API 和 IndexedDB 在功能上是互补的。在设计本地资源缓存方案时通常以 Cache API 为主,

但在一些复杂的场景下,Cache API 这种请求与响应一一对应的形式存在着局限性,因此需要结合上功能上更为

灵活的 IndexedDB,通过 IndexedDB 存取一些关键的数据信息,辅助 Cache API 进行资源管理

3、缓存注意项:

(1)本地存储空间是有限的:浏览器提供了 StorageEstimate API 去查询当前缓存空间的使用情况

navigator.storage.estimate()
.then(estimate => {
// 设备为当前域名所分配的存储空间总大小
console.log(estimate.quota)
// 当前域名已经使用的存储空间大小
console.log(estimate.usage)
})

(2)资源的存取过程可能会失败:应该随时做好存取失败时的异常捕获与降级方案,确保程序运行时不会出错

(3)存储的资源可能会过期:要及时做好资源的更新和旧资源的清理工作

PWA 学习笔记(五)的更多相关文章

  1. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  7. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  8. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  9. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

随机推荐

  1. 移动开发在路上-- IOS移动开发系列 网络交互四(1)

    最近一段时间上班忙的没日没夜的,不是披星戴月,就是头天早上出门,第二天早上回家...一直没出处时间来更新博客,码农之苦,说了都是泪,废话不多说,直接本主题,经过之前三篇的讲述,ios开发的东西大家或多 ...

  2. DRF Django REST framework 之 频率,响应器与分页器组件(六)

    频率组件 频率组件类似于权限组件,它判断是否给予请求通过.频率指示临时状态,并用于控制客户端可以向API发出的请求的速率. 与权限一样,可以使用多个调节器.API可能会对未经身份验证的请求进行限制,而 ...

  3. 如何正确的使用Python解释器?你之前肯定用错了

    作为python开发者,当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件.由于整个Python语言从 ...

  4. ARTS-S 最难的事情

    小朋友不舒服,看了医生也开了药吃了.但还是一直闹,不睡觉,弄的我和我爱人精疲力尽. 现在看来,技术上的难题真不算什么.照顾小朋友才是这个世界上最难的事情.

  5. Orleans在.net core的开发

    Goods 服务 启动 using System; using System.Collections.Generic; using System.Linq; using System.Net; usi ...

  6. 基于iCamera App Kit 测试oV5640 500w分辨率 摄像头 总结

    基于iCamera App Kit 测试oV5640 摄像头 总结 iCamera App Kit 下载地址 http://pan.baidu.com/s/1kUMIwB1 可以参考下载链接的说明手册 ...

  7. linux—ln

    1.  软连接:不可删除源文件,删除源文件导致链接文件找不到,出现红色闪烁. 2.  硬链接:  源文件删除后,链接文件可以正常打开,链接前后的文件inode号相同,硬链接只能针对文件做链接,,不能针 ...

  8. nmap扫描、信息收集(网安全实训第一天)

    本期内容:网站信息收集.nmap扫描 1. 信息收集 2. nmap扫描1.信息收集 (1)确定目标 首先,我们确定攻击目标,在这里,我们随便找一个网站做测试,我以码云为例. (2)nslookup查 ...

  9. JQuery 操作checkbox

    获取checkbox选中的状态 deleteAll全选的name 1. $("input[name='deleteAll']").is(":checked") ...

  10. diff命令的妙用

    在读<Writing compilers and Interpreters>一书时需要按章节修改代码,由于实在一行一行比对实在难受,于是想了个办法,利用diff命令比较两章之间代码的修改位 ...