Vue 进阶系列丨webWorker 多线程

利用Web-Workers优化Vue中的繁重操作 在Vue 3中集成Web Workers能有效管理重型计算导致的性能瓶颈。通过将任务分流到后台线程,可保持数据密集型应用的UI流畅性。祝编程愉快,我们下次见! 阅读详情

0d9fa625e9e73a8aabf12905b4cfba74.png

Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!


2013年7月28日,尤雨溪第一次在 GItHub 上为 Vue.js 提交代码;2015年10月26日,Vue.js 1.0.0版本发布;2016年10月1日,Vue.js 2.0发布。

最早的 Vue.js 只做视图层,没有路由, 没有状态管理,也没有官方的构建工具,只有一个库,放到网页里就可以直接用了。

后来,Vue.js 慢慢开始加入了一些官方的辅助工具,比如路由(Router)、状态管理方案(Vuex)和构建工具(Vue-cli)等。此时,Vue.js 的定位是:The Progressive Framework。翻译成中文,就是渐进式框架。

Vue.js2.0 引入了很多特性,比如虚拟 DOM,支持 JSX 和 TypeScript,支持流式服务端渲染,提供了跨平台的能力等。Vue.js 在国内的用户有阿里巴巴、百度、腾讯、新浪、网易、滴滴出行、360、美团等等。

Vue 已是一名前端工程师必备的技能,现在就让我们开始深入学习 Vue.js 内部的核心技术原理吧!


什么是webworker

众所周知,JavaScript是一个单线程的,也就是说,所有的任务都在一个线程上去执行,只能等着前面的任务执行完毕,才可以执行后面的任务。当我们面对大数据量计算的场景下,我们的页面就会出现一个假死的现象,用户什么都做不了,只能傻傻的等待。我们呢,就等待着测试小姐姐给我们提一个bug。。。

webworker就是来解决这个东西的,先说一句,webworker不是什么第三方的东西,它是JavaScript原生支持的。webworker为JavaScript创建多线程环境,允许主线程创建worker子线程,当然,可以创建多个。我们可以将一些任务,分配给子线程去做。在主线程运行的同时,子线程在后台也同时运行,互不干扰。等子线程做完了,就把结果返回给主线程。

这样的好处就是我们可以把那些计算量大、耗时长的任务,分配给worker线程去做,主线程就会很流畅,不会被阻塞或者拖慢。

但是,worker线程一旦创建成功,就会一直执行,不会被主线程上的活动打断。举个例子,当主线程有一个弹窗alert,那么会阻塞主线程,但是不会对子线程有任何影响。这也就说明了,worker是比较消耗资源的,不应该过度使用,而且当使用完毕了,就要给关闭。


原生webworker如何使用

废话不多说,直接上代码,在上代码之前,我们先设定一个场景:

你有一个十万级的简单累加运算,页面中有一个input输入框,进入页面的时候,计算开始,我们去观察input输入框能否同步输入。

不使用webworker

代码目录结构如下:

b5be53a97064fa851696d25162c4c6c7.png

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>test_webworker</title>
  </head>
  <body>
    <input type="text" />
    <script src="./index.js"></script>
  </body>
</html>
// index.js  ---主线程


let sum = 0;
for (let i = 0; i < 200; i++) {
    for (let i = 0; i < 10000; i++) {
        sum += Math.random()
    }
}

页面运行后效果:直接假死现象,因为后台正在计算,input框都没有渲染出来

b9172a75d50147291731ca32d3cb97cc.png

使用webworker子线程

现在我们使用webworker,将这200万次累加计算,给worker子线程去做。

代码目录如下:

1a268cb67455499784fbae44be4c53d5.png

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>test_webworker</title>
  </head>
  <body>
    <input type="text" />
    <script src="./index.js"></script>
  </body>
</html>
// index.js  ---主线程


// 创建一个子线程
const worker = new Worker('worker.js')
// 接收子线程发来的消息
worker.onmessage = e => {
    console.log('主线程接收到:', e.data)
    worker.terminate();
}


// 向子线程发消息
worker.postMessage('子线程,你真帅!')
// worker.js ---子线程


// 接收主线程发来的消息
onmessage = e => {
  console.log('子线程接收到:', e.data)
}


let sum = 0;
for (let i = 0; i < 200000; i++) {
    for (let i = 0; i < 10000; i++) {
        sum += Math.random()
    }
}


// 向主线程发送消息
postMessage(sum)

页面运行如下:

22c8aba27c6f45bb546a66e58be1589c.png

在子线程运行的过程中,主线程中的input输入框是可以同时输入内容的,并没有因为计算而阻塞UI渲染。当worker运行完毕,就把sum传递给主线程,这样就解决了。


Vite 中使用webworker

在 Vite 中,不用这么复杂,我们只需要通过模块的方法,导入一个模块的 js,然后在后面冠以一个 ?worker,就会返回一个 MyWorker 或者是任何的 worker 对象,然后我们再去实例化这个 Worker,就会返回这个 worker 对象了。也就是说,我们可以把这个 worker 的 js,当成是一个模块来使用。

