React中使用worker线程

简介: 本文介绍了在React项目中使用worker线程的方法,包括配置webpack以使用worker-loader,创建worker文件,并在组件中使用worker进行大量计算以避免阻塞主线程。

首先

需要在webpack.config.js中配置worker-loader;
如果没找到webpack.config.js这个文件,我们可以使用npm run eject来讲webpack的文件暴露出来,但是一经暴露,无法还原。

npm run eject

**Note: this is a one-way operation. Once you eject, you can't go back!**
我们需要先下载loader

npm i worker-loader

在webpack.config.js中使用:

 rules: [
        {
   
          test: /\.worker\.js$/,
          use: [{
   
            loader: 'worker-loader',
          },
          {
    loader: 'babel-loader' }]// 增加es6 转换语法
        },
        ......
        ]

大概就在这个文件的340行位置。在这里插入图片描述

使用worker

我们使用的时候需要woeker文件以xxx.worker.js结尾:
如:
file.worker.js
file.worker.js内容:



onmessage = function (e) {
   //监听主进程的消息

  const {
   data1,data2} =e.data

  console.time("开始计算")
  const DIFF = require('diff')
  let DiffLeft = DIFF.diffLines(data1, data2)

  console.timeEnd("开始计算")

  postMessage({
    DiffLeft, DiffRight: DiffLeft})//向主进程发送消息
}

在A组件中引入:

import React, {
    useEffect, useState } from 'react'
import Worker from './file.worker.js'

使用:

  const [workerObj1, setWorkerObj1] = useState({
   })

   useEffect(() => {
   
        const myWorker = new Worker();
        setWorkerObj1(myWorker)
    }, [])
  //点击事件:
     const workerFun = () => {
   
          //向子进程发送消息
               workerObj1.postMessage(JSONObj.data)
                workerObj1.onmessage = function (e) {
   
                //执行这个函数说明已经收到了worker线程的消息
            console.log(e.data,'完成')
            setcontextBoxLoading(false)
            const {
    DiffLeft,DiffRight } = e.data
            setoldStr(DiffLeft)
            setnewStr(DiffRight)
            workerObj1.terminate()
        }
    }

我们可以创建多个worker线程,每个线程做自己的事情,适合做大量的运算。
在worker线程做大量运算不会造成主线程渲染或者执行其他js失败,不会造成页面卡顿或者无响应。

目录
相关文章
|
27天前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
26 0
|
29天前
|
Web App开发 JavaScript 前端开发
[译] 深入理解 Node.js 中的 Worker 线程
[译] 深入理解 Node.js 中的 Worker 线程
|
1月前
|
Cloud Native Java 调度
项目环境测试问题之线程同步器会造成执行完任务的worker等待的情况如何解决
项目环境测试问题之线程同步器会造成执行完任务的worker等待的情况如何解决
|
缓存 前端开发 JavaScript
🥳🥳🥳Worker中还可以创建多个Worker,打开多线程编程的大门
本篇主要探索 Worker 的更多用法,主要是如何创建多个 Worker ,在 Worker 中如何发送请求,以及如何使用 Worker 进行多线程编程。
395 0
🥳🥳🥳Worker中还可以创建多个Worker,打开多线程编程的大门
|
存储 缓存 前端开发
Web性能优化之Worker线程(下)
{服务工作线程|Service Worker} 基础概念 ⭐️⭐️⭐️ 线程缓存 ⭐️⭐️⭐️⭐️ 线程客户端 生命周期 ⭐️⭐️⭐️ 控制反转与线程持久化 updateViaCache 管理服务文件缓存 ⭐️⭐️⭐️ 线程消息 ⭐️⭐️⭐️ 拦截 fetch 事件 ⭐️⭐️⭐️⭐️⭐️
206 0
|
Web App开发 消息中间件 JavaScript
Web性能优化之Worker线程(上)
Worker 线程简介 {专用工作线程|Dedicated Worker} 专用工作线程 + Webpack {共享工作线程| Shared Workers }
609 0
|
安全 Java
【高并发】通过源码深度分析线程池中Worker线程的执行流程
在《高并发之——通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程》一文中我们深度分析了线程池执行任务的核心流程,在ThreadPoolExecutor类的addWorker(Runnable, boolean)方法中,使用CAS安全的更新线程的数量之后,接下来就是创建新的Worker线程执行任务,所以,我们先来分析下Worker类的源码。
247 0
【高并发】通过源码深度分析线程池中Worker线程的执行流程
|
Java Android开发
【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
227 0
|
安全 Java
高并发之——通过源码深度分析线程池中Worker线程的执行流程
在《高并发之——通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程》一文中我们深度分析了线程池执行任务的核心流程,在ThreadPoolExecutor类的addWorker(Runnable, boolean)方法中,使用CAS安全的更新线程的数量之后,接下来就是创建新的Worker线程执行任务,所以,我们先来分析下Worker类的源码。
194 0
|
前端开发 JavaScript
【worker】js中的多线程
因为下个项目中要用到一些倒计时的功能,所以就提前准备了一下,省的到时候出现一下界面不友好和一些其他的事情。正好趁着这个机会也加深一下html5中的多线程worker的用法和理解。 Worker简介     JavaScript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。
1336 0