【前-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资讯,笔者可以帮你回答一些相关问题~~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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