Web Worker 学习笔记
JavaScript (JS) 是单线程的,但是单线程对于多核的 CPU 来说,比较浪费资源。使用 Web Worker 可以在主线程外,生成其他 Worker 线程,处理主线程之外的任务。主线程与 Worker 线程同时运行,互不打扰。Worker 线程处理完后,再将处理结果发送给主线程。Web Worker 的主要目的是为了在浏览器中进行后台处理,避免长时间运行的复杂操作阻塞 UI 线程,从而影响用户体验。通过将这些操作放在 Web Worker 中,主线程(UI 线程)可以专注于处理用户交互和渲染,而不会被阻塞。
在使用 Web Worker 时,需要注意的是:
- 同源策略:
Worker线程的脚本文件必须与主线程的脚本文件同源。 - DOM 限制:
Worker线程的全局对象和主线程的全局对象不一致,在Worker线程内部不能使用document、window等对象,但是可以使用navigator和location对象。 - 通信限制:
Worker线程和主线程之间的通信是通过消息进行的,Worker线程通过postMessage()方法向主线程发送消息,主线程通过onmessage事件监听Worker线程发送的消息。 - 脚本限制:
Worker线程不能执行alert()方法和confirm()方法,但可以使用XMLHttpRequest对象发出 AJAX 请求。 - 文件限制:
Worker线程无法访问本地文件,即不能打开本地文件,也无法读取本地文件。 - 作用域限制:
Worker线程无法访问主线程的作用域,即无法访问主线程中定义的变量和函数,但是主线程可以向Worker线程传递数据。
浏览器原生提供了 Worker() 构造函数:
// jsUrl 是脚本网址,需要遵守同源策略
// options 参数可选,可以指定 Worker 名称,用以区分多个 Worker 线程
const work = new Worker(jsUrl, options);