【前端】WebWorker 在前端SPA框架的应用

news2024/9/23 21:30:29

一、什么是WebWorker

概念: Web Worker是一种在Web浏览器中运行的JavaScript脚本,它可以在后台线程中运行,而不会阻塞主线程。这意味着Web Worker可以在后台执行复杂的计算任务,而不会影响用户界面的响应性能
除了标准的JavaScript 函数集(如 String、Array、Object、JSON 等),可以在 worker 线程中运行任何你喜欢的代码,有一些例外:你不能直接在 worker 线程中操作 DOM 元素,或使用 Window 对象中的某些方法和属性。

二、worker类型

有许多不同类型的 worker:

  1. 专用 worker 是由单个脚本使用的 worker。该上下文由 DedicatedWorkerGlobalScope 对象表示。
  2. SharedWorker 是可以由在不同窗口、IFrame 等中运行的多个脚本使用的 worker ,只要它们与 worker 在同一域中。它们比专用的 worker 稍微复杂一点——脚本必须通过活动端口进行通信。
  3. Service_Worker 基本上是作为代理服务器,位于 web 应用程序、浏览器和网络(如果可用)之间。它们的目的是(除开其他方面)创建有效的离线体验、拦截网络请求,以及根据网络是否可用采取合适的行动并更新驻留在服务器上的资源。它们还将允许访问推送通知和后台同步 API。

三、专用Woker

特性: 仅能被创建它的脚本所访问

  1. 创建一个worker
    const myWorker = new Worker(‘worker.js’);
  2. 你可以通过 postMessage 方法和 onmessage 事件处理函数触发 worker 的方法。当你想要向一个 worker 发送消息时,你只需要这样做(main.js)
first.onchange = () => {
  myWorker.postMessage([first.value, second.value]);
  console.log("Message posted to worker");
};

second.onchange = () => {
  myWorker.postMessage([first.value, second.value]);
  console.log("Message posted to worker");
};
myWorker.onmessage = (evt)=>{	console.log(evt.data)}
  1. worker 脚本如何编写
self.onmessage = (evt)=>{		console.log(evt.data)}
self.postMessage("message")
  1. 终止worker
myWorker.terminate();

四、使用注意事项

  1. woker 脚本里面不能访问DOM对象
  2. woker的window对象和主进程中的window对象不是同一个global对象
  3. woker postMessage都时候不能send 不能序列化的Object对象
  4. woker 里面可以通过importScript方法导入对象
    a)importScript(“path”)

五、前端SPA框架中如何应用worker程序

SPA框架中需要通过commonjs或者requirejs来导入模块,而worker中的脚本通常不是一个标准的module,这样普通方式无法导入,常见的方案有两种

  1. 将worker script转换为二进制blob文件,然后通过export 导出
    在这里插入图片描述

  2. 在webpack中引入worker-loader,通过loader导入的woker可以在script脚本中通过import导入新的module
    在这里插入图片描述

六、具体使用场景

  1. 纸质书电子化场景中,引入需要将大量的框和表单做数据合并处理,常规对方式的处理势必将会在一定程度上对GUI、JS等渲染线程有一定的阻塞和性能问题,因此我们引入了worker处理这种大量计算的

在这里插入图片描述

  1. 在项目代码中的使用如下

a)在这里插入图片描述

b)在这里插入图片描述

七、总结

