Web Worker 适合处理纯计算、耗时≥8ms、结果可延迟的任务;需避免大对象同步传递和主线程轮询;iOS需启用JIT并压测性能;应封装服务、设降级兜底、保持无副作用。

用 Web Worker 做异步计算,核心就一条:把耗时的 CPU 密集型任务(比如斐波那契递归、大数据排序、物理模拟、图像滤镜)挪出主线程,让主线程只管渲染和响应用户操作。
哪些计算适合丢给 Worker
不是所有任务都值得上 Worker。重点看三类:
- 纯计算、无 DOM 依赖:比如 JSON 数据解析+结构化处理、坐标批量转换、加密解密、路径规划算法
- 可预测耗时 ≥ 8ms:在中低端机上跑一次就要卡一帧以上,例如对 5000 条商品做多条件实时筛选排序
- 结果不需立刻展示,允许小幅延迟:比如搜索建议的词频统计、离线地图瓦片预生成、AI 模型轻量推理(Pyodide + Worker 场景)
Worker 创建与通信要避开两个坑
消息传递不是免费的,尤其传大对象时容易拖慢整体性能:
-
别直接 post 大数组或深嵌套对象:先用
structuredClone或JSON.stringify + transferable(如ArrayBuffer)优化;小数据用普通 message,大数据优先考虑transfer方式移交内存所有权 -
别在主线程里同步等 Worker 返回:必须用
onmessage或 Promise 封装异步回调;避免写while(!done) {}这类轮询逻辑
小游戏环境特别注意 iOS 的 JIT 限制
小游戏 Worker 在 iOS 上默认不开启 JIT 编译,导致计算性能比 Android 差很多:
- 启用实验性支持:
useExperimentalWorker: true(部分平台 SDK 支持),可激活 JIT,提升 2–3 倍执行速度 - 避免递归深度过大或字符串高频拼接——这些在无 JIT 下退化明显
- 关键路径提前做性能压测:用
performance.now()在 Worker 内打点,确认单次任务稳定控制在 10ms 内
比“能用”更重要的是“稳用”
Worker 不是万能开关,要配合合理架构才能长期维护:
-
封装成可复用的计算服务:比如
SortService、Pathfinder,统一处理初始化、错误重试、超时中断 - 加兜底机制:Worker 初始化失败或长时间无响应时,自动 fallback 到主线程降级执行(带提示:“临时使用本地计算,稍后恢复加速”)
-
状态尽量无副作用:Worker 里不要读写全局变量或闭包外状态;所有输入靠
postMessage,输出靠postMessage,保持函数式风格


















