Web Workers
WebWorkers 提供了一种在后台线程中运行脚本的方法,允许 Web 应用程序在不干扰用户界面的情况下执行任务。它们对于执行计算密集型任务或需要大量处理时间的任务特别有用。
通常,与worker一起工作需要大量样板代码、postMessage 调用和事件侦听器。 Cornerstone 提供了一个简单的 API 来创建和使用工作线程,为您隐藏了所有复杂性。
要求
您需要安装 comlink
作为应用程序的依赖项。仅此而已。comlink
是一个库,允许您像使用本地对象一样使用 WebWorkers,而不必担心底层消息传递。虽然它不处理优先级队列、负载平衡或工作线程生命周期,但它提供了一个简单的 API 来与工作线程进行通信,Cornerstone 使用它来创建更强大且用户友好的 API。
使用示例
通过一个例子我们会更容易解释WebWorker API。假设您有一组函数你想在后台运行。您需要编写一个通过 comlink 公开这些函数的对象。
// file/location/my-awesome-worker.js
import { expose } from 'comlink';
const obj = {
counter: 69,
inc() {
obj.counter++;
console.debug('inc', obj.counter);
},
fib({ value }) {
if (value <= 1) {
return 1;
}
return obj.fib({ value: value - 1 }) + obj.fib({ value: value - 2 });
},
};
expose(obj);
:::note 正如您在上面看到的,我们的对象可以包含任意数量的函数并且可以保存本地状态。这些函数的唯一要求是参数应该是可序列化的。这意味着您不能将 DOM 元素、函数或任何其他不可序列化的对象作为参数传递。
我们使用对象作为参数。因此,在上面我们使用fib({value})
而不是fib(value)
(value
只是一个参数名称;您可以为参数使用任何您想要的名称。)
:::
现在关键是要告知Cornerstone这个功能,让它在后台顺利运行。让我们深入了解一下。