繁体   English   中英

服务人员的等待状态。

[英]Waiting state of a service worker.

服务人员可以在其生命中处于三种状态。

第一状态是已安装状态,表示服务工作者完成安装时。

第三种状态是活动状态,这意味着服务工作者现在可以干预来自服务工作者范围内的加载页面的请求。

还有一个称为等待状态的状态,这表示服务工作者已安装但正在等待,因为当前有其他一些服务工作者处于活动状态。

我看过的大多数地方都有这样的解释:“新服务人员正在等待,因为要确保您的网站在给定的时间仅运行一个版本。” 解释听起来很简单,但实际上我没有弄清楚原因,“一次只提供1个版本”是什么意思。

如果有人可以用简单的术语解释问题,那将真的很有帮助。

这个问题也常常使我感到困惑,因此我将尝试弥补一些例子,并希望为我们双方都阐明一下。

例子1

假设您的网站版本为1,服务人员为版本1:

  • 您的网站要求提供猫的图片
  • 您的服务人员会截取猫的图片,并用狗的图片代替

然后,将服务工作者更新为v2:

  • 现在您的软件拦截了猫的图片,并用兔子的图片代替了它们

如果安装了v1 SW的用户现在访问该站点,并且将v2 Service Worker设置为立即激活,则会发生种族冲突:

  • 如果在提出图像请求之前已获取,安装并激活了v2 SW(可能是在用户输入时请求的,或者是延迟加载的或缓慢的),则猫图像将被替换为兔子
  • 但是,如果在激活v2 SW之前请求猫图片,则该图片将被狗替换

因此,如果这不仅是动物图片,还很重要,那么您的网站可能会因某些时间而中断。

这个例子来自杰克·阿奇博尔德(Jake Archibald)(我可能是杀了它),他在那里链接了一个演示应用程序,但是我认为本文本身并没有具体说明风险。 但想法是

“ skipWaiting()意味着您的新服务人员可能正在控制加载了旧版本的页面。这意味着您的某些页面提取操作将由您的旧服务人员处理,但是您的新服务人员将处理后续的提取操作。 ”

其中的skipWaiting与立即激活相同。 要继续进行后续页面加载的想法...

例子2

再次假设您拥有网站的版本1和版本1的服务人员:

  • 您的后端端点返回JSON以获取动态内容
  • 服务工作者使用缓存优先策略为index.html提供服务
  • 服务人员在您的站点中处理模板(因此,当从终结点获取某些JSON时,服务人员从中获取HTML并将现成的HTML返回到页面- 这是一个示例

但是,然后您决定只对页面本身进行模板化,因为这对于不支持Service Worker的浏览器更有意义。 您实现站点的版本2和服务工作者的版本2:

  • 现在,服务工作者直接返回JSON(在SW中没有模板)
  • 该页面需要JSON并在那里呈现模板。

现在,如果用户在发布v2之后刷新了自己的应用(假设他们在v1期间访问过):

  • 他们的活动v1服务工作人员将从缓存中提供v1 index.html,该缓存期望HTML可在请求时返回。
  • v2服务人员将要安装

如果v2服务工作者现在被激活,他们将拥有一个v1 index.html页面,该页面期望来自请求的模板HTML,但是您的新v2服务工作者将返回JSON。

我在这里可能是错的,因此我愿意接受其他建议,但我认为我会对此持怀疑态度。 希望有帮助吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM