Web Worker、SharedWorker 与 Service Worker 有什么区别?

先理解原理和示例,再练习完整口述与追问。

都不能直接操作页面 DOM;专用 Worker 处理后台计算;SharedWorker 可共享;Service Worker 是事件驱动的网络代理与离线基础。

Dedicated Web Worker 为页面提供独立执行环境,适合解析、计算等耗时任务,通过 postMessage 通信,不能直接读写 document。消息默认使用结构化克隆,不是共享同一个普通对象;传递可转移的 ArrayBuffer 时可以转移所有权,发送端对应缓冲区会脱离,从而减少拷贝成本。创建线程与传输数据也有成本,小任务不一定更快。

SharedWorker 可以被满足同源等条件的多个上下文连接,常通过 MessagePort 通信,适合共享连接或计算状态,但要检查浏览器支持与生命周期。Service Worker 主要处理受其作用域控制的页面的网络请求、缓存、离线和推送事件,通常要求安全上下文,localhost 有开发例外。它不是永久运行的后台进程,浏览器可以终止并在后续事件中重新启动,因此不能把关键持久状态只存在它的全局变量里。

Service Worker 有安装、等待、激活和控制页面等阶段,首次注册不一定立刻控制当前页面。更新策略要兼顾旧页面与新缓存兼容,避免把用户长时间锁在旧版本;也不能把认证接口全部无差别缓存。Worker 与页面的边界是并发环境和消息协议,不是绕过同源或权限限制的手段。

主线程把 ArrayBuffer 转移给 Worker 做解析,发送端原 buffer 会脱离;如果只是普通对象,结构化克隆会产生另一份可用数据,而不是两线程自动共享对象。Service Worker 拦截受控请求并按策略读 CacheStorage,浏览器终止它后仍应可从持久存储恢复必要状态。

Worker 不是 DOM 的并行入口。Service Worker 不永久驻留,也不保证首次注册立刻控制当前页;共享内存还有额外环境限制。

Dedicated Web Worker 为页面提供独立执行环境,适合解析、计算等耗时任务,通过 postMessage 通信,不能直接读写 document。消息默认使用结构化克隆,不是共享同一个普通对象;传递可转移的 ArrayBuffer 时可以转移所有权,发送端对应缓冲区会脱离,从而减少拷贝成本。创建线程与传输数据也有成本,小任务不一定更快。