Umi.js 项目中使用 Web Worker

1.配置 Umi.js

在 Umi.js 中,需要通过配置来扩展 Webpack 的功能。在项目根目录下修改 config/config.ts 文件:

export default defineConfig({
	chainWebpack(config) {
    config.module
      .rule('worker')
      .test(/\.worker\.ts$/)
      .use('worker-loader')
      .loader('worker-loader')
      .end();
  }
});

配置之后 worker.ts 文件将被 worker-loader 加载。
将 Worker 需要的依赖添加到 MFSU 的 exclude 配置中是因为 Module Federation 是通过 window 对象来共享模块的,所以在 worker 中不能使用 Module Federation 中的模块。

2.创建一个 Web Worker 文件

创建worker.ts 文件,编写 Web Worker 逻辑:

// src/utils/worker.ts
self.onmessage = function(e: MessageEvent) {
  console.log('Worker: Message received from main script');
  const result: number = e.data[0] * e.data[1];
  if (isNaN(result)) {
    self.postMessage('Please write two numbers');
  } else {
    console.log('Worker: Posting message back to main script');
    self.postMessage(result);
  }
};

3.在 React 组件中使用 Web Worker

在 React 组件中引入并使用 Web Worker:

import React, { useEffect, useState } from 'react';

const WorkerDemo: React.FC = () => {
  const [workerResult, setWorkerResult] = useState(0);

  useEffect(() => {
    const worker = new Worker(new URL('@/utils/worker.ts', import.meta.url));

    // Message posted to worker
    worker.postMessage([2, 3]);

    // Message received from worker
    worker.onmessage = function (e: MessageEvent) {
        setWorkerResult(e.data);
    }

    return () => {
      worker.terminate(); // 组件卸载时终止 Web Worker
    }
  }, []);
  
  return (
    <div>
      <h1>Web Worker Example</h1>
      <p>Result from Worker: {workerResult}</p>
    </div>
  )
};

export default WorkerDemo;

import.meta 是一个内置在 ES 模块内部的对象,import.meta.url 表示一个模块在浏览器和 Node.js 的绝对路径。
new URL传入 path & base 写入内存。

使用 Web Worker,可以在后台线程中执行耗时的操作,而不会阻塞主线程,从而提升应用的响应速度。
在这里插入图片描述

相关推荐

  1. vite vue3使用 webworker

    2024-07-16 20:50:01       40 阅读
  2. 详解 WebWorker 的概念、使用场景、示例

    2024-07-16 20:50:01       40 阅读
  3. react+umi+antd项目搭建配置

    2024-07-16 20:50:01       58 阅读
  4. 项目使用AI功能

    2024-07-16 20:50:01       57 阅读
  5. 项目cesium使用方法

    2024-07-16 20:50:01       46 阅读
  6. vite: 项目使用Sass

    2024-07-16 20:50:01       26 阅读
  7. react 项目使用 iconfont

    2024-07-16 20:50:01       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 20:50:01       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 20:50:01       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 20:50:01       62 阅读
  4. Python语言-面向对象

    2024-07-16 20:50:01       72 阅读

热门阅读

  1. linux - shell - 单引号与双引号

    2024-07-16 20:50:01       17 阅读
  2. vue3+vite+ts+pinia+router4后台管理-动态路由生成

    2024-07-16 20:50:01       18 阅读
  3. 【数值计算】学习笔记

    2024-07-16 20:50:01       19 阅读
  4. Docker入门:从安装到实际应用

    2024-07-16 20:50:01       21 阅读
  5. MetaGPT和LangGraph对比

    2024-07-16 20:50:01       20 阅读
  6. Linux基础命令

    2024-07-16 20:50:01       22 阅读
  7. JUC-并发的概念

    2024-07-16 20:50:01       19 阅读
  8. 第五章 初识Sping框架(2023版本IDEA)

    2024-07-16 20:50:01       18 阅读