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

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.kler.cn/a/382368.html

相关文章:

  • Charles抓包_Android
  • 基于SpringBoot+Vue实现新零售商城系统
  • JavaScript数据类型- Symbol 详解
  • 如何看待AI技术的应用场景:现状与未来的全面解析
  • InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记
  • 【Android】Gradle 7.0+ 渠道打包配置
  • 如何使用uniswap v2 获取两个代币的交易对池子
  • 实习冲刺Day15
  • golang学习3
  • leetcode206. Reverse Linked List
  • 理解 Transformer 中的编码器-解码器注意力层(Encoder-Decoder Attention Layer)
  • 【测试语言篇一】Python进阶篇:内置容器数据类型
  • 24年配置CUDA12.4,Pytorch2.5.1,CUDAnn9.5运行环境
  • 【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)
  • 【LeetCode热题100】哈希表
  • 【大模型LLM面试合集】大语言模型架构_bert细节
  • [ DOS 命令基础 3 ] DOS 命令详解-文件操作相关命令
  • 三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库
  • 视图-数据库sqlserver
  • jmeter 性能测试步骤是什么?
  • 代码随想录训练营Day18 | 77. 组合 - 216.组合总和III - 17.电话号码的字母组合
  • Qml组件之Text
  • DGL库之dgl.function.u_mul_e(代替dgl.function.src_mul_edge)
  • 模拟实现strcat函数
  • 线程池核心参数有哪些
  • Vue 组件传递数据-Props(六)