【前-workbox-模块1】workbox

1、什么是workbox SW

workbox-sw模块提供了一种非常简单的方法来启动和运行Workbox模块,并简化了Workbox模块的加载,也提供了一些简单的帮助方法。

开发者可以通过官方的CDN使用workbox-sw,或者将它与自己服务器上的一组workbox文件一起使用。

2、使用workbox sw 通过cdn

开始使用此模块的最简单方法是通过CDN。 开发者只需将以下内容添加到sw.js:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js');

添加了这段代码,开发者将在服务工作者中拥有workbox名空间,该命名空间将提供对所有Workbox模块的访问。

当第一次引用这些模块时,workbox-sw将检测到该模块并在使模块可用之前加载该模块。 您可以在DevTools的网络选项卡中看到这种情况。

这些文件将由浏览器缓存,以供将来离线使用

3、使用本地 Workbox Files

如果不想使用CDN,则可以轻松切换到自己域中托管的Workbox文件。

最简单的方法是通过workbox-cli的copyLibraries命令或GitHub Release获取文件,然后通过modulePathPrefix配置选项告诉workbox-sw在哪里找到这些文件。

如果你把文件放在/ third_party / workbox /下,你会像这样使用它们:

importScripts('/third_party/workbox/workbox-sw.js');

workbox.setConfig({
  modulePathPrefix: '/third_party/workbox/'
});

这样你就能使用本地的workbox files

4、避免异步导入

在整个workbox体系下,第一次加载新模块涉及调用importScripts()以及相应JavaScript文件的路径(在CDN上托管,或通过本地URL)。 在任何一种情况下,都有一个重要的限制:对importScripts()的隐式调用只能在service worker的安装处理程序内部或在service worker脚本的同步初始执行期间发生。

为了避免违反此限制,最佳做法是在任何事件处理程序或异步函数之外,使用workbox.*的引用方式来控制命名空间。

例如,以下sw.js的代码就符合要求:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js');

// This will work!
workbox.routing.registerRoute(
  new RegExp('\.png$'),
  workbox.strategies.cacheFirst()
);

但是,如果没有在sw.js的其他位置引用workbox.strategies,则此代码可能会出现问题:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js');

self.addEventListener('fetch', (event) => {
  if (event.request.url.endsWith('.png')) {
    //这段代码会导致workbox-strategies.js在一个fetch函数的处理线程中被引用,应该
    // 在这个初始化步骤之外,同步地执行。
    const cacheFirst = workbox.strategies.cacheFirst();
    event.respondWith(cacheFirst.makeRequest({request: event.request}));
  }
});

如果需要编写会违反限制的代码,则可以使用workbox.loadModule()方法显式触发事件处理程序之外的importScripts()调用:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js');

// 这将触发workbox.strategies及其依赖项的importScripts()
workbox.loadModule('workbox-strategies');

self.addEventListener('fetch', (event) => {
  if (event.request.url.endsWith('.png')) {
    // 引用workbox.strategies现在将按预期工作。
    const cacheFirst = workbox.strategies.cacheFirst();
    event.respondWith(cacheFirst.makeRequest({request: event.request}));
  }
});

或者,开发者可以在事件处理程序之外创建对相关命名空间的引用,然后在以后使用该引用:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.4.1/workbox-sw.js');

// 这将触发workbox.strategies及其依赖项的importScripts()
const {strategies} = workbox;

self.addEventListener('fetch', (event) => {
  if (event.request.url.endsWith('.png')) {
    //使用先前初始化的策略将按预期工作。
    const cacheFirst = strategies.cacheFirst();
    event.respondWith(cacheFirst.makeRequest({request: event.request}));
  }
});

某些版本的Chrome不遵守此限制,并且对importScripts()的异步调用不会触发预期的失败。 建议开发人员不要依赖这种破坏的行为。 Chrome计划进行更改以开始禁用此用法,使其与其他浏览器的功能一致。

5、强制使用调试或生产构建

所有Workbox模块都带有两个版本,一个包含日志记录和其他类型检查的调试版本,以及一个剥离日志记录和类型检查的生成版本。

默认情况下,workbox-sw将使用localhost上的站点的调试版本,但对于任何其他源,它将使用生成版本。

如果要强制调试或生成版本,请设置debug config选项。

workbox.setConfig({
  debug: 
});

6、Skip Waiting 和 Clients Claim

一些开发人员希望能够发布新的service worker并让其尽快更新和控制网页,从而跳过默认的service woker的生命周期。

如果确实需要这么做,workbox-sw提供了一些帮助方法来简化:

workbox.skipWaiting();
workbox.clientsClaim();

如果网络应用程序延迟加载具了有唯一版本的资源,例如其网址中的哈希值,则建议避免使用skip waiting。 在延迟加载先前已预先缓存并在service worker激活状态下,更新期间清除URL时,启用它可能会导致失败。

笔者个人订阅号~欢迎小伙伴们关注


微信公众号-感谢关注

若有疑问可以QQ联系笔者,虽然不一定100%解决你的问题,但是可以交流探讨一波:2276604211

顺便打个广告:如果有想入职中国银联上海技术开发的童鞋,也可以加上面的QQ资讯,笔者可以帮你回答一些相关问题~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 我,只想做我本来的样子。做个简简单单的自己。 也许有人说我太直,太白,太傻,太纯真。虽然说我许多时候都是多愁善感的...
    咸小雨阅读 592评论 2 3
  • 上班族的我们,正如一首歌所唱“坐在格子间敲打着手指,却感觉生命此刻像是静止。”生命静止,脂肪却在悄悄生长。所以,胖...
    Back2脊态健康阅读 377评论 0 0
  • 优秀的人总是有某些优秀的特质。军训晚会上的一段拉丁舞使得冯思妍成了系里的名人,辅导员让她竞选班长,可她只愿当个宣...
    陌上宁秋阅读 168评论 0 0