Web Workers API

Web Workers 使得能够在 Web 应用程序的主执行线程之外的后台线程中运行脚本操作。这样做的好处是,可以将繁重的处理工作放在单独的线程中执行,从而允许主线程(通常是 UI 线程)运行而不会被阻塞/减慢。

Web Workers 概念和用法

Worker 是使用构造函数(例如 Worker())创建的对象,它运行一个命名的 JavaScript 文件——此文件包含将在 worker 线程中运行的代码。

除了标准的 JavaScript 函数集(例如 StringArrayObjectJSON 等),你几乎可以在 worker 线程中运行任何你喜欢的代码。但也有一些例外:例如,你不能直接从 worker 内部操作 DOM,或者使用 Window 对象的一些默认方法和属性。有关你可以运行的代码的信息,请参阅下面的 worker 全局上下文和函数支持的 Web API

数据通过消息系统在 worker 和主线程之间发送——双方都使用 postMessage() 方法发送消息,并通过 onmessage 事件处理程序响应消息(消息包含在 message 事件的 data 属性中)。数据是复制而不是共享。

只要这些 worker 托管在与父页面相同的 中,worker 就可以依次生成新的 worker。

此外,worker 可以使用 fetch()XMLHttpRequest API 发出网络请求(尽管请注意,XMLHttpRequestresponseXML 属性将始终为 null)。

Worker 类型

有几种不同类型的 worker

  • 专用 worker 是由单个脚本使用的 worker。此上下文由 DedicatedWorkerGlobalScope 对象表示。
  • 共享 worker 是可以由在不同窗口、IFrame 等中运行的多个脚本使用的 worker,只要它们与 worker 位于同一域名即可。它们比专用 worker 稍微复杂一些——脚本必须通过活动端口进行通信。
  • 服务 worker 本质上充当代理服务器,位于 Web 应用程序、浏览器和网络(如果可用)之间。它们旨在(除其他外)实现有效的离线体验、拦截网络请求并根据网络是否可用采取适当的操作,以及更新驻留在服务器上的资产。它们还将允许访问推送通知和后台同步 API。

注意:根据 Web Workers 规范,worker 错误事件不应冒泡(请参阅 Firefox 错误 1188141)。这已在 Firefox 42 中实现。

Worker 全局上下文和函数

Worker 在与当前 window 不同的全局上下文中运行!虽然 Window 无法直接用于 worker,但许多相同的方法都在一个共享 mixin (WindowOrWorkerGlobalScope) 中定义,并通过它们自己的 WorkerGlobalScope 派生上下文提供给 worker。

一些对所有 worker 和主线程(来自 WindowOrWorkerGlobalScope)通用的函数(子集)是

以下函数适用于 worker

支持的 Web API

Web Worker 接口

Worker

表示正在运行的 worker 线程,允许你向正在运行的 worker 代码传递消息。

WorkerLocation

定义由 Worker 执行的脚本的绝对位置。

SharedWorker

表示一种特殊的 worker,可以从多个 浏览上下文(即窗口、选项卡或 iframe)甚至其他 worker 访问。

WorkerGlobalScope

表示任何 worker 的通用范围(与 Window 对普通 Web 内容的作用相同)。不同类型的 worker 具有继承自此接口并添加更具体功能的范围对象。

DedicatedWorkerGlobalScope

表示专用 worker 的范围,继承自 WorkerGlobalScope 并添加了一些专用功能。

SharedWorkerGlobalScope

表示共享 worker 的范围,继承自 WorkerGlobalScope 并添加了一些专用功能。

WorkerNavigator

表示用户代理(客户端)的身份和状态。

示例

我们创建了一些演示来展示 Web worker 的用法

你可以在 使用 Web Workers 中找到有关这些演示如何工作的更多信息。

规范

规范
HTML 标准
# worker

另请参阅