服务工作者可以做些什么,而 Web 工作者不能做什么?
服务工作者可以做些什么,而 Web 工作者不能做什么?反之亦然?
Web 工作线程似乎是服务工作线程功能的子集。这是正确的吗?
服务工作者可以做些什么,而 Web 工作者不能做什么?反之亦然?
Web 工作线程似乎是服务工作线程功能的子集。这是正确的吗?
Buksy的答案是正确的,但在我看来,它没有回答最初的问题,即:“服务工作者可以做些什么,而网络工作者不能做什么?反之亦然?
它们的生命周期和每个源可以拥有的实例数存在根本差异。总之:
| Web Workers | Service Workers |
|--------------|--------------|------------------|
| Instances | Many per tab | One for all tabs |
| Lifespan | Same as tab | Independent |
| Intended use | Parallelism | Offline support |
Buksy的答案基本上是桌子的最后一行。Credit: 我从 Nolan Lawson 的《揭开 Web Workers and Service Workers 的神秘面纱》中选取了这张表,从第 35 张幻灯片开始。
特别是,以下是生成和终止Web工作线程的方法:
而服务工作者有自己的生命周期,这无疑是他们“最复杂的部分”:
因此,生命循环是两者之间的一个根本区别(其预期用途的结果)。
过去,浏览器支持存在巨大差异:在 iOS 版 Safari 中,服务工作线程在 11.3(2018 年 3 月 29 日)之前根本不可用,请参阅我可以使用服务工作线程吗?相比之下,Web worker在2012年已经有了更好的浏览器支持:我可以使用Web Worker吗?
如果您必须支持IE11,则只能使用Web工作线程:IE11没有服务工作线程,显然对IE11的支持将于2025年10月14日结束。
它们在跨浏览器的API支持方面存在细微差异,请参阅HTML5 Worker Test(也是Nolan Lawson)。在特定的浏览器中,一种工作线程可能支持某个 API 调用,而另一种则不支持。访问该页面并测试您自己的浏览器!
它们的用途有很大的不同:
网络工作者
Web Workers 为 Web 内容提供了一种在后台线程中运行脚本的简单方法。工作线程可以在不干扰用户界面的情况下执行任务。此外,它们还可以使用 XMLHttpRequest 执行 I/O(尽管 responseXML 和通道属性始终为 null)。创建后,工作线程可以通过将消息发布到由该代码指定的事件处理程序(反之亦然)将消息发送到创建该消息的 JavaScript 代码。
服务工作者
服务工作线程实质上充当位于 Web 应用程序与浏览器和网络(如果可用)之间的代理服务器。它们旨在(除其他事项外)能够创建有效的离线体验,拦截网络请求并根据网络是否可用以及更新的资产是否驻留在服务器上采取适当的措施。它们还将允许访问推送通知和后台同步 API。
因此,Web Worker 可以方便地运行昂贵的脚本,而不会导致用户界面冻结,而 Service Workers 可用于修改来自网络请求的响应(例如,在构建脱机应用程序时)。