服务工作者可以做什么,网络工作者不能?

时间:2016-07-28 09:45:03

标签: javascript html service-worker web-worker w3c

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

Web工作者似乎是服务工作者功能的一个子集。这是对的吗?

3 个答案:

答案 0 :(得分:74)

它们的用途有很大不同:

网络工作者

  

Web Workers为Web内容提供了一种在后台线程中运行脚本的简单方法。工作线程可以不执行任务   干扰用户界面。此外,他们可以执行I / O.   使用XMLHttpRequest(虽然是responseXML和channel属性   总是空的)。一旦创建,工作人员就可以向其发送消息   通过将消息发布到事件来创建它的JavaScript代码   该代码指定的处理程序(反之亦然。)

Source - Using Web Workers

服务工作者

  

服务工作者本质上充当位于Web之间的代理服务器   应用程序,浏览器和网络(如果可用)。他们是   旨在(除其他外)使创造有效   离线体验,拦截网络请求和接受   根据网络是否可用而采取适当行动   更新的资产驻留在服务器上。他们也将允许访问   推送通知和后台同步API。

Source - Service Worker API

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

答案 1 :(得分:34)

Buksy's answer是正确的,但我认为它不能回答最初的问题,即: “服务工作者可以做什么,而网络工作者无法做到?反之亦然?”

它们的生命周期和每个起源可以包含的实例数量存在根本差异。简而言之:

               | Web Workers  | Service Workers  |
|--------------|--------------|------------------|
| Instances    | Many per tab | One for all tabs |
| Lifespan     | Same as tab  | Independent      |
| Intended use | Parallelism  | Offline support  |

Buksy的答案基本上是表格的最后一行。信誉:我从Demystifying Web Workers and Service Workers开始,从Nolan Lawson的slide 35那里拿了这张桌子。

特别是,这是生成和终止Web Worker的方式:

Using Web Workers

而服务工作者有自己的生命周期,这无疑是他们“最复杂的部分”:

The Service Worker Lifecycle

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

过去,浏览器支持之间存在巨大差异:直到iOS 11.3(2018年3月29日)之前,服务工作者才在Safari for iOS中完全不可用,相反,Can I use service workers?已经在2012年:Can I use web workers?

跨浏览器的API支持之间存在细微的差异,请参见HTML5 Worker Test(也由Nolan Lawson撰写)。在特定的浏览器中,一种工作程序可能支持某个API调用,而另一种则不支持。访问该页面并测试您自己的浏览器!

答案 2 :(得分:0)

服务人员

enter image description here

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

BrowserWindow.getCurrentWindow().on('close', () => {
  // window was closed...
})

网络工作者

enter image description here

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

/* main.js */

navigator.serviceWorker.register('/service-worker.js');



/* service-worker.js */

// Install 
self.addEventListener('install', function(event) {
    // ...
});

// Activate 
self.addEventListener('activate', function(event) {
    // ...
});

// Listen for network requests from the main document
self.addEventListener('fetch', function(event) {
    // ...
});

原始帖子Here