如何在React中使用WebWork

在单页应用中使用WebWork


JS为了避免DOM渲染冲突,使用单线程运行代码。虽然浏览器通过事件循环队列延后处理耗时任务,但是在执行大量复杂运算时依然会使主线程卡顿,HTML5提出了WebWork允许用户另开线程来进行复杂的逻辑计算处理。

WebWork在html中使用方法:
1. 在index.Html中新建worker对象,并发送及监听消息
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>WebWork</title>
    </head>
    <body> </body>
    <script>
        var work = new Worker('./work.js')
        work.postMessage(1000000000)
        work.onmessage = function(res){
            console.log("累加结果 : ",res.data)
        }
    </script>
    </html>

2. 新建work.js处理复杂逻辑
    onmessage = function(e){

        let sum = 0,num = e.data;
        for(var i=1;i<=num;i++){
            sum += i
        }
        postMessage(sum);
    }

如果通过浏览器直接打开本地index.html会报错:Failed to construct 'Worker': Script at 'XXXX' cannot be accessed from origin 'null'. 可以通过http-server 搭建http服务后正常运行

React等单页应用中的使用方法:

在React,Vue等单页应用中Webpack将js代码都打包成一个js文件,故以上通过new Worker('./work.js')方式新建worker将会报访问不到worker.js的错误。

*方案 1. 将worker.js放入public等可以直接http访问的静态资源文件夹下面,注意是不支持跨域访问的。

*方案 2. 使用第三方插件例如react-webworker,npm地址:点击这里

*方案 3 (推荐). 利用Blob新建本地临时文件,通过URL.createObjectURL()创建对blob对象的URL引用,这些URL只能在浏览器的单个实例中和同一个会话中使用。

1. 封装worker.js
export default class WebWorker {
  constructor(worker) {
    const code = worker.toString();
    const blob = new Blob(["(" + code + ")()"]);
    return new Worker(URL.createObjectURL(blob));
  }
}
2. 在React中和Vue中使用相似,以react为例:
    import WebWorker from './worker.js'
    ...

    componentDidMount(){
        let work = function(){
            self.onmessage = function(e){
                let sum = 0,num = e.data;
                for(var i=1;i<=num;i++){
                    sum += i
                }
                postMessage(sum);
            }
        }
        this.worker = new WebWorker(work)
        this.worker.onmessage = function(res){
            console.log("累加结果 : ",res.data)
        }
    }
    someEvent(){
        this.worker.postMessage(1000000000)
    }

WebWork新开线程存在以下问题:1. work中不能访问及操作dom, 2. 新开WebWork线程会有一定的系统开销

有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

转载于:https://my.oschina.net/u/1583290/blog/3021534

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值