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

WebWorkers在项目中的使用案例

Worker | 文档

worker 线程的关闭在主线程和 worker 线程都能进行操作,但对 worker 线程的影响略有不同。

// main.js(主线程)
const myWorker = new Worker('/worker.js'); // 创建worker
myWorker.terminate(); // 关闭worker
复制代码
// worker.js(worker线程)
self.close(); // 直接执行close方法就ok了
复制代码

无论是在主线程关闭 worker,还是在 worker 线程内部关闭 worker,worker 线程当前的 Event Loop 中的任务会继续执行。至于 worker 线程下一个 Event Loop 中的任务,则会被直接忽略,不会继续执行。

区别是,在主线程手动关闭 worker,主线程与 worker 线程之间的连接都会被立刻停止,即使 worker 线程当前的 Event Loop 中仍有待执行的任务继续调用 postMessage() 方法,但主线程不会再接收到消息。

在 worker 线程内部关闭 worker,不会直接断开与主线程的连接,而是等 worker 线程当前的 Event Loop 所有任务执行完,再关闭。也就是说,在当前 Event Loop 中继续调用 postMessage() 方法,主线程还是能通过监听message事件收到消息的

new Worker() 用于创建一个新的 Web Worker 线程。Web Worker 是浏览器提供的一种多线程机制,它可以在后台执行 JavaScript 代码,不会阻塞主线程,从而提高了 Web 应用程序的性能和响应能力。
 
以下是一个示例代码,演示了如何使用 new Worker() 创建一个新的 Web Worker 线程:
 
// 创建一个 Web Worker 线程
const worker = new Worker('worker.js');
在上述示例中,我们创建了一个名为 worker 的 Web Worker 线程,并指定了要执行的 JavaScript 文件为 worker.js。
 
需要注意的是,Web Worker 线程中不能直接访问 DOM,也不能使用一些浏览器环境中的 API(如 alert()、confirm()、prompt()、localStorage 等)。同时,Web Worker 线程和主线程之间是通过消息通信来进行交互的,要向 Web Worker 线程发送消息,可以使用 worker.postMessage() 方法;要监听 Web Worker 线程的消息,可以使用 worker.onmessage 事件。

‌一、直接引用绝对路径文件‌
若Worker脚本文件以‌静态资源形式存放‌(如public/worker.js),可直接通过路径引用:

vue2// 主线程代码

// worker.js 代码

vue3+vite+ts  //主线程代码

 // worker.js 代码

二、需要配置的情形

使用动态模块路径或需要引入第三方库时,必须通过worker-loader处理:‌

1.安装依赖‌ npm install worker-loader -D

2.配置vue.config.js‌    添加Webpack规则处理.worker.js后缀文件:

chainWebpack: config => {
 config.module .rule('worker') .test(/\.worker\.js$/) .use('worker-loader') .loader('worker-loader') .end(); 
config.module.rule('js').exclude.add(/\.worker\.js$/) 
}

 //TypeScript项目‌
//需声明Worker模块类型(创建worker.d.ts文件):

declare module '*.worker.js' { class WebWorker extends Worker { constructor(); } export default WebWorker; } }

3.案例:

主线程代码

work.js

self.onmessage=(event)=>{
  const result = event.data.reduce((acc, cur) => acc + cur, 0)
  self.postMessage(result)
  self.close()
}

http://www.dtcms.com/a/92762.html

相关文章:

  • 状态模式(State Pattern)
  • 识货APP sh-sign sh-ba sh-jt 分析
  • qt QQuaternion详解
  • Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)
  • 2025-03-26 学习记录--C/C++-PTA 6-2 顺序表操作集
  • SSML(Speech Synthesis Markup Language)简介
  • 视频前后景分离
  • 003仿射和欧式几何
  • (Windows系统)为matplotlib设置中英组合字体:中文宋体+英文Times New Roman
  • PHP中yield关键字的使用
  • 浏览器渲染原理与优化详解
  • Pytest的Fixture使用
  • 异常断电导致current redo损坏处理
  • 练手项目1:Dockerized Redis访问计数器
  • 【AI】MAC版本本地Stable Diffusion web ui安装
  • 深度剖析:域名与DNS安全的全方位解读
  • UFS Explorer Technician:处理最具挑战性数据恢复及取证案例
  • 【0】数据结构的绪论章
  • DS足球监控【比分直播】监控,钉钉实现自动提醒
  • MySQL-存储过程
  • 05.AI搭建preparationの(transformers01)BertTokenizer实现分词编码
  • 命令模式(Command Pattern)★
  • Linux内核调试 - Hung_task机制分析上
  • 语言模型理论基础-持续更新-思路清晰
  • 无人机螺旋桨平衡标准
  • LangChain开发(二)LangChain提示词模板Template使用
  • 2.7 进度控制习题-2
  • 【JS】反转字符串中的单词
  • 计算机网络基础:WiFi 与蓝牙的原理与应用
  • JavaScript中的继承有哪些方式?各有什么优缺点