Web Worker

一、JS 单线程困境

  1. JS 是单线程:所有任务在主线程排队,无法并行。
  2. 阻塞问题:耗时计算会阻塞 UI 渲染、交互,导致页面卡顿、掉帧。
  3. 设计原因:保证 DOM 操作原子性,避免多线程竞态冲突。

二、Web Worker 是什么

  • 允许 JS 创建独立后台线程,不阻塞主线程。
  • 专门处理耗时计算、大数据处理。
  • 主线程负责 UI,Worker 负责计算,真正并行。

三、核心能力与限制

✅ 能做

  • 复杂计算、循环、数据处理
  • fetch / XHR 网络请求
  • setTimeout / setInterval
  • Promise、IndexedDB、WebSocket

❌ 不能做(禁区)

  • 不能操作 DOM(无 document、window)
  • 不能用 localStorage / sessionStorage
  • 不能用 alert / confirm

四、通信机制

  1. 主线程 ↔ Worker 线程 通过 postMessage 通信。
  2. 传值不传址 :使用结构化克隆算法,深拷贝传递,不共享内存,线程安全。
  3. 接收数据用 onmessage 或 addEventListener('message')。

五、创建与使用

js 复制代码
// 主线程
const worker = new Worker('./task.js', { type: 'module' })
worker.postMessage(data)
worker.onmessage = (e) => { /* 接收结果 */ }
js 复制代码
// worker.js
self.onmessage = (e) => {
  // 处理耗时任务
  self.postMessage(result)
}

六、关闭线程(生命周期)

  1. 主线程强制关闭

    js

    js 复制代码
    worker.terminate()

    立即停止,可能丢失数据。

  2. Worker 内部优雅关闭

    js

    js 复制代码
    self.close()

    完成当前任务后关闭,更安全。


七、错误处理

  • onerror:监听 Worker 内部运行错误。
  • onmessageerror:监听数据序列化 / 解析失败。

八、模块化与依赖

  1. 传统方式 :importScripts('./a.js', './b.js')
  2. ES 模块 :new Worker('task.js', { type: 'module' }),支持 import/export。

九、SharedWorker(共享线程)

  1. 同源多标签页共享同一个线程。
  2. 用于:跨页通信、状态同步、共享计算。
  3. 基于 port 通信,需监听 connect 事件。
  4. 典型场景:多标签页同步计数、音乐播放状态、在线文档协同。

十、结构化克隆算法

  • 比 JSON 更强:支持 Date、RegExp、Blob、ArrayBuffer、循环引用。
  • 不能克隆:Function、Error、DOM 节点。
  • Transferable:二进制数据可转移所有权,零拷贝,性能极高。

十一、最佳使用场景

  • 大量数据计算、解析、排序、加密解密
  • 图像处理、Canvas 数据计算
  • 长循环、大数据遍历
  • 多页面状态同步(SharedWorker)

十二、总结

Web Worker = 浏览器给 JS 开的后台计算线程,不卡 UI、不碰 DOM、靠消息通信、传值不传址。

相关推荐
excel23 分钟前
Marked 与 Markdown 有什么区别?该怎么选?
前端
龙亘川1 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人1 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Da Da 泓1 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
Raas1002 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
zxcvb1532 小时前
远程查看本地文档:一条轻量 Web 文件服务的工程化链路
前端·远程查看文档
niucloud-admin2 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
程序员大阳2 小时前
副队长JavaScript教程(50)-DOM:网页开发的起点
javascript·dom·es·节点·概念·document·关系
专注仿真2 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
北岛贰2 小时前
啵啵音乐迎来全新升级!
前端