在Umi (UmiJS) 脚手架中使用 Webworker TypeScript

本文讲述了在umi4更新后,如何在无需worker-loader的情况下利用webpack5内置的WebWorkers进行编程,包括worker的编写、前端调用、重型数据传递以及处理第三方库的兼容性问题,如MFSU配置。
摘要由CSDN通过智能技术生成

umi4之前需要配置worker-loader,被网上各种帖子坑了一天,各种配置都试了,走不通

umi4之后,自带webpack5,什么配置都不需要,直接上代码

以下代码其他脚手架,带webpack5的话应该都适用

1.worker 代码

// src/workers/testworker.ts

function add(num0:number,num1:number){
    let sum = num0+num1;
    self.postMessage(sum);
}

self.addEventListener('message',event=>{
    const {num0,num1} = event.data;
    console.log(event);
    add(num0,num1);
})

2.前端调用worker

const testWkr = new Worker(new URL('@/workers/testworker.ts', import.meta.url));;
testWkr.postMessage({num0:5,num1:6});
testWkr.addEventListener('message',event=>{
    console.log(event.data);
    testWkr.terminate();
 });

或者封装一下,当成普通的函数执行。一般发现前台卡顿后才去考虑worker,这样worker 简单调用之前的处理代码,然后把调用worker过程新文件封装成之前的函数,就基本不用大动代码。

//封装成异步函数/promise
export function add_async_worker(num0: number, num1: number) {
    return new Promise((resolve: (value: number) => void, reject: (error: ErrorEvent) => void) => {
        const testWkr = new Worker(new URL('@/workers/testworker.ts', import.meta.url));
        //也可以使用
        //testWkr.addEventListener("message", (event) => {resolve(event.data as number);});
        testWkr.addEventListener('message', event => {
            resolve(event.data as number);
            testWkr.terminate();
        });
        //也可以使用
        //testWkr.onerror = (event) => {reject(event);};
        testWkr.addEventListener("error", (event) => {
            reject(event);
            testWkr.terminate();
        });
        testWkr.postMessage({ num0: num0, num1: num1 });
    });
}

//正常的异步函数调用
async function name() {
    let sum = await add_async_worker(5, 6).catch(error=>{
        console.log(error);
        return NaN;
    });
    console.log(sum);
}

3.重型数据传递

如果要传向worker传递文件/bolb等数据,普通消息传递会影响效率,可以传递​​​​​​​transfer

//前台
let image:File= ... ;
image.arrayBuffer().then(arrbuf=>{
    const testWkr = new Worker(new URL('@/workers/testworker.ts', import.meta.url));
    //传递,传递之后就不能再访问arrbuf了,因为这个对象内存已经交给worker线程了
    testWkr.postMessage({ sth: "sth",data:arrbuf,type:image.type,filename:image.name},[arrbuf] );
})

//worker
self.addEventListener('message',event=>{
    //接收主线程的transfer数据并封装还原File
    let image=new File([event.data.data as ArrayBuffer],event.data.filename,
{type:event.data.type});
    //处理之后可以像前台一样postMessage,把数据内存交给前台
    //注意transfer数据交给前台之后,worker线程也是不能访问这个数据了
})

4.使用三方库

在Umi框架中,如果worker要使用三方库的话,需要配置mfsu,排除三方库,不然会报错.

需要注意的是,不是所有函数和构造函数 (或者说…类) 都可以在 Worker 中使用。具体参考页面 Worker 所支持的函数和类

也就是说如果三方库用到了worker不支持的函数和类,就不能在worker中运行,比如我踩过的图片压缩库 compressorjs ,就使用了HTMLCanvasElement: toBlob(),前台运行尚可,worker直接报错。

// .umirc.ts
// 这里排除了两个前端加密库
export default defineConfig({
  ...
  mfsu:{
    exclude:['crypto-js','jsrsasign']
  },
  ...
});

参考:

1. webpack 5 Web Workers

里面写了一句话:

As of webpack 5, you can use Web Workers without worker-loader.

2. umi MFSU worker 兼容问题 

3. umi MFSU 配置

4. ​​​​​​​Web Workers API

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值