基础web worker创建与初始化需三步:检查支持(typeof worker !== 'undefined')、加载同源脚本(new worker())、建立消息通信(postmessage/onmessage);其为独立线程,不共享内存,不可操作dom,需主动terminate释放资源。

创建并初始化一个基础的 Web Worker,核心就三步:检查支持、加载脚本、建立通信。它不是“启动一个后台服务”,而是实例化一个独立线程环境,且必须满足同源限制。
确认浏览器支持并创建 Worker 实例
现代浏览器基本都支持,但上线前建议简单兜底:
- 用
typeof Worker !== 'undefined'判断是否可用 - 使用
new Worker()构造函数传入脚本路径(如'worker.js') - 路径必须同源,不能是跨域 URL,也不能是本地
file://协议下的文件 - 工程化项目中推荐写法:
new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' }),便于模块导入和构建工具处理
主线程发送与接收消息
Worker 和主线程之间靠消息传递数据,不共享内存:
- 主线程调用
worker.postMessage(data)发送任意可序列化的值(对象、数组、数字、字符串等) - 监听
worker.onmessage接收返回结果,e.data就是 Worker 发来的数据 - 可同时监听
worker.onerror捕获脚本执行错误(比如语法错误、未捕获异常)
Worker 脚本内响应与通信
在 worker.js 中,全局作用域是 self,不是 window:
- 用
self.onmessage监听主线程发来的消息 - 用
self.postMessage(result)向主线程回传结果 - 不能操作 DOM、不能访问
document或window,但能发网络请求、使用setTimeout/setInterval、调用fetch等 API - 若需引入其他模块,需设
{ type: 'module' },并在脚本中用import语法
合理终止以释放资源
Worker 长期运行会占用内存,不用时应主动清理:
- 主线程调用
worker.terminate()可立即销毁 Worker 实例 - Worker 内部如有定时器或事件监听,建议配合标志位 +
clearInterval/removeEventListener主动释放 - 避免频繁创建/销毁,对短任务可复用;对长周期任务,建议设计启停协议(如发送
{ action: 'stop' })











