Web Worker 是与主线程隔离的独立 JavaScript 执行环境,需检查支持性(typeof Worker !== 'undefined')、加载同源脚本(new Worker('worker.js') 或模块化写法)、通过 postMessage/onmessage 异步通信,Worker 内使用 self.onmessage/self.postMessage,不可操作 DOM,应主动 terminate 或 self.close() 释放资源。

创建并初始化一个 Web Worker,本质是启动一个与主线程隔离的独立 JavaScript 执行环境,不是“开启服务”,而是实例化一个受控线程。关键在于三件事:确认可用、加载脚本、建立通信通道。
检查支持并创建 Worker 实例
现代浏览器普遍支持,但上线前建议做轻量兜底:
- 用 typeof Worker !== 'undefined' 或 'Worker' in window 判断是否可用
- 用 new Worker('worker.js') 加载同源外部脚本(不能是内联代码、不能跨域、不能是
file://协议) - 工程化项目中更推荐模块写法:new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' }),利于 TypeScript 和构建工具处理
主线程发送与接收消息
Worker 与主线程之间不共享内存,所有交互必须通过异步消息:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 主线程调用 worker.postMessage(data) 发送数据,
data必须可结构化克隆(支持对象、数组、数字、字符串、ArrayBuffer 等) - 监听 worker.onmessage 接收结果,
e.data就是 Worker 返回的内容 - 加上 worker.onerror 捕获运行时错误(如语法错误、未捕获异常),便于定位问题
Worker 脚本内响应任务
在 worker.js 中,全局对象是 self,不是 window:
立即学习“Java免费学习笔记(深入)”;
- 用 self.onmessage 监听主线程发来的消息
- 用 self.postMessage(result) 向主线程回传结果
- 不可访问 DOM、
document、localStorage;但能发fetch、用setTimeout/setInterval、读写IndexedDB - 如需导入其他模块,必须声明
{ type: 'module' },并在脚本中使用import语法
合理终止以释放资源
Worker 长期存活会持续占用内存,不用时应主动清理:
- 主线程调用 worker.terminate() 可立即销毁实例
- Worker 内部如有定时器或事件监听,建议配合标志位 +
clearInterval/removeEventListener主动释放 - 避免高频创建/销毁;短任务可复用 Worker;长周期任务建议设计启停协议(例如收到
{ action: 'stop' }后自行调用self.close())

















