【发布时间】:2020-06-20 22:48:14
【问题描述】:
看完这篇博文:http://www.sitepoint.com/javascript-shared-web-workers-html5/
我不明白。 Worker 和 SharedWorker 有什么区别?
【问题讨论】:
标签: javascript html web-worker
看完这篇博文:http://www.sitepoint.com/javascript-shared-web-workers-html5/
我不明白。 Worker 和 SharedWorker 有什么区别?
【问题讨论】:
标签: javascript html web-worker
非常基本的区别:Worker 只能通过创建它的脚本访问,SharedWorker 可以通过来自同一域的任何脚本访问。
【讨论】:
SharedWorker 在弹出窗口中通过window.open 可以访问其他人,假设他们在同一个来源?如果他们在一个全新的标签上怎么办,我猜不是?
example.com 上的两个脚本可以访问相同的 SharedWorker,即使跨不同的选项卡。
SharedWorker 的功能似乎比 Worker 更多。
其中的功能是:
SharedWorker 实例共享一个全局范围。W3C 规范:
WHATWG 规范:
【讨论】:
致任何考虑使用 SharedWorker 的人——Apple 在 2015 年从 WebKit 中删除了对 SharedWorker 的支持。在他们的 current roadmap 中没有重新实现的计划。目前正在为 WebKit 开发对 Service Workers 的支持,并提供类似的功能 (see here for comparisons)。
您可以关注ServiceWorkers in WebKit here 的开发(又名Safari 支持)。
【讨论】:
SharedWorkercaniuse.com/sharedworkers的(较差)支持
共享工作者可以处理多个连接。它将消息发布到端口以允许各种脚本之间的通信。
另一方面,专用工作人员仅与主连接绑定,不能向其他脚本(工作人员)发布消息。
【讨论】:
MessagePort 对象传输到 Worker 并连接整个连接网络,Worker 与其他 Worker、iframe、Worklet 等进行通信。
共享工作者允许所有调用构造函数的首页上下文脚本:new SharedWorker("path-to-shared-worker-file.js") 共享在后台上下文中运行的共享工作者文件的同一实例(另一个线程在后面运行javascript)。
例如,当网页#1调用该构造函数时,如果发现后面还没有加载共享工作者,它将导致后台上下文下载文件并加载它,然后当网页#2调用时相同的构造函数(相同的文件路径),它发现有一个现有的共享工作者正在运行,它将只使用同一个。当worker.port.start()函数被调用时,会导致共享worker文件onconnect事件处理器被调用来注册调用者并获取与客户端端口通信的句柄(例如postMessage返回)。
然而worker,上面的每个网页都会在后台为每个首页加载一个worker文件,而不是共享同一个worker.js实例。
【讨论】: