Web Workers API
Web Workers 使得能够在 Web 应用程序的主执行线程之外的后台线程中运行脚本操作。这样做的好处是,可以将繁重的处理工作放在单独的线程中执行,从而允许主线程(通常是 UI 线程)运行而不会被阻塞/减慢。
Web Workers 概念和用法
Worker 是使用构造函数(例如 Worker()
)创建的对象,它运行一个命名的 JavaScript 文件——此文件包含将在 worker 线程中运行的代码。
除了标准的 JavaScript 函数集(例如 String
、Array
、Object
、JSON
等),你几乎可以在 worker 线程中运行任何你喜欢的代码。但也有一些例外:例如,你不能直接从 worker 内部操作 DOM,或者使用 Window
对象的一些默认方法和属性。有关你可以运行的代码的信息,请参阅下面的 worker 全局上下文和函数 和 支持的 Web API。
数据通过消息系统在 worker 和主线程之间发送——双方都使用 postMessage()
方法发送消息,并通过 onmessage
事件处理程序响应消息(消息包含在 message
事件的 data
属性中)。数据是复制而不是共享。
只要这些 worker 托管在与父页面相同的 源 中,worker 就可以依次生成新的 worker。
此外,worker 可以使用 fetch()
或 XMLHttpRequest
API 发出网络请求(尽管请注意,XMLHttpRequest
的 responseXML
属性将始终为 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。
DedicatedWorkerGlobalScope
用于专用 workerSharedWorkerGlobalScope
用于共享 workerServiceWorkerGlobalScope
用于 服务 worker
一些对所有 worker 和主线程(来自 WindowOrWorkerGlobalScope
)通用的函数(子集)是
atob()
btoa()
clearInterval()
clearTimeout()
createImageBitmap()
dump()
非标准fetch()
queueMicrotask()
reportError()
setInterval()
setTimeout()
structuredClone()
requestAnimationFrame()
(仅限专用 worker)cancelAnimationFrame()
(仅限专用 worker)
以下函数仅适用于 worker
importScripts()
,postMessage()
(仅限专用 worker)。
支持的 Web API
注意:如果某个平台的特定版本支持列出的 API,则通常可以假设它在 Web worker 中可用。你还可以使用以下网站测试对特定对象/函数的支持:https://worker-playground.glitch.me/
以下 Web API 可用于 worker
- 后台获取 API
- 后台同步 API
- 条形码检测 API
- 广播通道 API
- Canvas API
- 通道消息 API
- 控制台 API
- 压缩流 API
- CSS 字体加载 API
CustomEvent
- 编码 API(例如
TextEncoder
、TextDecoder
) - 获取 API
- 文件 API
- 文件系统 API
- 空闲检测 API
- IndexedDB API
- 媒体功能 API
- 媒体源扩展 API(仅限专用 worker)
- 网络信息 API
- 通知 API
- 支付处理程序 API
- 性能 API
- 权限 API
- 优先级任务调度 API
- 推送 API
- 服务器发送事件
- 服务工作者 API
- 流 API
- 受信任类型 API
- URL API(例如
URL
) - URL 模式 API
- 用户代理客户端提示 API
- WebCodecs API
- Web Crypto API(例如
Crypto
) - Web 锁定 API
- Web 串行 API
- Web 定期后台同步 API
- WebGPU API
- WebUSB API
- WebSockets API
- XMLHttpRequest API
Worker 还可以生成其他 worker,因此这些 API 也可用
Web Worker 接口
Worker
-
表示正在运行的 worker 线程,允许你向正在运行的 worker 代码传递消息。
WorkerLocation
-
定义由
Worker
执行的脚本的绝对位置。 -
表示一种特殊的 worker,可以从多个 浏览上下文(即窗口、选项卡或 iframe)甚至其他 worker 访问。
WorkerGlobalScope
-
表示任何 worker 的通用范围(与
Window
对普通 Web 内容的作用相同)。不同类型的 worker 具有继承自此接口并添加更具体功能的范围对象。 DedicatedWorkerGlobalScope
-
表示专用 worker 的范围,继承自
WorkerGlobalScope
并添加了一些专用功能。 -
表示共享 worker 的范围,继承自
WorkerGlobalScope
并添加了一些专用功能。 -
表示用户代理(客户端)的身份和状态。
示例
我们创建了一些演示来展示 Web worker 的用法
- 基本专用 worker 示例 (运行专用 worker)。
- 基本共享 worker 示例 (运行共享 worker)。
- OffscreenCanvas worker 示例 (运行 OffscreenCanvas worker)。
你可以在 使用 Web Workers 中找到有关这些演示如何工作的更多信息。
规范
规范 |
---|
HTML 标准 # worker |