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,可以在后台线程中执行耗时的操作,而不会阻塞主线程,从而提升应用的响应速度。
在这里插入图片描述

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值