Web Worker 项目分三步落地:一、斐波那契通信闭环验证主线程不卡;二、零拷贝处理十万级用户数据去重与搜索;三、Canvas 像素级高斯模糊实现 UI 无感响应。

直接上手一个可运行、有真实价值的 Web Worker 项目,关键不是堆砌 API,而是抓住“主线程卡,Worker 救”的核心逻辑。下面用三个递进式实战模块带你跑通:从最小通信闭环,到数据处理优化,再到生产级图像滤镜。
一、最小可行通信闭环:斐波那契计算器
这是验证环境是否正常的第一步,不涉及业务,只聚焦通信链路是否通畅。
- 新建 worker.js:用
self.onmessage接收数字,计算斐波那契,self.postMessage返回结果;不能用window或document,全局对象是self - 主线程中用
new Worker('worker.js')实例化,调用postMessage(40)发送参数,监听onmessage拿结果 - 加个按钮触发计算,再加个禁用状态 + loading 提示——你会立刻看到:点击按钮后页面完全不卡,滚动、输入照常,而控制台在几秒后才打出结果
二、真实数据处理优化:十万条用户数据去重与搜索
模拟后台返回大量原始数据,前端需实时做字段清洗、去重、模糊匹配——这类任务在主线程跑 800ms+,用户会明显感知卡顿。
- 主线程把原始数组转成
ArrayBuffer(例如用Float32Array存 ID 和姓名长度),通过postMessage(buffer, [buffer])零拷贝传给 Worker,避免 JSON 序列化开销 - Worker 中用
new Uint8Array(buffer)或DataView解析二进制,执行去重逻辑(如 Map + Set)、构建前缀树用于模糊搜索,全程不碰 DOM - 搜索请求也走消息通道:主线程发关键词,Worker 返回匹配项索引列表,主线程只负责
render()渲染结果
三、生产级图像滤镜:Canvas 像素级高斯模糊
上传一张 2000×1500 的 PNG,主线程直接操作 getImageData + 循环计算会卡死 2 秒以上;用 Worker 可做到 UI 响应无感。
- 主线程读取
File后用createImageBitmap转为位图,再调用bitmap.getContext('2d').getImageData()获取像素数组 - 将
imageData.data.buffer直接转移给 Worker:worker.postMessage(imageData.data.buffer, [imageData.data.buffer]) - Worker 中实现二维卷积核(3×3 或 5×5 高斯权重),遍历每个像素点,计算新 RGB 值,输出新 buffer;不使用
canvas,只返回处理后的像素数据 - 主线程接收 buffer,用
new ImageData(new Uint8ClampedArray(resultBuffer), width, height)创建新图像数据,绘制回 canvas
整个过程不需要第三方库,纯原生 API,浏览器兼容性覆盖 Chrome 60+、Firefox 55+、Edge 79+。重点在于:所有耗时计算全在 Worker 线程,主线程只做数据搬运和视图更新。做完这三个模块,你就真正掌握了 Web Worker 的落地节奏——不是为多线程而多线程,而是为不卡住用户而用。


















