Web Worker 适合处理大体积 JSON 解析、结构化缓存反序列化、缓存数据聚合/过滤三类 CPU 密集型操作;需通过 postMessage 通信,主线程中转更新响应式状态,并注意消息体限制、Worker 复用及组件卸载清理。
Web Worker 能把耗时的缓存解析(比如 JSON 解析、大型对象反序列化、IndexedDB 读取后的数据预处理)移出主线程,Vue 应用因此保持响应流畅。关键不是“用不用 Worker”,而是“哪些解析必须进 Worker”以及“怎么和 Vue 响应式无缝衔接”。
不是所有缓存操作都值得 Worker 化。重点看三类典型场景:
JSON.parse() 在主线程可能卡顿 100ms+;Worker 无法直接访问 Vue 实例或 ref,也不能触发 reactive 更新。必须通过 postMessage + 主线程中转实现“解耦更新”:
postMessage({ type: 'cache_parsed', payload: data }) 发回结果;onmessage 回调里接收,再用 nextTick 或 setTimeout(..., 0) 批量更新 ref 或 store 状态,避免高频 message 触发多次 render;useCachedData 组合式函数:内部管理 loading 状态、错误重试、结果缓存键,并自动绑定 Worker 生命周期(创建/终止),避免内存泄漏。假设 App 首屏需展示缓存的用户列表(JSON 字符串存于 localStorage),原始写法在 mounted 中同步 JSON.parse,滚动卡顿明显:
立即学习“前端免费学习笔记(深入)”;
user-parser.worker.js,导出解析逻辑:self.onmessage = ({ data }) => { const users = JSON.parse(data.jsonStr); self.postMessage({ users, count: users.length }); };
const worker = new Worker(new URL('./user-parser.worker.js', import.meta.url));
loading = true,收到 message 后赋值 users = e.data.users 并设 loading = false;worker.terminate() —— 尤其在路由切换频繁的 SPA 中,否则 Worker 持续驻留内存。Worker 不是银弹,几个易忽略点直接影响效果:
structuredClone(注意兼容性)或手动扁平化;onBeforeUnmount 标记),防止已销毁组件接收旧结果引发警告。