总所周知,前端javascript是单线程工作的(),那如果有计算密集性、高延时的任务,前端通常会特定的调度机制通过settimeout、promise等实现,但是本质上,无论怎么样,还是在一个线程中进行工作,仍然会阻塞主Javascript线程,为了能够更好的执行,前端实现了一个web api接口—web worker。
既然是跑在浏览器中的JavaScript代码,那么他和浏览器中的主JavaScript线程有哪些不一样呢?
web worker操作限制:
web worker分类两类:
主线程:
let s = new Worker('worker.js');
s.postMessage({
data: 'dedicated worker'
});
//监听消息
s.onmessage = function (event) {
console.log(2, event.data);
// 记得关闭哦,不然会消耗资源
s.terminate();
}
// 监听错误事件
s.onerror = function (event) {
console.log('error', event);
}
worker线程
onmessage = function(e) {
console.log('e',e)
postMessage('workerResult');
// 记得关闭
self.close();
}
还有另一种方式:
// worker中self和this都指向DedicatedWorkerGlobalScope
this.addEventListener('message', (e) => {
console.log(e.data);
},false);
共享worker需要借助port来启动
主线程
let share = new SharedWorker('worker.js');
share.port.start();
share.port.postMessage({
data: '123'
});
share.port.onmessage = function (event) {
console.log(1, event.data);
}
worker线程
onconnect = function(e) {
var port = e.ports[0];
port.onmessage = function(e) {
port.postMessage('workerResult');
}
}
详情请看MDN文档
// 有点麻烦,反正就是各个接口之间耦合,从不同的接口中继承了不同的方法,自己也实现了不同的方法
DedicatedWorkerGlobalScope --->
SharedWorkerGlobalScope ---> WorkerGlobalScope --> EventTarget
ServiceWorkerGlobalScope --->
{
// 匹配 *.worker.js
test: /\.worker\.js$/,
use: [{
loader: 'worker-loader',
options: {
name: '[name].js',
inline: true,
fallback: false
// publicPath: '/scripts/workers/'
}
},'babel-loader']
}
因篇幅问题不能全部显示,请点此查看更多更全内容