Web Worker 用于将纯计算任务(如大数据过滤、坐标转换、图像处理等)移出主线程,避免阻塞渲染;需满足不操作 DOM、输入输出可序列化等条件,并用 Transferable 实现零拷贝通信。

主线程卡顿不是代码写得慢,而是它被计算任务彻底占满了。Web Worker 的作用,就是把那些“只算不碰界面”的活搬出去,让主线程专注渲染和响应用户。
哪些计算该交给 Worker
核心判断标准:不操作 DOM、不依赖 window/document、输入输出可序列化或能用 ArrayBuffer 传输。
- 大数据过滤、模糊搜索(比如十万行 JSON 的关键词匹配)
- 坐标转换、瓦片索引、PBF 解码(离线地图场景)
- 文本差异比对(jsdiff)、文件哈希计算(SHA-256)
- 数组排序、去重、统计聚合(平均分、分布直方图)
- 图像像素处理、音频 FFT 分析等纯 CPU 运算
关键一步:避免结构化克隆的坑
直接 postMessage 传大数组,默认会深拷贝,十万行数据拷贝本身就要几百毫秒。真正高效的做法是用 Transferable:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 主线程创建 ArrayBuffer 或 TypedArray,填好数据
- 调用 postMessage(data, [data.buffer]),把 buffer 所有权转移过去
- Worker 收到后直接读取,零拷贝,内存也只有一份
- 主线程传完就不能再访问原 buffer,这是设计上的安全约束
通信要轻量,结果别塞太多
Worker 不是万能搬运工,它适合“算完给个结论”,不适合“边算边刷 UI”:
- 不要在 Worker 里返回完整渲染用的 HTML 字符串或大量 DOM 节点数据
- 推荐只传关键结果:如匹配项 ID 列表、统计数值、坐标范围等轻量结构
- 渲染仍由主线程用虚拟滚动、增量更新等方式完成,保持控制权
- 高频触发(如实时输入搜索)可加防抖,避免 Worker 频繁启停
Worker 不能做的事,必须提前拆干净
Worker 没有 DOM、没有 localStorage、不能调 alert,所以代码边界要划清:
- 所有 fetch 请求可以放 Worker,但响应后解析 JSON 可以,渲染到页面不行
- 数据预处理、格式校验、算法核心逻辑全放进去
- 样式计算、布局、事件绑定、动画帧控制这些必须留在主线程
- 如果某段逻辑既要用 DOM 又要算数据,就把它拆成两段:Worker 算 + 主线程渲染
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










