news 2026/6/18 6:50:59

前端性能优化-web worker

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端性能优化-web worker

前言:Web Worker 是 HTML5 提供的多线程解决方案,可以将耗时的计算逻辑放到独立的后台线程中运行,避免阻塞主线程(UI 线程),解决页面卡顿、交互无响应的问题,是前端性能优化的核心手段之一。

一、核心基础认知

1. 为什么需要 Worker

JavaScript 是单线程语言,所有代码都在主线程串行执行。一旦遇到耗时较长的计算(大数据排序、复杂算法、大文件解析),主线程会被占用,导致页面无法响应用户交互、动画掉帧,甚至出现 “页面无响应” 提示。
Web Worker 的作用就是:开辟独立的后台线程,和主线程并行运行,专门处理耗时任务,完成后再把结果传回主线程,全程不影响页面渲染和交互。

2. 能力与限制

支持:

  • 执行 JS 代码,拥有独立的全局上下文
  • 使用 fetch / XMLHttpRequest 发送网络请求
  • 使用 setTimeout / setInterval 定时器
  • 访问 IndexedDB、缓存 API
  • 处理二进制数据(ArrayBuffer、Blob)
  • 导入外部 JS 脚本

不支持:

  • 不能访问 DOM(无法操作 document、window、页面元素
  • 不能直接调用主线程的变量和函数
  • 不能使用 alert、confirm 等浏览器弹窗 API
  • 加载的 Worker 文件必须遵守同源策略
3. 三类 Worker 对比
类型全称生命周期共享范围核心用途
专用 WorkerDedicated Web Worker随创建它的页面而生,页面关闭即销毁仅属于创建它的单个页面 / 标签页单页面的耗时计算、数据处理(最常用)
共享 WorkerShared Worker同域下多个页面共享,最后一个页面关闭才销毁同域下多个标签页共享多标签页数据共享、统一状态管理
服务 WorkerService Worker独立于页面,浏览器后台常驻同域下所有页面PWA 离线缓存、请求拦截、后台同步

二、当前学习重点: Web Worker 基础用法

1.创建 worker线程

在public公共文件夹下创建heavy-calc.worker.js,路径如下

内容如下:

self.onmessage = function(e) { const { count } = e.data const result = heavyCalculate(count) self.postMessage({ result }) } // 加重运算:加入三角函数,单次循环计算量更大,更容易触发长卡顿 function heavyCalculate(num) { let sum = 0 for (let i = 0; i < num; i++) { sum += Math.sqrt(i) * Math.sin(i) * Math.cos(i) } return sum }
2.主线程使用

创建 worker 只需要通过 new 调用 Worker(path, options) 构造函数即可,它接收两个参数

const calcWorker = new Worker('/static/workers/heavy-calc.worker.js',{})
参数说明
path有效的js脚本的地址,必须遵守同源策略。无效的js地址或者违反同源策略,会抛出SECURITY_ERR 类型错误
options.type可选,用以指定 worker 类型。该值可以是 classic 或 module。 如未指定,将使用默认值 classic
options.credentials可选,用以指定 worker 凭证。该值可以是 omit, same-origin,或 include。如果未指定,或者 type 是 classic,将使用默认值 omit (不要求凭证)
options.name可选,在 DedicatedWorkerGlobalScope 的情况下,用来表示 worker 的 scope 的一个 DOMString 值,主要用于调试目的。
注意:如果你想在相对路径中使用worker,需要注意导入方式,相对路径如图:


此方法为:Vite 原生支持的标准方式,会自动处理路径、打包、热更新,生产环境也不会出问题,完全规避路径坑

import HeavyCalcWorker from './workers/heavy-calc.worker.js?worker' const calcWorker = new HeavyCalcWorker()
3.主线程与 worker 线程都是通过 postMessage 方法来发送消息,以及监听 message 事件来接收消息
// 主线程 const runWorker = () => { console.time('Worker计算耗时') calcWorker.postMessage({ count: CALC_COUNT }) } calcWorker.onmessage = (e) => { result.value = e.data.result console.timeEnd('Worker计算耗时') } calcWorker.onerror = (err) => { console.error('Worker报错:', err.message) } // worker线程 self.onmessage = function(e) { const { count } = e.data const result = heavyCalculate(count) self.postMessage({ result }) }

ok,到这里,一个简单的计算worker就创建成功了!

4.监听错误信息

web worker 提供两个事件监听错误,error 和 messageerror。这两个事件的区别是:

事件触发时机描述
errorWorker 脚本执行阶段文件 404、语法错误、变量不存在、代码抛错
messageerrorpostMessage 数据传输阶段循环引用、传函数 / DOM、转移后重复使用 ArrayBuffer
5.关闭 worker 线程
// 组件销毁清理 onUnmounted(() => { calcWorker.terminate() self.close() })
6. Worker 线程引用其他js文件(基于 ESModule模式)

复杂的计算场景,不想把所有代码都放入worker线程时,可以直接使用 module 模式初始化 worker 线程。
主线程写法:

// 相对路径导入写法 import HeavyCalcWorker from './workers/heavy-calc.worker.js?worker&type=module' const calcWorker = new HeavyCalcWorker() // 绝对路径导入写法 const calcWorker = new Worker('/static/workers/heavy-calc.worker.js',{ type: 'module'})

worker线程

import moment from 'moment' console.log(moment().format('YYYY-MM-DD HH:mm:ss'))

打印结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 6:46:10

机器学习数据预处理的底层逻辑与实战避坑指南

1. 这不是“配菜”&#xff0c;是机器学习真正的起点&#xff1a;为什么90%的新手卡在数据预处理上你刚下载完第一个真实数据集&#xff0c;双击打开CSV文件——表格里混着中文城市名、空缺的年龄、带小数点的薪资、还有几行写着“N/A”&#xff1b;你兴冲冲跑去看教程&#xf…

作者头像 李华
网站建设 2026/6/18 6:43:03

高斯分布实战避坑指南:从产线异常检测到机器学习落地

1. 为什么我坚持把高斯分布讲透——一个统计实践者十年踩坑后的真心话高斯分布&#xff0c;或者说正态分布&#xff0c;是我带过的每一批数据科学新人绕不开的第一道坎。不是因为它难&#xff0c;而是因为它太“熟”了——熟到大家张口就来“钟形曲线”“68-95-99.7”&#xff…

作者头像 李华
网站建设 2026/6/18 6:29:38

多Agent图片提示词提取:从架构设计到工程实现

1. 项目概述&#xff1a;为什么我们需要一个“多 Agent”的图片提示词提取工具&#xff1f;如果你经常玩 Stable Diffusion、Midjourney 这类 AI 绘画工具&#xff0c;肯定遇到过这样的场景&#xff1a;在网上看到一张惊为天人的 AI 图&#xff0c;想自己复现或者基于它的风格进…

作者头像 李华
网站建设 2026/6/18 6:26:55

Pexels免费图库注册与高效使用全指南:规避版权风险,提升创作效率

1. 项目概述&#xff1a;为什么我们需要一个高质量的免费图库账号&#xff1f;做内容创作&#xff0c;无论是写博客、做视频、设计海报&#xff0c;还是运营社交媒体&#xff0c;最头疼的问题之一就是“找图”。版权风险、图片质量、搜索效率&#xff0c;每一个都是拦路虎。几年…

作者头像 李华
网站建设 2026/6/18 6:22:22

Firebase AutoML Vision Edge端侧图像识别实战指南

1. 项目概述&#xff1a;让手机摄像头“秒懂”你拍的是什么“Build TensorFlow Lite Model with Firebase AutoML Vision Edge”——这个标题乍看像一串技术缩写拼贴&#xff0c;但拆开来看&#xff0c;它其实讲了一件非常实在的事&#xff1a;不用从零写代码、不需GPU服务器、…

作者头像 李华
网站建设 2026/6/18 6:19:18

Qwen3-VL工业部署实战:前沿多模态大模型落地指南

1. 项目概述&#xff1a;这不是调用API&#xff0c;而是真正“驾驭”多模态大模型的实操手册如果你最近在技术社区、论文预印平台或开源仓库里看到Qwen3-VL这个名字&#xff0c;大概率已经注意到它和前代 Qwen2-VL 相比&#xff0c;不只是参数量涨了、分辨率高了——它在图文对…

作者头像 李华