Web Workers适合在以下场景下使用:

  1. 多线程计算任务: 当网页中需要执行大量计算、数据处理或密集型操作时,Web Workers可以在后台线程中处理这些任务,避免阻塞主线程,提高页面的响应性和流畅性。
  2. 长时间运行的任务: 有些任务可能需要较长时间才能完成,例如图像处理、音视频编解码等。使用Web Workers可以使这些任务在后台进行,不会影响用户与页面的交互。
  3. 网络请求: 在执行大量网络请求时,可以使用Web Workers来分担主线程的工作负担,从而避免页面因网络请求过多而变得卡顿。
  4. 复杂动画: 对于复杂的动画效果,可以将计算部分交给Web Workers,以提高动画的流畅性和性能。
  5. 大规模数据处理: 当需要处理大规模数据集时,Web Workers可以帮助并行处理数据,提高数据处理的效率。
  6. 实时通信: 使用Web Workers可以实现WebSocket或WebRTC等实时通信协议,实现与服务器的实时双向通信。
    需要注意的是,Web Workers不能直接访问DOM,因为它们在一个独立的上下文中运行,无法访问主线程的变量和函数。因此,Web Workers主要用于处理计算密集型任务和与DOM无关的后台处理。如果需要与DOM交互,可以通过使用postMessage来与主线程进行通信,从而达到数据交换的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/986293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++之生成key-value键值三种方式(一百九十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

vue前后端端口不一致解决方案

在config index.js文件中 引入如下代码即可 const path require(path) const devEnv require(./dev.env) module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: devEnv.OPEN_PROXY false ? {} : {/api: {target: http://localhos…

swiper删除虚拟slide问题

在存在缓存的情况下,删除较前的slide,会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide,且这5个slide已缓存,则删除slide2后,仍为5个slide,且slide2的内容变为slide3的内容,此…

Linux入门之多线程|线程的同步|生产消费模型

文章目录 一、多线程的同步 1.概念 2.条件变量 2.1条件变量概念 2.2条件变量接口 1.条件变量初始化 2.等待条件满足 3.唤醒等待 3.销毁条件变量 2.3条件变量demo 二、生产消费模型 1.生产消费模型 2.基于BlockQueue的生产者消费者模型 3.基于C用条件变量和互斥锁实…

RecyclerView+Flexbox实现流式布局

之前使用 FlexboxLayout 实现流式布局,但是选中和反选效果不好实现,就改用RecyclerViewFlexboxLayoutManager 实现流式布局: 说明:如果是直接展示标签,没有其他选中效果时,建议直接使用 FlexboxLayout实现…

Scrum认证高级Scrum Master (A-CSM) 认证培训课程

课程简介 高级ScrumMaster (Advanced Certified ScrumMaster, A-CSM) 认证课程是国际Scrum联盟推出的进阶级Scrum认证课程,是Scrum Master通往专业级敏捷教练必经的学习路径。 在ScrumMaster(CSM)认证课程中,您学习到了Scrum的价…

Redis核心数据结构与高性能原理

Redis的单线程和高性能 Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等&#xff…

Mybatis复杂查询及动态SQL

文章目录 一. 较复杂的查询操作1. 参数占位符#{}和${}2. SQL注入3. like查询4. resultType与resultMap5. 多表查询5.1. 一对一表映射5.2. 一对多表映射 二. 动态SQL1. if标签2. trim标签3. where标签4. set标签5. foreach标签 本篇中使用的数据表即基础映射类都是基于上一篇博客…

什么是SpringMVC以及SpringMVC框架的优点

它是基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP. 什么是MVC? 它是一种开发模式,它是模型视图控制器的简称.所有的web应用都是基于MVC开发. M:模型层,包含实体类,业务逻辑层,数据访问层 模型 模型(Model):就是业务流程/状态…

每日刷题-2

目录 一、选择题 二、编程题 1、倒置字符串 2、排序子序列 3、字符串中找出连续最长的数字串 4、数组中出现次数超过一半的数字 一、选择题 1、 题目解析: 二维数组初始化的一般形式是: 数据类型 数组名[常量表达式1][常量表达式2] {初始化数据}; 其…

使用SpringCloud Eureka 搭建EurekaServer 集群- 实现负载均衡故障容错【上】

😀前言 本篇博文是关于使用SpringCloud Eureka 搭建EurekaServer 集群- 实现负载均衡&故障容错,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可…

使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发

使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发 文章中探讨了 Google 提供的应用架构指南在多平台上的实现。通过共享视图模型(View Models)和共享 UI 状态(UI States),我们可以专注于在原生端…

RHCSA-VMware Workstation Pro-Linux基础配置命令

1.代码命令 1.查看本机IP地址&#xff1a; ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1&#xff1a;<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP>为虚拟机自身网卡 2.测试网络联通性&#xff1a; [f…

【0907作业】写一个shell脚本,将以下内容放到脚本中

在家目录下创建目录文件&#xff0c;dir在dir下创建dir1和dir2把当前目录下的所有文件拷贝到dir1中&#xff0c;把当前目录下的所有脚本文件拷贝到dir2中把dir2打包并压缩为dir2.tar.xz再把dir2.tar.xz移动到dir1中解压dir1中的压缩包使用tree工具&#xff0c;查看dir下的文件 …

vue3:5、组合式API-reactive和ref函数

<script setup> /* reactive接收一个对象类型的数据&#xff0c;返回一个响应式的对象 *//*** ref:接收简单类型或复杂类型&#xff0c;返回一个响应式对象* 本质&#xff1a;是在原有传入数据的基础上&#xff0c;外层报了一层对象&#xff0c;包成了复杂类型* 底层&…

宇凡微YE09合封芯片,集成高性能32位mcu和2.4G芯片

合封芯片是指将主控芯片和外部器件合并封装的芯片&#xff0c;能大幅降低开发成本、采购成本、减少pcb面积等等。宇凡微YE09合封芯片&#xff0c;将技术领域推向新的高度。这款高度创新性的芯片融合了32位MCU和2.4G芯片&#xff0c;为各种应用场景提供卓越的功能和性能。 32位M…

CSDN: ABTest流量分层分桶机制

在互联网行业&#xff0c;无论是构建搜索推荐系统&#xff0c;还是智能营销等场景&#xff0c;都是围绕用户进行不同的实验&#xff0c;从各项指标上观察用户对不同交互、流程、策略、算法等反馈&#xff0c;进而对产品进行迭代改进。 本文的goal&#xff1a;在进行了模型的线下…

STM32 FreeRTOS 内存问题

1. STM32L151C8T6 内存&#xff0c;64Kb 的Flash&#xff08;代码就是烧录在这里面的&#xff09;&#xff0c;16Kb 的RAM&#xff0c;程序跑起来之后的内存&#xff0c;相当于我们高考时发的草稿纸&#xff0c;直接影响程序的运行速度&#xff0c;可以用STM32 CubeMx 软件直接…

JMeter压力测试 5分钟让你学会如何并发压测接口

文章目录 地址下载启动 使用 地址 JMeter官网下载&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 下载 最新款的jmeter需要java8的支持&#xff0c;请自行安装jdk8或以上的版本 根据系统不同系统下载zip或者是tgz格式的压缩包&#xff0c;并解压&#xff0c;博…

Google 在 2023 开发者大会上的 AI 革命

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页 ——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…