当前位置: 首页 > news >正文

webworker

众所周知,js一直被说不擅长计算确实,计算是同步的,大规模的计算会让is主线程阻塞,主线程阻塞的结果就是界面完全卡死一样。
异步只是把任务发布出去等着,后面还是会拉到主线程执行的,异步不可能在异步他始终会卡死你的队列自己执行。所以一个耗时很高的操作,无论你做不做异步,页面

总结:js异步是始终要回到主线程的,webworker是不需要回到主线程,它自己创建一条线程自己去操作,这样主线程就可以不用管它,等它计算完了后,它可以主动把计算结果发给主线程(得主动发,不然收不到)



不能在本地文件夹,必须放到线上地址去,一般可以放到public里面去

list.js代码:

11

HomeView.vue代码:

  new Worker("http://127.0.0.1:5173/list.js")


使用方法:
new Worker(js文件)

注意事项:
webworker不能使用本地文件,必须是网络上的同源文件

webworker不能使用window上的dom操作,也不能获取dom对象,dom相关的东西只有主线程有。只能做一些计算相关的操作

有的东西是无法通过主线程传递个子线程的,比如方法,dom节点,些对象里的特殊设置(freeze,getter,setter这些,所以vue的响应式对象是不能传递的)

模块的引入问题

因为webworker的限制,就别想着多线程渲染dom了。因为他根本无法创建dom,所以vue和react框架没有考虑webworker,webworker的常见主要就是耗时的计算
1,随着webgl,canvas等能力的加入,web前端有越来越多的可视化操作。比如在线滤镜,在线绘图,web游戏等等。这些东西都是非常消耗计算的
2,一些后台管理系统也会涉及到一些,最常见的就是一些电子表单。大量的数据大量的计算比如10万条数据导出为excel表格

以例举导出10万条数据为例子:
 

<script setup>
import { writeFile,utils } from 'xlsx';
let arr = [ ]
for (let i = 0; i <= 100000; i++){arr.push({id:i,name:'张三'+i+'号',location:'xxx大道' + i + '号',age: i,a:i*2})
}function exportExcel() {console.log('123');const sheet = utils.json_to_sheet(arr);const workbook = utils.book_new();utils.book_append_sheet(workbook, sheet, 'Sheet1');writeFile(workbook,"test.xlsx")
}
</script>
<template><div><input type="text" name="" id=""><button @click="exportExcel">导出</button></div>
</template>
<style></style>

上述代码中,点击导出,页面直接卡住,input框也用不了,
下面是修改后的代码:
 

<script setup>
import { writeFile } from 'xlsx';// let work1 = new Worker("http://127.0.0.1:5173/excelwork.js")
let work1 = new Worker("http://127.0.0.1:5173/about/excelwork.js")
work1.onmessage = function (e) {let workbook = e.data;console.log(workbook);writeFile(workbook,'text.xlsx')
}
function exportExcel() {work1.postMessage("");
}
</script>
<template><div><input type="text" name="" id=""><button @click="exportExcel">导出</button></div>
</template>
<style></style>

work部分:
 

let arr = []
importScripts('./xlsx')
for (let i = 0; i <= 100000; i++){arr.push({id:i,name:'张三'+i+'号',location:'xxx大道' + i + '号',age: i,a:i*2})
}
self.addEventListener("message",(e) => {const sheet = XLSX.utils.json_to_sheet(arr);const workbook = XLSX.utils.book_new();XLSX.utils.book_append_sheet(workbook, sheet, 'Sheet1');self.postMessage(workbook);  
})


http://www.mrgr.cn/news/67243.html

相关文章:

  • 三维天地:数字技术推动汽车产业实验室管理变革创新
  • 海康私有化视频平台EasyCVR私有化部署视频平台支持国密35114协议有哪些关键加密技术?
  • 【Eclipse系列】Eclipse版本与jdk对应版本
  • Rust 力扣 - 1343. 大小为 K 且平均值大于等于阈值的子数组数目
  • keepalived mysql8互为主从, 要注意哪些问题
  • 【JavaScript】JavaScript开篇基础(4)
  • HJ48 从单向链表中删除指定值的节点
  • **AI的三大支柱:神经网络、大数据与GPU计算的崛起之路**
  • RHCE作业四
  • 实验7-3-4 字符串替换
  • 2024年11月7日 十二生肖 今日运势
  • 【前端】MQTT:通信与聊天室实战
  • 三十三、Python基础语法(面向对象其他语法-下)
  • 非关系型数据库NoSQL的类型与优缺点对比
  • 基于 Vue3、Vite 和 TypeScript 实现开发环境下解决跨域问题,实现前后端数据传递
  • 代码随想录第十八天| 530.二叉搜索树的最小绝对差 、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先
  • 【FPGA】Verilog:理解德摩根第一定律: ( ̅A + ̅B) = ̅A x ̅B
  • 【真题笔记】21年系统架构设计师要点总结
  • dns服务器配置
  • Java项目实战II基于Spring Boot的问卷调查系统的设计与实现(开发文档+数据库+源码)
  • 源文件到可执行文件流程
  • LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)
  • IDEA构建JavaWeb项目,并通过Tomcat成功运行
  • C语言程序的机器表示(逆向+函数调用栈详解版)
  • 【入门篇】2.10 串口打印Helloworld
  • VisionPro —— 颜色匹配工具详解