听起来好像很是一回事,其实很简单,通俗的两句话解决:

// 原生的:
const worker = new Worker('./worker.js)
worker.onmessage = function(ev){}


// Vite中的:用原生的,可以
const worker = new Worker('./worker.js)
worker.onmessage = function(ev){}


// Vite中的:用模块导入形式的,也可以
import MyWorker from './worker?worker'
const worker = new MyWorker()
worker.onmessage = function(ev){}

加上 ?worker 有啥用?加上后,就会把当前模块当成webworker来使用了,就可以通过 new 来创建 webworker 了。


Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!

b6d20184a9b0743e506946b136880747.png

叶阳辉

HFun 前端攻城狮

往期精彩:

Vue中的Web Worker实际应用 Vue中的Web Worker可以与主线程进行通信,使得我们能够将一些复杂的任务交给Web Worker处理,然后在主线程中处理结果。在这个示例中,我们在created钩子函数中创建了一个Web Worker实例,并通过addEventListener方法监听Web Worker发送的消息。接下来,我们需要在Vue组件中使用Web Worker。假设我们有一个名为WorkerComponent的组件,我们可以在这个组件中引入刚刚创建的worker.js文件,并与Web Worker进行通信。 阅读详情

相关推荐

vue3中使用Web Worker多线程(TS风味版)

用于《vue3中使用Web Worker多线程》这篇文章的项目Demo下载 文章地址:https://blog.youkuaiyun.com/weixin_42063951/article/details/125300644

在Vue中使用Web Worker详细教程

Web Worker是2008年h5提供的新功能,每一个新功能都是为了解决原有技术的的痛点,那么这个痛点是什么呢?

ICanWin_lll的博客 1万+

【机器学习】实验2,基于回归分析的大学综合得分预测(完整代码实现+分析)

大学排名是一个非常重要同时也极富挑战性与争议性的问题,一所大学的综合实力涉及科研、师资、学生等方方面面。目前全球有上百家评估机构会评估大学的综合得分进行排序,而这些机构的打分也往往并不一致。在这些评分机构中,世界大学排名中心(Center for World University Rankings,缩写CWUR)以评估教育质量、校友就业、研究成果和引用,而非依赖于调查和大学所提交的数据著称,是非常有影响力的一个。

高丽大学人工智能硕士在读|专注大模型、RAG、OCR与AI工程实践 1973

Vue中使用WebWorker

Vue中使用WebWorker

weixin_44240581的博客 4614

4、同轴3 - RRR球面并联机构运动分析与自主移动农业水果采摘机器人设计

本文研究了同轴3-RRR球面并联机构的运动学与速度分析,采用几何与数值方法进行位置分析,并利用螺旋理论简化雅可比矩阵的推导,通过ADAMS仿真验证了结果的准确性。同时提出一种新型自主移动农业水果采摘机器人设计,具备多功能末端执行器、水果软管转移系统和配重式静态稳定性结构,旨在减少采摘损伤、提升效率。文章还探讨了该机构在机器人控制与仿真中的应用潜力,以及采摘机器人在智能化升级与多机协作方面的发展方向。

y4z5a6b7的博客 244

FlexSim:FlexSim软件介绍与安装

在开始安装FlexSim之前,首先需要从FlexSim官方网站下载安装包。FlexSim提供不同版本的软件,包括教育版、专业版等,确保选择适合您需求的版本。下载页面通常会列出系统要求,包括操作系统、处理器、内存和硬盘空间,确保您的计算机满足这些要求。访问FlexSim官方网站。导航至下载页面。选择适合您需求的FlexSim版本。点击下载按钮,开始下载安装包。在开始构建模型之前,首先需要明确模型的目标。模型目标是指导模型设计和分析的核心,它定义了你希望通过模型解决的问题或探索的系统行为。

kkchenjj的博客 5802

WebWorker 其实没那么难

很多同学在学习一些技术时,并没有理解这些技术所能解决的问题,没有这些技术会导致怎样的问题。结果在学了之后,只学了一个皮毛,学了有哪些 API,在项目中又难以去运用。本篇文章将从问题出发,探讨 WebWorker 是怎么来应用的。

baburwang的博客 2040

【Pytorch实战教程】基于RML2018的融合网络分类 | LSTM网络和ResNet网络融合 | 含数据集的处理

这段代码是从原始数据中读取所选择的数据,画出星座图,并将星座图保存本地,然后将IQ数据保存成mat文件,将图片数据读取之后保存为npy文件,方便后续融合网络使用。

若北辰 926

webWorker基本用法

我们都知道js是一个单线程的语言,当线程堵塞时,可能会导致页面无法正常交互,如一些复杂的可视化处理。即使是异步处理,也只是将其暂存到任务队列中去,等主线程执行完后依然会从任务队列中取过去。

qq_58174484的博客 1940

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 168

静态时序分析(STA)基本概念

静态时序分析中常见概念(fasle Path,multicycle path等)

m0_61544122的博客 2252

js是单线程的,如何实现多线程?一份WebWorker食用指南附上

js是单线程的,如何实现多线程?”当这句话从面试官口中说出来的时候,怎么去回答,才疏学浅的我,好奇心就一下被勾起来了。甚至脑中已经yy到了我与面试官对峙的场景:面试官:“js是单线程的,如何实现多线程?我:“咱就是说************ ,你 ************吧”(此处省略一万字…)以上开玩笑,接下来进入正题。

wz9608的博客 1517

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 236

vue+vite项目下如何正确编写webworker

用我自己的理解并且用人话来说,就是可以实现,在网页涉及大量的计算,或者说网页需要进行长时计算以及复杂渲染过程,但是这个过程和网页的交互是并行的,我们通常会希望说,这些复杂的过程不会影响用户去影响网页的使用,然鹅,我们最喜欢的javascript偏偏就是单线程的语言,意味着这些过程只有计算完成之后,才会执行其他的代码,也就是交互。接下来需要说的是,目前主推的vue3,更多的打包工具用的是vite,这个是推荐的,我相信大部分人使用的也是vite吧,如果不是那就算了哈哈。好的,我们步入正题。

weixin_51295863的博客 1304

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

webWorker多线程使用

多线程处理,帮你解决性能困扰。

Sanchez_的博客 758

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JS创造多线程webworker来处理前端大量的计算

JS创造多线程webworker来处理前端大量的计算

m0_56065511的博客 1321

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Vue3中使用WebWorker多线程JS原味版项目Demo:探索多线程编程新境界

Vue3中使用WebWorker多线程JS原味版项目Demo:探索多线程编程新境界 去发现同类优质开源项目:https://gitcode.com/ 在Web开发领域,多线程编程一直是提升性能的有效手段。本文将为您详细介绍一个Vue3中使用WebWorker多线程(JS原味版)的项目Demo,带您领略多线程在现代前端开发中的应用魅力。 项目介绍 Vue3中使用WebWorker多线程JS原味版项目...

gitblog_06736的博客 719

webworker 入门教程

就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 子线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 子线程在后台运行,两者互不干扰。等到 Worker 子线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 子线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

weixin_52268321的博客 678

webworker

1.webworker 是什么 ? 回顾一下JS的一些特性 js 是单线程的 js 是异步的(非阻塞) js 是事件驱动的 js的多线程 笔记本 核心 线程 虚拟线程,一堆堆牛逼的配置,js要还是单线程,看着有点可惜 就像鞋帮和鞋底子,鞋底子特别好, 穿了两天鞋帮子坏了,可惜不 那么牛逼的硬件,当然 要用起来了,于是 JS 的多线程来了 ... 什么时候用呢 我最近用它,是因为后端得瑟了, 不做搜索,不分组,不给排序,不组织父子关系,还特么不分页(没脾气,干就完了) 组织千条数据的父子关系,

jasonjkj的博客 395

WebWorker 优化数据导出下载 Excel 用户操作体验

这是一篇介绍如何借助浏览器的 Webworker 多线程能力对当前导出 Excel 文件进行性能优化的文章。

qq_23935353的博客 2988

关于HTML5中的WebWorker

关于HTML5中的WebWorker

太阳与星辰的博客 1043

Web Worker,JS多线程,vue-worker

http://www.ruanyifeng.com/blog/2018/07/web-worker.html阮一峰文档介绍web worker 摘录: 一、概述 JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。随着电脑计算能力的增强,尤其是多核 CPU 的出现,单线程带来很大的不便,无法充分发挥计算机的计算能力。 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 .

q759859479的博客 4642

在Vue中使用多线程——Comlink-loader的应用

Comlink精妙的地方,我个人认为在于将数据传递的操作变成了一个异步的操作,这样我们就能很好的利用ES6所提供的async/await语法糖,将数据的传递与接收逻辑写得非常简洁优雅。开发者不需要再去考虑事件订阅所带来的各种复杂度。

weixin_41646552的博客 9189

前端大文件上传方案-一站式教程(hash算法+增量+webworker多线程+并发请求池)

本文介绍了基于Vue3+TypeScript的前端大文件上传方案,主要包含以下核心内容:1)文件分片处理技术,通过Blob.slice将大文件切割为1MB大小的切片;2)利用WebWorker多线程和Spark-MD5库实现文件hash值的增量计算,避免阻塞主线程;3)断点续传机制,通过对比服务器缺失分片实现续传;4)并发请求池控制上传并发数,提供重试机制保证上传可靠性。该方案完整实现了大文件上传的前端处理流程,包括分片、hash计算、并发上传等关键环节,为后端接口处理提供了基础。

weixin_68222693的博客 1129

vite使用webWorker

使用web worker可以进行多线程的数据处理, 我们可以把包含大量数据的逻辑交给webworker, 能避免在数据处理过程中造成的页面卡顿.需要注意的是, 为了让worker文件放在vue项目下, 并且支持ts和ES, 需要用new URL预置方法来处理路径。项目根目录的任意目录下, 新建一个webworker的文件。

walaw11的博客 745
上一篇: Vue 进阶系列丨vuex持久化
下一篇: Vue 进阶系列丨大文件切片上传
HFun TM
博客等级 码龄5年 98粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值