服务人员的等待状态。

时间:2018-06-29 14:58:01

标签: javascript browser service-worker

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

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

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

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

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

如果有人可以用简单的方式解释问题,那将非常有帮助。

1 个答案:

答案 0 :(得分:0)

这个问题也经常使我感到困惑,所以我将尝试弥补一些例子,并希望为我们两个人澄清。

示例1

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

  • 您的网站要求提供猫的照片
  • 您的服务人员拦截了猫的图片,并将其替换为狗的图片

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

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

如果安装了v1 SW的用户现在访问该站点,并且将v2服务工作器设置为立即激活,则会出现种族:

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

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

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

  

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

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

示例2

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

  • 您的后端端点返回JSON以获取动态内容
  • 服务工作者使用先缓存策略为index.html提供服务
  • 服务人员在您的网站中处理模板(因此,当从终结点获取某些JSON时,服务人员会从中获取HTML并将可插入的HTML返回到页面-here is an example of that

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

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

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

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

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

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