1、介绍

Web Worker,运行在后台的javascript,不占浏览器自身的线程,独立于其他脚本。
通常来讲javascript是单线程的,js处理逻辑与页面渲染走线程,代码会自上而下执行,可以理解为同步。在html中执行js脚本时,在js脚本加载完成之前,页面的状态是不响应的。我们可以将一些复杂逻辑交给web worker在后台执行,相当于是将部分逻辑异步处理,在这段逻辑处理之间页面依然可以响应用户的操作。
web worker有两种类型,一种是专用线程 dedicated web worker,一种是共享线程 shared web worker;专用线程会随着页面的关闭而关闭,只能在创建它的页面访问。而共享线程可以被多个页面访问,一般用于同浏览器下多页面的通信(必须保证同源策略)

2、专用线程在vue的使用

每一个worker对象都是使用构造函数创建的对象。主程序通过worker对象的postMessage(obj)发送数据,可以发送对象;通过worker对象的onmessage(data)接收数据;而子线程worker.js需要设置onmessage(obj) 来接收主程序发送的数据,处理完成之后使用postMessage(data)将处理好的数据发送给主程序。子线程中也有错误信息的监听方法onerror()
以vue-cli 3.x为例子
(1) 需要下载worker-loader,并且在vue.config.js中配置worker.js文件能被读取

chainWebpack(config) {
      // set worker
      config.module
      .rule("worker.js")    // 读取worker.js结尾的js
      .test(/\.worker\.js$/)  // 正则匹配
      .use('worker-loader')  // 使用worker-loader
      .loader('worker-loader')
      .options({
        inline: true,
        name: 'workerName.[hash].js'
      })
}

(2) 创建子线程 webworker.worker.js,设置onmessage、onerror方法

onmessage = function(evt){
  //工作线程接收到主线程的消息,处理逻辑
 let arr = evt.data
 let name = '';
 arr.forEach(element => {
   name = element.name
 });
 
 //向主线程发送消息
 postMessage(name);
};

//错误信息
onerror = function (event) {
 console.log(event.message);
}

(3) 在主程序中引入子线程,并且创建实例,使用worker对象发送与接收数据

import WorkerSetss from '@/static/webworker.worker.js'
     this.worker = new WorkerSetss();
     //向工作线程发送消息
     let arr = [];
     let obj = {};
     obj.name = "小明"
     obj.id = "1"
     arr.push(obj)
     this.worker.postMessage(arr);
     this.worker.onmessage = function(event) {
        console.log(event)
      }

备注:
(1) 只能用于单个页面,不能出现跨页面的情况。
(2) 有浏览器的兼容问题。