【问题标题】:What's the difference between Shared Worker and Worker in HTML5?HTML5 中 Shared Worker 和 Worker 有什么区别?
【发布时间】:2020-06-20 22:48:14
【问题描述】:

看完这篇博文:http://www.sitepoint.com/javascript-shared-web-workers-html5/

我不明白。 Worker 和 SharedWorker 有什么区别?

【问题讨论】:

标签: javascript html web-worker


【解决方案1】:

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

【讨论】:

  • 嗯,所以SharedWorker 在弹出窗口中通过window.open 可以访问其他人,假设他们在同一个来源?如果他们在一个全新的标签上怎么办,我猜不是?
  • @Tower "Same origin" 与生成另一个页面的页面无关。这意味着(大致)调用脚本的域名。见this chart。因此,example.com 上的两个脚本可以访问相同的 SharedWorker,即使跨不同的选项卡。
  • 那么,这是否意味着一个普通的 WebWorker 只能有一个连接,即使用户从同一个域复制他们的选项卡运行相同的脚本?还是浏览器仍然认为是相同的脚本?换句话说,app.js 连接到 worker.js,然后用户复制他们的 tab:tab2 还能连接到 worker.js 吗? worker.js 是否仍会在 tab1 的 app.js 和 tab2 的 app.js 之间保持相同的内存池。我很感兴趣,因为我需要在后台进程/守护进程中维护一个队列结构,并从同一应用程序中的任何打开选项卡将事件发布到此类守护进程。
【解决方案2】:

SharedWorker 的功能似乎比 Worker 更多。

其中的功能是:

  • 一个共享的全局范围。所有SharedWorker 实例共享一个全局范围。

W3C 规范:

WHATWG 规范:

【讨论】:

  • SharedWorker是否也有更多的“处理能力”?
【解决方案3】:

致任何考虑使用 SharedWorker 的人——Apple 在 2015 年从 WebKit 中删除了对 SharedWorker 的支持。在他们的 current roadmap 中没有重新实现的计划。目前正在为 WebKit 开发对 Service Workers 的支持,并提供类似的功能 (see here for comparisons)。

您可以关注ServiceWorkers in WebKit here 的开发(又名Safari 支持)。

【讨论】:

  • 这是什么意思? Apple 不支持共享工作者?
  • 这意味着 Apple WebKit 从 Changeset 178310 开始删除了对 SharedWorkers 的支持,并且不打算重新引入它们的支持。
  • 什么? Apple 想成为新的 Internet Explorer 吗?
  • @JohnBalvinArias Apple/Safari 成为新的 Internet Explorer 已有一段时间了。 :)
  • 好点!这是一个链接,显示对SharedWorkercaniuse.com/sharedworkers的(较差)支持
【解决方案4】:

共享工作者可以处理多个连接。它将消息发布到端口以允许各种脚本之间的通信。

另一方面,专用工作人员仅与主连接绑定,不能向其他脚本(工作人员)发布消息。

【讨论】:

  • 那么,这是否意味着一个普通的 WebWorker 只能有一个连接,即使用户从同一个域复制他们的选项卡运行相同的脚本?或者浏览器仍然认为相同的脚本?换句话说,app.js 连接到 worker.js,然后用户复制他们的 tab:tab2 还能连接到 worker.js 吗? worker.js 是否仍会在 tab1 的 app.js 和 tab2 的 app.js 之间保持相同的内存池。我很感兴趣,因为我需要在后台进程/守护进程中维护一个队列结构,并从同一应用程序中的任何打开选项卡将事件发布到此类守护进程。
  • 我不明白(尽管这个答案可能已经快 8 年了)。您可以将多个 MessagePort 对象传输到 Worker 并连接整个连接网络,Worker 与其他 Worker、iframe、Worklet 等进行通信。
【解决方案5】:

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

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

然而worker,上面的每个网页都会在后台为每个首页加载一个worker文件,而不是共享同一个worker.js实例。

【讨论】:

    猜你喜欢
    • 2020-06-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2019-10-20
    • 2015-05-13
    相关资源
    最近更新 更多