📌  相关文章
📜  Web Worker - Javascript (1)

📅  最后修改于: 2023-12-03 15:05:54.921000             🧑  作者: Mango

Web Worker - Javascript

Web Worker 是 JavaScript 的一个特性,能够让 JavaScript 在后台线程中运行,从而避免主线程被阻塞,保证页面的流畅性和反应速度。本文将从以下几个方面介绍 Web Worker 的特点、实现、使用及其注意事项。

特点

Web Worker 有以下特点:

  1. 异步执行,不阻塞主线程
  2. 可以在后台线程中执行复杂计算、耗时操作等
  3. 可以和主线程进行通讯
  4. 不同的 Worker 之间是完全独立的
实现

Web Worker 分为两种: Dedicated Worker 和 Shared Worker。

Dedicated Worker

Dedicated Worker 是 Web Worker 的一种。它只能被创建它的脚本所使用,即只能被一个页面所使用,和其他页面没有联系。创建 Dedicated Worker 的方法很简单:

const worker = new Worker('worker.js');

上述代码创建了一个 worker 对象,该对象会执行 worker.js 文件中的代码,并通过 postMessage 方法向主线程发送数据。

Shared Worker

Shared Worker 是多个页面共用的 Worker,不同的页面可以通过共享一个 Worker,达到通讯、共享资源等目的。Shared Worker 的创建代码如下:

const worker = new SharedWorker('worker.js');
使用

使用 Web Worker 的方法很简单,首先创建一个 Worker 进程,然后在 worker.js 文件中编写需要在后台执行的代码,最后在主线程中通过事件监听来接收来自 Worker 的信息,或者通过 postMessage 方法向 Worker 发送信息。

发送和接收信息

在 Dedicated Worker 中,使用 postMessage 方法向主线程发送信息,主线程需要通过监听 Worker 的 message 事件来接收信息。下面是示例代码:

// 主线程
const worker = new Worker('worker.js');
worker.postMessage('Hello, World!');
worker.onmessage = function (event) {
    console.log(event.data);
};

// worker.js
onmessage = function (event) {
    const message = event.data;
    console.log(message);
    postMessage('Roger that!');
};

在上述示例中,主线程通过 postMessage 方法发送了一条消息到 Worker,Worker 接收到消息后又通过 postMessage 方法向主线程回应了一条消息。

Shared Worker 添加了 ports 属性来支持多个页面连接同一个 Worker:

// 页面一
const worker = new SharedWorker('worker.js');
const port = worker.port;
port.postMessage('Hello, World!');

// worker.js
onconnect = function (event) {
    const port = event.ports[0];
    port.postMessage('Roger that!');
};

// 页面二
const worker = new SharedWorker('worker.js');
const port = worker.port;
port.postMessage('Hello, World!');

在上述示例中,三个页面共享了一个 Worker,页面一和页面二都发送了一条消息到 Worker,Worker 通过 onconnect 事件监听连接请求,在连接被建立成功后,向页面一和页面二发送了一条消息。

注意事项

Web Worker 可以在后台独立运行,它无法访问 DOM、Cookie 等主线程中的对象,也无法在主线程之间传递函数等数据,需要注意以下几个点:

  1. Web Worker 中的全局变量、函数等都只在该线程中有效,无法和主线程中的变量、函数等共享。
  2. Web Worker 可以使用 XMLHttpRequest、WebSocket 等网络请求相关 API。
  3. Web Worker 无法访问 DOM 和 BOM,也无法使用 alert、confirm 等弹出框。
  4. Web Worker 所在的脚本必须和主线程所在的脚本是同源的,否则会报跨域错误。

除此之外,由于同时开启多个 Worker 可能会导致性能问题,因此在使用 Web Worker 时还需要注意一些最佳实践:

  1. 尽量避免在 Worker 中使用全局变量,以免浪费内存。
  2. 合理控制 Worker 的数量,不超过机器能够承受的数量即可。
  3. 考虑使用 Transferable Objects 来优化传递二进制数据的性能。
总结

Web Worker 是 JavaScript 的一项非常有用的特性,能够让 JavaScript 在后台线程中执行,从而避免主线程被阻塞,提升页面的反应速度和流畅性。开发者在使用 Web Worker 时,需要注意上述的注意事项和最佳实践,从而保证代码的可维护性和高性能。