217

服务工作者能做什么而网络工作者不能做什么?反之亦然?

网络工作者似乎是服务工作者功能的子集。这是正确的吗?

3个答案

重置为默认值
275

巴克西的回答是正确的,但在我看来,它没有回答最初的问题,即:“服务工作者能做什么而网络工作者不能做?反之亦然?”

它们的生命周期和每个源站可以拥有的实例数存在根本性差异。简而言之:

|网络工作者|服务工作者||--------------|--------------|------------------||实例|每个选项卡多个|所有选项卡一个||寿命|与标签相同|独立||预期用途|并行性|离线支持|

Buksy的答案基本上是表格的最后一行。学分:我从解密Web工作者和服务工作者作者Nolan Lawson,从幻灯片35.

特别是,以下是如何生成和终止web Worker:

使用Web Workers

然而,服务人员有自己的生命周期,这是公认的他们“最复杂的部分”:

服务工作者生命周期

所以生命周期是一个根本区别两者之间(预期用途的结果)。

在过去浏览器支持:在11.3(2018年3月29日)之前,Safari for iOS的服务人员根本不可用,请参阅我可以使用服务人员吗?相比之下,网络工作者在2012年已经有了更好的浏览器支持:我可以使用网络工作者吗?

如果你必须支持IE11,你只能使用网络工作者:IE11没有服务工作者,显然IE11的支持将于10月14日结束,2025.

它们之间存在细微的差异API支持跨浏览器,请参见HTML5工人测试(同样由诺兰·劳森撰写)。在特定的浏览器中,一种工作程序可能支持某个API调用,而另一种则不支持。访问该页面并测试您自己的浏览器!

  • 2
    服务工作者能做哪些共享网络工作者不能做的事情? 评论 2020年6月7日4:29
  • 6
    这并没有回答这个问题,即服务工作者能做什么,而网络工作者不能做什么。这个答案只粘贴了他们打算做什么的摘要,以及实例等方面的差异。没有任何标识表明服务人员可以做任何web工作人员不能做的事情。例如,web工作人员也可以像服务工作人员那样拦截请求并从缓存加载资源吗?网络工作者的寿命能比标签更长吗?也就是说,所谓的寿命限制有多严格?有什么方法可以强制改变寿命吗? 评论 2021年4月28日14:28
  • 这个答案信息丰富,有用,但也应该是自给自足的,而且不是完全的。如果不访问底层站点,链接到生命周期的中间部分将毫无用处。 评论 2023年3月22日16:53
208

它们的用途有很大不同:

网络工作者

WebWorkers为Web内容提供了一种在后台线程中运行脚本的简单方法。工作线程可以在没有干扰用户界面。此外,它们可以执行I/O使用XMLHttpRequest(尽管responseXML和channel属性始终为空)。创建后,工作程序可以向通过向事件发布消息创建它的JavaScript代码由该代码指定的处理程序(反之亦然)

源-使用Web Workers

服务工人

服务工作者本质上充当web之间的代理服务器应用程序、浏览器和网络(如果可用)。他们是旨在(除其他外)使离线体验、拦截网络请求和基于网络是否可用的适当操作,以及更新的资产位于服务器上。它们还将允许访问推送通知和后台同步API。

源-服务工作者API

因此,Web Workers可以方便地运行昂贵的脚本,而不会导致用户界面冻结,而Service Workers对于修改网络请求的响应很有用(例如,在构建脱机应用程序时)。

6
  • 11
    服务工作者能做什么而网络工作者不能做什么? 评论 2020年6月7日4:28
  • 1
    @Pacerier阅读了第二段引言和最后一段来回答你的问题 评论 2020年6月8日10:05
  • 5
    我同意Pacerier的观点,这并不能回答问题。我只告诉他们一个做什么,另一个做些什么。读者可能会根据它得出结论,但一个好的答案应该澄清,甚至可能确认或不确认读者的结论。
    – 千卡
    评论 2020年6月17日12:01
  • 1
    我喜欢阿里提供的另一个答案,它更广泛地描述了这两种技术之间的差异。但我认为我的回答的最后一段清楚地回答了这个问题Web Workers可以帮助您构建离线应用程序。如果您认为有更好的答案,请随意添加另一个:) 评论 2020年6月19日9:28
  • 2
    @Buksy,你评论中的一个拼写错误:[[服务]]工作人员可以帮助你构建离线应用程序 评论 2020年7月25日10:58
29

服务人员

在此处输入图像描述

服务工作者是浏览器和网络之间的代理。通过拦截文档发出的请求,服务工作者可以将请求重定向到缓存,从而实现脱机访问。

/*main.js(主要.js)*/navigator.serviceWorker.register('/service-worker.js');/*服务-工作.js*///安装self.addEventListener('install',函数(event){// ...});//激活self.addEventListener('activate',函数(event){// ...});//侦听来自主文档的网络请求self.addEventListener('fetch',function(event){// ...});

网络工作者

在此处输入图像描述

Web工作线程是通用脚本,它使我们能够从主线程中卸载处理器密集型的工作。

/*main.js(主要.js)*///创建辅助进程const myWorker=新工人('Worker.js');//向工作人员发送消息myWorker.postMessage(“你好!”);//从工作人员接收消息myWorker.onmessage=函数(e){控制台.log(e.data);}

原始职务在这里

1

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.