Worker
和SharedWorker
有什么区别?请解答。Worker
和SharedWorker
有什么区别?请解答。非常基本的区别:一个 Worker
只能从创建它的脚本中访问,一个 SharedWorker
可以被来自同一域的任何脚本访问。
window.open
在弹出窗口中创建SharedWorker
,那么它可以访问其他具有相同源的SharedWorker
。如果它们在一个全新的标签页上会怎样,我猜是不行的吧? - Towerexample.com
上的脚本,即使在不同的标签页上,也可以访问相同的“SharedWorker”。 - rvighne如果您考虑使用SharedWorker,请注意 -- 苹果在2015年将对SharedWorker
的支持从WebKit中删除。在他们当前的路线图中,没有重新实现的计划。目前正在开发支持Service Workers的WebKit,并提供类似的功能(请参见此处以进行比较)。
您可以在此处跟随(也就是Safari支持) WebKit中ServiceWorkers的开发情况。
SharedWorker
的(糟糕)支持情况。https://caniuse.com/sharedworkers - ymz相比于Worker,SharedWorker似乎具有更多功能。
其中包括:
SharedWorker
实例共享一个全局作用域。W3C规范:
WHATWG规范:
共享 Worker 可以与多个连接一起工作。它通过端口发布消息来允许各种脚本之间的通信。
而另一方面,专用 Worker 仅绑定在其主连接上,并且无法向其他脚本(Worker)发布消息。
MessagePort
对象传输到一个Worker
中,并建立整个连接网络,Workers与其他Workers、iframes、Worklets等进行通信。 - John Weisz共享工作者允许所有前端页面脚本调用构造函数:new SharedWorker("path-to-shared-worker-file.js"),以共享在后台上下文中(另一个运行javascript的后台线程)运行的相同实例的共享工作者文件。
例如,当网页#1调用该构造函数时,如果发现后台尚未加载共享工作者,则会导致后台上下文下载该文件并加载它。然后,当网页#2调用相同的构造函数(相同的文件路径)时,它发现已经存在正在运行的共享工作者,它将只使用同一个实例。当调用worker.port.start()函数时,将触发共享工作者文件的onconnect事件处理程序来注册调用者并获取处理与客户端端口通信的句柄(例如用于postMessage回传)。
然而,每个网页都会为每个单独的前端页面加载一个工作者文件,这些文件与worker.js实例不共享。