前端性能优化-web worker
前言Web Worker 是 HTML5 提供的多线程解决方案可以将耗时的计算逻辑放到独立的后台线程中运行避免阻塞主线程UI 线程解决页面卡顿、交互无响应的问题是前端性能优化的核心手段之一。一、核心基础认知1. 为什么需要 WorkerJavaScript 是单线程语言所有代码都在主线程串行执行。一旦遇到耗时较长的计算大数据排序、复杂算法、大文件解析主线程会被占用导致页面无法响应用户交互、动画掉帧甚至出现 “页面无响应” 提示。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。 如未指定将使用默认值 classicoptions.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、转移后重复使用 ArrayBuffer5.关闭 worker 线程// 组件销毁清理 onUnmounted(() { calcWorker.terminate() self.close() })6. Worker 线程引用其他js文件基于 ESModule模式复杂的计算场景不想把所有代码都放入worker线程时可以直接使用 module 模式初始化 worker 线程。主线程写法// 相对路径导入写法 import HeavyCalcWorker from ./workers/heavy-calc.worker.js?workertypemodule 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))打印结果

相关新闻

091、NPU的缓存一致性:与CPU共享数据

091、NPU的缓存一致性:与CPU共享数据

091 NPU的缓存一致性:与CPU共享数据 一个让我熬夜三天的bug 去年做一款AI摄像头产品,NPU跑YOLOv5做目标检测,CPU负责图像预处理和后处理。一切看起来完美——直到量产前夜,发现设备运行2小时后,检测框开始随机偏移,有时甚至检测不到目标。 我盯着逻辑分析仪看了三个通…

2026/6/18 6:51:05阅读更多 →
端午大礼包【全国产复旦微JFM7VX690T80+双FT-M6678数字信号处理板】讨论

端午大礼包【全国产复旦微JFM7VX690T80+双FT-M6678数字信号处理板】讨论

6U VPX全国产化信号采集处理系统 雷达信号处理 / 光纤信号采集 / FMC和后插板可扩展 / 全国产化可定制 一站式方案 1、 系统简介 该设备为100%全国产,机箱为2U2槽半加固机箱。设备由全国产飞腾 FT-2000 四核处理器或 D2000 八核处理器的高性能 6U VPX 刀片式计算机…

2026/6/18 6:46:05阅读更多 →
2026年PHP漏洞扫描工具深度横评:从原理到实战选型指南

2026年PHP漏洞扫描工具深度横评:从原理到实战选型指南

1. 项目概述:为什么我们需要关注PHP漏洞扫描工具?如果你是一名PHP开发者、网站管理员,或者正在负责一个线上业务的安全,那么“漏洞扫描”这个词对你来说,绝对不陌生。它就像给自家房子做定期的消防检查,你明…

2026/6/18 6:46:05阅读更多 →
Milksnake与Cargo完美配合:Rust开发者的Python扩展指南

Milksnake与Cargo完美配合:Rust开发者的Python扩展指南

Milksnake与Cargo完美配合:Rust开发者的Python扩展指南 【免费下载链接】milksnake A setuptools/wheel/cffi extension to embed a binary data in wheels 项目地址: https://gitcode.com/gh_mirrors/mi/milksnake Milksnake是一款强大的setuptools扩展工具…

2026/6/18 8:11:13阅读更多 →
探索智能驾驶新纪元:如何用openpilot为你的爱车安装“超级大脑“

探索智能驾驶新纪元:如何用openpilot为你的爱车安装“超级大脑“

探索智能驾驶新纪元:如何用openpilot为你的爱车安装"超级大脑" 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.…

2026/6/18 8:11:13阅读更多 →
Geb与Selenium集成:构建企业级UI自动化测试环境

Geb与Selenium集成:构建企业级UI自动化测试环境

1. 项目概述:为什么选择Geb与Selenium的组合?如果你正在为UI自动化测试、网页数据抓取或者日常重复的浏览器操作寻找一个稳定、高效且易于维护的解决方案,那么“Geb与Selenium无缝集成”这个组合绝对值得你投入十分钟来搭建。这不仅仅是一个技…

2026/6/18 8:11:13阅读更多 →
Ubuntu虚拟机安装配置全攻略:从选型到排错一站式解决

Ubuntu虚拟机安装配置全攻略:从选型到排错一站式解决

1. 项目概述:为什么我们需要一个Ubuntu虚拟机? 如果你是一名开发者、运维工程师,或者只是对Linux世界充满好奇的学习者,那么“Ubuntu虚拟机”这个概念对你来说一定不陌生。它绝不仅仅是一个简单的软件安装过程,而是一个…

2026/6/18 8:11:13阅读更多 →
免费M3U8视频下载神器:告别命令行,拥抱图形界面

免费M3U8视频下载神器:告别命令行,拥抱图形界面

免费M3U8视频下载神器:告别命令行,拥抱图形界面 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾经面对复杂的命令行工具感到束手无策?…

2026/6/18 8:11:13阅读更多 →
如何快速掌握CTF流量分析:面向技术爱好者的完整CTF-NetA实战指南

如何快速掌握CTF流量分析:面向技术爱好者的完整CTF-NetA实战指南

如何快速掌握CTF流量分析:面向技术爱好者的完整CTF-NetA实战指南 【免费下载链接】CTF-NetA CTF-NetA是一款专门针对CTF比赛的网络流量分析工具,可以对常见的网络流量进行分析,快速自动获取flag。 项目地址: https://gitcode.com/gh_mirror…

2026/6/18 8:06:12阅读更多 →
ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

ZigBee HA智能家居开发实战:从集群模型到NXP JN516x代码实现

1. ZigBee HA:智能家居的“通用语言”与开发基石如果你正在或计划踏入智能家居设备开发领域,尤其是基于ZigBee协议,那么“ZigBee Home Automation”这个名词你一定不陌生。它不仅仅是ZigBee联盟定义的一套应用层规范,更是确保不同…

2026/6/18 0:00:24阅读更多 →
Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

Java毕设选题推荐:基于 Spring Boot 的个人随笔博客运维管理系统的设计与实现 基于 Spring Boot 的用户原创博客分享社区【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/18 0:00:24阅读更多 →
JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

JN517x嵌入式开发实战:看门狗、脉冲计数器与I2C接口的深度解析与避坑指南

1. 项目概述在嵌入式开发领域,尤其是基于NXP JN517x这类无线微控制器的项目中,系统稳定性和与外设的可靠交互是两大核心挑战。前者关乎产品能否在无人值守的复杂环境中长期运行,后者则决定了设备能否准确感知世界并与其他芯片“对话”。JN517…

2026/6/18 0:00:24阅读更多 →