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

一、什么是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.rhkb.cn/news/123290.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Bean 别名处理原理分析

今天来和小伙伴们聊一聊 Spring 中关于 Bean 别名的处理逻辑。 1. Alias 别名,顾名思义就是给一个 Bean 去两个甚至多个名字。整体上来说,在 Spring 中,有两种不同的别名定义方式: 定义 Bean 的 name 属性,name 属性…

Python 内置函数详解 (1) 数学运算

近期在外旅游,本篇是出发前定时发布的,不完整,旅游回来后再补充。 Python 内置函数 Python3.11共有75个内置函数,其来历和分类请参考:Python 新版本有75个内置函数,你不会不知道吧_Hann Yang的博客-CSDN博客 函数列表 abs aiter all …

【LeetCode-中等题】90. 子集 II

文章目录 题目方法一:递归加回溯(去重版)![在这里插入图片描述](https://img-blog.csdnimg.cn/abc4e8d0e3f940fcbdcb072acf80734e.png) 题目 本题nums数组存在重复元素,所以本题会涉及一个去重操作: 子集无需去重版本&…

系统学习Linux-zabbix监控平台

一、zabbix的基本概述 zabbix是一个监控软件,其可以监控各种网络参数,保证企业服务架构安全运营,同时支持灵活的告警机制,可以使得运维人员快速定位故障、解决问题。zabbix支持分布式功能,支持复杂架构下的监控解决方…

MATLAB R2023a完美激活版(附激活补丁)

MATLAB R2023a是一款面向科学和工程领域的高级数学计算和数据分析软件,它为Mac用户提供了强大的工具和功能,用于解决各种复杂的数学和科学问题。以下是MATLAB R2023a Mac的一些主要特点和功能: 软件下载:MATLAB R2023a完美激活版 …

Lua语法结构

Lua基础 注释 print("hello.") -- 单行注释的写法 --[[ 多行注释的写法 --]]标识符 关键字 **and **break**do **else**elseif ****end **falsefor**function **ifinlocalnilnotorrepeatreturnthentrueuntil**while ** 数据类型 nil** boolean**** number**** st…

Excel VSTO开发10 -自定义任务面板

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 10 自定义任务面板 自定义任务面板(有些地方称为侧边面板)即CustomTaskPane,这个类在Microsoft…

软件架构设计(六) 软件架构风格-MDA(模型驱动架构)

概念 模型驱动架构MDA, 全称叫做Model Driven Architecture。 Model:表示客观事物的抽象表示Architecture:表示构成系统的部件,连接件及其约束的规约Model Driven: 使用模型完成软件的分析,设计,构建,部署和维护等 开发活动MDA起源于分离系统规约和平台实现的思想。之前…

C++------vector【STL】

文章目录 vector的介绍及使用vector的介绍vector的使用 vector的模拟实现 vector的介绍及使用 vector的介绍 1、vector是表示可变大小数组的序列容器。 2、就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数…

js数据类型?如何判断js数据类型?

在JavaScript中,有以下几种数据类型: 基本数据类型(Primitive Data Types): String(字符串):表示文本数据,使用引号(单引号或双引号)括起来。Numb…

linux运维(二)内存占用分析

一、centos内存高,查看占用内存, top命令详解 1.1: free 命令是 free 单位K free -m 单位M free -h 单位Gfree最常规的查看内存占用情况的命令 1.2: 参数说明 total 总物理内存 used 已经使用的内存 free 没有使用的内存 shared 多进程共享内存 buff/cache 读写…

《TCP/IP网络编程》阅读笔记--基于 TCP 的半关闭

目录 1--基于TCP的半关闭 1-1--TCP单方面完全断开的问题 1-2--shutdown()函数 1-3--半关闭的必要性 2--基于半关闭的文件传输程序 1--基于TCP的半关闭 1-1--TCP单方面完全断开的问题 Linux 系统中的 close 函数会将 TCP Socket 的连接完全断开,这意味着不能收…

el-table自适应列宽实现

【背景小记】 el-table的el-table-column如果不指定width的话,会自动设定一个宽度,表格内容会自动换行,对强迫症用户来说非常不友好,为了追求完美用户体验,所以这里需要实现两个效果: 1. 强制表格内容不换…

CAS策略

CAS CAS(Compare And Swap)比较并交换 CAS是多线程环境下对共享变量进行修改时的一种策略,主要存在三个参数:当前值、预估值、结果 CAS采用的策略是当一个线程要对共享变量进行修改时,需要获取内存中共享变量的值作…

小白备战大厂算法笔试(二)——数组、链表、列表

文章目录 常见数据结构数组初始化访问元素插入元素删除元素遍历数组查找元素扩容数组关于数组 链表初始化插入节点删除节点访问节点查找节点常见类型典型应用 数组VS链表列表初始化访问元素插入与删除元素遍历列表拼接列表排序列表简单实现 常见数据结构 常见的数据结构包括数…

工业4.0时代下,到底什么是智慧工厂?

关键词:智慧工厂、智慧工厂数字化、设备设施数字化、能源管理系统、动环监控、智能运维、数据采集、工业互联网 随着物联网、大数据和移动应用等新一轮信息技术的发展,全球化工业革命开始提上日程,工业转型开始进入实质阶段。作为工业4.0的最…

自动化测试面试常见技术题目

1:一行代码实现1--100之和 print(sum(list(range(1,101)))) 2:如何在一个函数内部修改全局变量 global  修改全局变量 局部作用域只能调用全局作用域的变量,但是不熊修改全局作用域的变量,如果想要修改全局作用域的变量需要gl…

【算法】插入排序

插入排序 插入排序代码实现代码优化 排序: 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录&…

一文讲解Linux内核内存管理架构

内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,而且对性能也有很高的要求。本文从内存管理硬件架构、地址…

RabbitMQ高级特性

目录 消息的可靠投递confirm和return Consumer Ack 消费端限流 TTL Time To Live(存活时间/过期时间) 死信队列(死信交换机) 延迟队列 日志与监控 rabbitmqctl管理和监控 消息追踪 消息的可靠投递confirm和return 持久…