vue中使用webworker

webworker是运行在浏览器后台的一个单独的线程,因此可以执行一些耗时的操作而不阻塞主线程,比如大量复杂的数据计算。
双进程可实时进行通信,主要使用onmessage和postmessage两个方法。

示例worker中的方法在计算中非常耗时,我们在worker里做测试。

// worker.js
onmessage = function (e) {
  // onmessage获取传入的值
  let res = e.data || 0;

  for (let i = 0; i < 50000; i++) {
    for (let i = 0; i < 100000; i++) {
      res += i;
    }
  }

  // 将计算的结果传递出去
  postMessage(res);
};

vue2

vue2使用时需要安装worker-loader,npm i worker-loader,修改配置vue.config.js

chainWebpack: config => {
    // set worker-loader
    config.module
      .rule('worker')
      .test(/.worker.js$/)
      .use('worker-loader')
      .loader('worker-loader')
      .end();
  },

vue文件引用worker

// index.vue
import Worker from '@/workers/worker.js';

mounted() {
      this.workerRef = new Worker();
      const start = performance.now();
      this.workerRef.postMessage(0);

      this.workerRef.onmessage = e => {
        console.log('计算结果:', e.data);

        const end = performance.now();
        console.log('计算耗时:', end - start);
      };
}

注意: 如果没有vue.config.js的项目,引入worker文件时,直接把路径加在worker-loader后,import Worker from 'worker-loader!../../workers/worker.js';

看一下结果


image.png

vue3+vite

vite编译时直接支持worker,因此只需要编译时保证正常编译即可

/// vite.config.js
worker: {
    rollupOptions: {
    output: {
        assetFileNames: 'assets/[name].[ext]'
        }
    }
},

vue文件引用时直接引用即可,其他与v2无异

// index.vue

onMounted(()=>{
  workerRef.value = new Worker(new URL('@/workers/worker.js', import.meta.url));
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容