当前位置: 首页 > 知识库问答 >
问题:

工作箱:自我的危险。skipWaiting()

乌灿
2023-03-14

我使用Workbox预缓存渲染应用程序外壳所需的资产,包括基本版本的索引。html。Workbox假定索引。html在缓存中可用,否则,页面导航将失败,因为我已在我的Service Worker中注册了此项:

workbox.routing.registerNavigationRoute('/index.html');

我也有自己。安装侦听器中的skipWaiting()指令

self.addEventListener('install', e => {
  self.skipWaiting();
});

据我所知,现在有2个install侦听器:

  • 由Workbox注册用于预缓存资产(包括index.html)的工具
  • 我在Service Worker中手动注册的

当Workbox的安装侦听器失败时,self.skip等待()是否可能成功?这将导致资产没有被预缓存但Service Worker被激活的问题状态。这种情况可能吗?我应该防范它吗?

共有1个答案

蒋嘉颖
2023-03-14

我强烈建议将“服务人员生命周期”作为有关服务人员安装和更新的不同阶段的权威信息源。

总结该文章中的一些信息,因为它适用于您的问题:

>

  • Service Worker首先进入安装阶段,无论您注册了多少install侦听器,它们都将有机会执行。如您所建议的,Workbox创建自己的install侦听器来处理训练。

    只有当每个install监听器都无错误地完成时,Service Worker才会进入下一个阶段,这可能是等待(如果已经有一个使用以前版本的服务工作人员的打开客户端)或激活(如果没有客户端使用以前版本的Service Worker)。

    如果您选择使用它,它将绕过等待阶段,无论是否有任何使用以前版本的service worker的开放客户端。

    如果任何监听器安装失败,调用skipWaiting()将一事无成,因为服务人员永远不会离开安装阶段。这基本上是禁止的。

    当您还使用版本化的、预先缓存的资产的延迟加载时,需要注意的一点是使用skipWaiting()。正如文章警告的那样:

    警告:skipWaiting()表示您的新服务人员可能正在控制使用旧版本加载的页面。这意味着您页面的一些回迁将由旧的服务人员处理,但新的服务人员将处理后续的回迁。如果这可能会破坏一切,请不要使用skipWaiting()。

    因为延迟加载预先确定的版本化资产是2018年更常见的事情,所以Workbox默认不会为您调用skipWating()。由您选择使用它。

  •  类似资料:
    • 问题内容: 从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,这种技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理: Boxing 尝试不同的情况下后(),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看源代码时,发现它仅实现一个带参数的构造函数。 因此,我的结论是,自动装箱的概念基于

    • 问题内容: 为什么这么危险? 为什么建议改为使用? 我知道已弃用。还有什么使它不安全的? 有什么地方可以使用方法吗?如果是这样,请举一个例子。 问题答案: 为什么Thread.stop()如此危险? 此处详细描述了这些问题:http : //download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveD

    • 问题内容: 我不记得在哪里,但是最近我发表了一条评论,用户告诉我1TBS在JavaScript中比Allman更受青睐,并说Allman在JavaScript中有危险的含义。 这是有效的声明吗?如果是这样,为什么? 问题答案: 不能这样做: 被视为(return )而不是(return an object) 有关更多信息,请参见规则。

    • 我想在我的网站上有一个动态博客(使用React)。最初,我打算在数据库中以原始HTML存储帖子,并使用危险的HTML生成内容。然而,我对安全问题感到关切。虽然我的应用程序没有任何敏感数据,但我对XSS还不够精通,不知道打开我的应用程序会遇到哪些危险。 我很好奇,是否有一种高效、安全的方式在我的应用程序中动态加载博客页面。会使用https://github.com/odysseyscience/re

    • 问题内容: 我试图理解在“流文档”中发现的警告。我已经习惯了使用forEach()作为通用迭代器。这导致我编写这种类型的代码: 这是一个简单的例子。我了解该代码违反了Oracle关于有状态lamda和副作用的警告。但是我不明白为什么这个警告存在。 运行此代码时,它似乎表现出预期的效果。那么,我如何打破这一点来说明为什么这是一个坏主意? 在某种程度上,我读到以下内容: 如果并行执行,则ArrayLi

    • 自JDK5.0以来,Java引入了自动装箱/取消装箱。这个技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java是如何工作的。例如: 拳击 在尝试了不同的情况(、、、)后,编译器接受的唯一情况是做作运算符右侧值的类型为。当我查看的源代码时,我发现它只实现了一个带有参数的构造函数。 所以我的结论是自动装箱的概念是基于在包装类中实现的构造函数。