1、什么是Workbox Strategies?

当service workers 首次被引入时,可以设定一组常见的缓存策略。 缓存策略是一种模式,用于确定service workers 在收到fetch事件后如何生成响应。

workbox-strategies提供了最常用的缓存策略,因此很容易将它们应用到服务工作者中。

我们不会在Workbox支持的策略之外详细介绍,但你可以在Offline Cookbook中了解更多信息

2、使用策略

在以下示例中,我们将向你展示如何在workbox-routing中使用Workbox缓存策略。 你可以使用本文的“配置策略”部分中介绍的每种策略定义一些选项。

在高级用法部分,我们将介绍如何在没有workbox-routing的情况下直接使用缓存策略。

下面我们将介绍几种基本的策略

2.1 Stale-While-Revalidate

 
 

stale-while-revalidate模式允许你使用缓存的内容尽快响应请求(如果可用),如果未缓存,则回退到网络请求。 然后,网络请求用于更新缓存。

这是一种相当常见的策略,适合更新频率很高但重要性要求不高(至少允许一次缓存读取)的内容。在有缓存的情况下,该模式保证了客户端第一时间拿到数据的同时,也会去请求网络资源更新缓存,保证下次客户端从缓存中读取的数据是最新的。因此该模式不能减轻后台服务器的访问压力,但却能给前端用户提供快速响应的体验。

 workbox.routing.registerRoute( // 当是资源js文件的时候
new RegExp('(app|manifest|vendor)+.js'),
workbox.strategies.staleWhileRevalidate({
cacheName: 'main-js'
})
)

  

2.2 Cache First (缓存优先,缓存回落到网络)

 
 

离线Web应用程序将严重依赖缓存,但对于非关键且可逐步缓存的资产,首先缓存是最佳选择。

如果缓存中有响应,则将使用缓存的响应来完成请求,根本不会使用网络。 如果没有缓存的响应,则将通过网络请求来满足请求,并且将缓存响应,以便直接从缓存提供下一个请求。

该模式可以在为前端提供快速响应的同时,减轻后台服务器的访问压力。但是数据的时效性就需要开发者通过设置缓存过期时间或更改sw.js里面的修订标识来完成缓存文件的更新。一般需要结合实际的业务场景来判断数据的时效性。

workbox.routing.registerRoute(
new RegExp('/styles/'),
workbox.strategies.cacheFirst()
);

2.3 Network First (网络回落到缓存)

对于经常更新且关键(由业务判断出来)的请求,网络优先策略是理想的解决方案。 默认情况下,它将尝试从网络获取最新请求。 如果请求成功,它会将响应放入缓存中。 如果网络无法返回响应,则将使用缓存响应。

 
 
workbox.routing.registerRoute(
new RegExp('/index/'),
workbox.strategies.networkFirst()
);

这意味着只要当第一次请求成功时,service worker就会缓存一份请求结果。当后续重复请求时,缓存也会每次更新。

若网络请求失败时,只要缓存里有内容,就能让前端获取一个响应(从service worker的缓存里)。因此,此种模式提高了前端页面的稳固性,即使在网络请求失败的情况下,页面也能从上次的缓存中读取到数据展示,而不是粗鲁的告诉用户网络请求失败的一个响应。

workbox.routing.registerRoute(
new RegExp('/index/'),
workbox.strategies.networkFirst()
);

2.4 Network Only

 
 

如果你需要从网络中完成特定请求,则首先要使用网络策略。

workbox.routing.registerRoute(
new RegExp('/admin/'),
workbox.strategies.networkOnly()
);

2.5 Cache Only

 
 

仅缓存策略确保从缓存获取请求。 这在workbox中不太常见,但如果你有自己的预先缓存步骤则可能很有用。

workbox.routing.registerRoute(
new RegExp('/app/v2/'),
workbox.strategies.cacheOnly()
);

3、配置策略

所有策略都允许你配置:

  • 要在策略中使用的缓存的名称。
  • 缓存在策略中使用的过期限制。
  • 一组插件,在获取和缓存请求时将调用其生命周期方法。

3.1 更改策略使用的缓存

你可以通过提供缓存名称来更改缓存所使用的策略。 如果要分离资源以帮助调试,这非常有用。

workbox.routing.registerRoute(
new RegExp('/images/'),
workbox.strategies.cacheFirst({
cacheName: 'image-cache',
})
);

