Web Worker 仅在页面存活时运行,适合不阻塞UI的后台计算;需HTTP加载脚本、正确配对postMessage/onmessage、监听self.onerror捕获异常;长期离屏任务应使用Service Worker。

Web Worker 本身不能让脚本“在后台静默运行”——它只在页面打开且主线程存活时工作;真正能跨页面生命周期、离屏、甚至关闭标签后仍尝试执行的,是 Service Worker + background fetch 或 periodic sync(后者已废弃)等组合方案。但如果你指的「后台」是“不卡 UI、用户无感知地持续干活”,那 Web Worker 就是正确选择,只是得避开常见误区。
new Worker() 路径报错:Failed to construct 'Worker': Script at 'file:///' cannot be accessed
这是本地开发最常卡住的第一步。浏览器强制要求 Worker 脚本必须通过 HTTP/HTTPS 加载,file:// 协议直接双击 HTML 会失败。
- 用
npx http-server或 VS Code 的 Live Server 插件启动服务 - 路径别写
./worker.js这种相对路径,构建工具(如 Vite、Webpack)下容易解析错;ESM 环境下统一用new Worker(new URL('./worker.js', import.meta.url)) - 如果 worker 逻辑是动态生成的(比如根据配置拼代码),用
Blob构造更稳:new Worker(URL.createObjectURL(new Blob(['self.onmessage = ...'], {type: 'application/javascript'})))
主线程发了消息,Worker 却没响应:postMessage 和 onmessage 没配对
Worker 线程和主线程之间没有共享内存,通信全靠 postMessage() + onmessage,漏一个就断联。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 主线程创建后必须显式监听:
worker.onmessage = e => { /* 处理结果 */ }或worker.addEventListener('message', ...) - Worker 脚本里必须写
self.onmessage = e => { /* 执行逻辑 */ self.postMessage(...) };写成onmessage = ...(没加self.)会报ReferenceError - 别在 Worker 里用
console.log(self)来“验证是否运行”——它看似输出了,但不代表onmessage已注册成功;加一句self.postMessage({ type: 'ready' })主线程收到才算通路建好
Worker 内部出错却完全没提示:未捕获异常默认静默
Worker 里 fetch 失败、JSON.parse 报错、setTimeout 里抛异常……统统不会出现在 DevTools 主控制台,表现就是“发了消息,没回,也没报错”。
- Worker 脚本开头必须加:
self.onerror = e => self.postMessage({ type: 'error', message: e.message, filename: e.filename, lineno: e.lineno }) - 主线程监听时判断:
if (e.data.type === 'error') console.error('[Worker]', e.data.message) -
try/catch只能捕同步错误;异步错误(如 Promise reject、setTimeout回调内 throw)仍需靠self.onerror兜底 - Chrome 调试 Worker 不在 “Application → Service Workers”,要去 “Sources → Page → workers” 下找,右键可 “Open in Debugger”
想长期运行、离屏也不停?Web Worker 不行,该切到 Service Worker
Web Worker 生命周期绑定页面:页面关闭 → Worker 自动终止。所谓“后台静默运行”,比如定时同步数据、收推送、离线缓存更新,都属于 Service Worker 职责范围。
-
Service Worker可在页面关闭后继续运行(受限于浏览器策略,通常数分钟),支持push、sync、background-fetch等事件 - 它不能直接做大量计算(CPU 限制严,且可能被系统中止),真要算,得从 Service Worker
postMessage到一个 Dedicated Worker 中去执行 - 别混淆
Dedicated Worker(一对一)、Shared Worker(多页面共享)、Service Worker(网络代理+后台生命周期)三者定位
最容易被忽略的一点:Worker 脚本里所有全局变量都是线程私有,self 是唯一可靠入口;任何试图访问 window、document、localStorage、indexedDB(需显式打开)的行为,都会立刻抛 ReferenceError 或 SecurityError —— 不是“不生效”,而是根本不存在。

















