HTML5中Shared Worker和Worker有什么区别?

66

也许值得一看 http://www.whatwg.org/specs/web-apps/current-work/complete/workers.html#shared-workers-introduction - James Wiseman
5个回答

48

非常基本的区别:一个 Worker 只能从创建它的脚本中访问,一个 SharedWorker 可以被来自同一域的任何脚本访问。


6
如果使用window.open在弹出窗口中创建SharedWorker,那么它可以访问其他具有相同源的SharedWorker。如果它们在一个全新的标签页上会怎样,我猜是不行的吧? - Tower
5
“同源”与生成另一个页面的页面无关。它大致指的是调用脚本的域名。请参见此图表。因此,两个位于example.com上的脚本,即使在不同的标签页上,也可以访问相同的“SharedWorker”。 - rvighne
那么,这是否意味着一个常规的WebWorker只能有一个连接,即使用户复制他们的选项卡从同一域运行相同的脚本?或者浏览器仍然认为它是相同的脚本?换句话说,app.js连接到worker.js,然后用户复制他们的选项卡:tab2仍然可以连接到worker.js吗?worker.js是否仍将在tab1的app.js和tab2的app.js之间维护相同的内存池?我感兴趣是因为我需要在后台进程/守护程序中维护队列结构,并从同一应用程序中的任何打开选项卡向这样的守护程序发布事件。 - Cody

17

这是什么意思?苹果不支持SharedWorker吗? - Pacerier
这意味着从Changeset 178310开始,苹果公司的WebKit已经移除了SharedWorkers的支持,并且没有计划重新引入它们的支持。 - charliebeckwith
苹果想成为新的Internet Explorer吗? - John Balvin Arias
7
很长一段时间以来,苹果/Safari 已经成为了新的 Internet Explorer。 :) - John Weisz
1
太好了!这里有一个链接,展示了对于SharedWorker的(糟糕)支持情况。https://caniuse.com/sharedworkers - ymz
1
截至2022年,SharedWorker已重新回到路线图上,并且似乎已经在Safari 16 TP中实现-https://webkit.org/status/#feature-shared-web-workers - James Irwin

13

相比于Worker,SharedWorker似乎具有更多功能。

其中包括:

  • 共享全局作用域。所有SharedWorker实例共享一个全局作用域。

W3C规范:

WHATWG规范:


SharedWorker是否也具有更多的“处理能力”? - Pacerier

11

共享 Worker 可以与多个连接一起工作。它通过端口发布消息来允许各种脚本之间的通信。

而另一方面,专用 Worker 仅绑定在其主连接上,并且无法向其他脚本(Worker)发布消息。


那么,这是否意味着一个常规的WebWorker只能有一个连接,即使用户复制他们的选项卡从同一域运行相同的脚本?或者浏览器仍然认为它是相同的脚本?换句话说,app.js连接到worker.js,然后用户复制他们的选项卡:tab2仍然可以连接到worker.js吗?worker.js是否仍将在tab1的app.js和tab2的app.js之间维护相同的内存池?我感兴趣是因为我需要在后台进程/守护程序中维护队列结构,并从同一应用程序中的任何打开选项卡向这样的守护程序发布事件。 - Cody
我不太理解(尽管这个答案可能已经有将近8年的历史了)。你可以将多个MessagePort对象传输到一个Worker中,并建立整个连接网络,Workers与其他Workers、iframes、Worklets等进行通信。 - John Weisz

1

共享工作者允许所有前端页面脚本调用构造函数:new SharedWorker("path-to-shared-worker-file.js"),以共享在后台上下文中(另一个运行javascript的后台线程)运行的相同实例的共享工作者文件。

例如,当网页#1调用该构造函数时,如果发现后台尚未加载共享工作者,则会导致后台上下文下载该文件并加载它。然后,当网页#2调用相同的构造函数(相同的文件路径)时,它发现已经存在正在运行的共享工作者,它将只使用同一个实例。当调用worker.port.start()函数时,将触发共享工作者文件的onconnect事件处理程序来注册调用者并获取处理与客户端端口通信的句柄(例如用于postMessage回传)。

然而,每个网页都会为每个单独的前端页面加载一个工作者文件,这些文件与worker.js实例不共享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接