3.2 使用插件

Workbox附带了一组可以与这些策略一起使用的插件。

  • workbox.expiration.Plugin
  • workbox.cacheableResponse.Plugin
  • workbox.broadcastUpdate.Plugin
  • workbox.backgroundSync.Plugin
    要使用任何这些插件(或自定义插件),你只需将实例传递给插件选项。

后续文章会专门介绍这些插件模块的用法。

workbox.routing.registerRoute(
new RegExp('/images/'),
workbox.strategies.cacheFirst({
cacheName: 'image-cache',
plugins: [
new workbox.expiration.Plugin({
// Only cache requests for a week
maxAgeSeconds: 7 * 24 * 60 * 60,
// Only cache 10 requests.
maxEntries: 10,
}),
]
})
);

4、高级用法

如果要在自己的fetch事件逻辑中使用策略,可以使用策略类通过特定策略运行请求。

例如,要实现stale-while-revalidate类,您可以执行以下操作:

self.addEventListener('fetch', (event) => {
if (event.request.url === '/') {
const staleWhileRevalidate = new workbox.strategies.StaleWhileRevalidate();
event.respondWith(staleWhileRevalidate.handle({event}));
}
});

Workbox使用策略的更多相关文章

  1. 高性能Javascript--脚本的无阻塞加载策略

    Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 .原因是,事实上,大多数浏览器使用单进程处理U ...

  2. javascript设计模式:策略模式

    前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...

  3. Unity3D 5.3 新版AssetBundle使用方案及策略

    1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...

  4. StrategyPattern (策略模式)

    /** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...

  5. 直播推流端弱网优化策略 | 直播 SDK 性能优化实践

    弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

  6. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

  7. .NET面试题系列[5] - 垃圾回收:概念与策略

    面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...

  8. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  9. 《深入理解Java虚拟机》内存分配策略

    上节学习回顾 1.判断对象存活算法:引用计数法和可行性分析算法 2.垃圾收集算法:标记-清除算法.复制算法.标记-整理算法 3.垃圾收集器: Serial:新生代收集器,采用复制算法,单线程. Par ...

随机推荐

  1. k3 cloud查看附件提示授予目录NetWorkService读写权限

    打开文件的时候出现下面的提示: 解决办法: 解决办法:找到C:\Program Files(x86)\Kingdee\K3Cloud\WebSite\FileUpLoadServices,在下面创建F ...

  2. k3 cloud中提示总账期末结账提示过滤条件太长,请修改此过滤条件

    k3 cloud中提示总账期末结账提示过滤条件太长,请修改此过滤条件,如下图所示: 处理方法: 请尝试系统配置文件common.config中将如附件所示的参数值改大,建议值为2000,并在系统清理缓 ...

  3. java 进销存 商户管理 系统 管理 库存管理 销售报表springmvc SSM项目

    统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM 普 ...

  4. elasticsearch 基础 —— ReIndex

    Reindex会将一个索引的数据复制到另一个已存在的索引,但是并不会复制原索引的mapping(映射).shard(分片).replicas(副本)等配置信息. 一.reindex的常用操作 1.re ...

  5. Shell07--正则应用

    目录 1. 正则表达式概述 2. 正则表达式规则 3. 正则表达式之GREP文本过滤 4. 正则表达式之SED文本处理 5. 正则表达式之AWK文本处理 1. 正则表达式概述 01. 什么是正则表达式 ...

  6. SVN中trunk,branches,tags的使用明细--项目代码的管理

    SVN在项目开发过程中有两种模式: 第一种:Subversion有一个很标准的目录结构,是这样的.比如项目是proj,svn地址为svn://proj/,那么标准的svn布局svn://proj/|+ ...

  7. 系统调用的API以及汇编代码实现

    作者:严哲璟 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 系统调用过程为 ...

  8. Elastic Search快速入门

    https://blog.csdn.net/weixin_42633131/article/details/82902812 通过这个篇文章可以快速入门,快速搭建一个elastic search de ...

  9. GET和POST是HTTP请求的两种基本方法,区别是什么!?

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  10. Delphi 安装Cnpack cnvcl后界面不断弹出 Memory Manager's list capablity overflow ,please enlarge it!

    Delphi 安装Cnpack cnvcl后界面不断弹出 Memory Manager's list capablity overflow ,please enlarge it! 解决方法:删除指定  ...