Web Worker 可在后台创建独立线程处理计算密集型任务,避免阻塞主线程;通过 postMessage 通信,无法访问 DOM,受限于同源策略与上下文隔离。
JavaScript 本身是单线程的,无法真正实现多线程,但可以通过 Web Worker 在后台创建独立的执行线程,实现并发任务处理。它不阻塞主线程(如 UI 渲染、用户交互),适合处理计算密集型或耗时操作。
Worker 通过单独的 JavaScript 文件
启动,与主线程通过 postMessage() 和 onmessage 通信,不能直接访问 DOM、window 或 document 对象。
const worker = new Worker('worker.js');
worker.postMessage(data);
self.onmessage = (e) => { /* e.data */ };
self.postMessage(result);
worker.terminate();(主线程)或 self.close();(Worker 内)Worker 运行在独立上下文中,权限和能力被刻意隔离,以保障安全和主线程稳定性:
document、window、localStorage 等 BOM/DOM APIself(等价于 WorkerGlobalScope)alert、fetch(但现代浏览器已支持)、XMLHttpRequest(可用,但推荐用 fetch)、setTimeout/setInterval(可用)SharedArrayBuffer + Atomics 实现真正共享内存,但受跨域策略和 COOP/COEP 头限制不是所有异步操作都需要 Worker —— Promise、async/await、事件循环已能很好处理 I/O 异步(如网络请求、定时器)。Worker 的价值在于避免 CPU 密集型任务卡住主线程:
对于简单并发,可考虑更轻量的方式:
new Worker('worker.js', { type: 'module' }),支持 import 语法,更现代但需注意兼容性setTimeout 或 queueMicrotask 拆分长任务,让出控制权给 UI 更新(适用于中低强度计算)不复杂但容易忽略:Worker 中的错误不会冒泡到主线程,需主动监听 self.onerror 或 worker.onerror 捕获异常;且 Worker 脚本加载失败时,仅触发 worker.onerror,无详细报错信息,建议配合 try/catch 和日志上报。