携手创作,共同成长!这是我参与「掘金日新计划 · 8月更文挑战」的第8天,点击查看活动详情
什么是Web Workers
web worker是运行在后台的JavaScript,不会影响页面的性能。当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。
Web Workers的使用
1-创建Worker实例
const worker = new Worker('https://xxx.xxx.js');
参数是一个url,规定必须与主线程的脚本文件同源,并且所加载的脚本必须是网络资源文件。
2-线程之间通过postMessage/onMessage通信
(相互之间的通信可以传递对象或者数组)
//主线程与 Worker 线程通信
worker.postMessage({
xxxx
});
//主线程监听接收 Worker 线程返回的信息
worker.onmessage = function (event) {
console.log(event);
}
// 主线程关闭 Worker 线程
worker.terminate();
// 监听错误信息
worker.onerror = (err) => {
};
3-self 代表worker进程自身
//监听
self.onmessage =(event) => {
console.log(event.data);
};
// 发送
self.postMessage({
});
// 关闭
self.close()
4-worker线程加载脚本 使用importScripts()来引入脚本,能够动态导入js脚本文件,脚本的下载顺序不固定,但执行时会按照调用顺序进行。
importScripts('http1.js','http2.js');
Worker线程限制
无法使用window对象,document对象, DOM对象,parent对象。
可以使用navigator对象,只读location,XMLHttpRequest对象,setTimeout/setInterval,Application Cache应用缓存。
使用Web Workers的优化
主线程与 worker 线程之间的通信是拷贝关系,所以数据量很大时,会造成性能问题。Web Worker允许主线程把二进制数据直接转移给子线程,而且转移后原先的进程就无法再使用这些二进制数据了。提升了性能,也避免出现多个线程同时处理数据的问题。