用于通过 RPC(远程过程调用)进行类型安全的 Web Worker 通信的工具。

该包提供了一种简单高效的方式,用于主线程与 Web Worker 之间的通信,并自动处理:

  • 基于 Promise 的异步方法调用
  • 自动可转移对象检测(ArrayBuffer 等)
  • 具备完整 TypeScript 支持的类型安全 API
  • 从 worker 到主线程的错误传播

安装

安装模块:

npm install @wordpress/worker-threads

用法

Worker 线程

创建一个 worker 文件,将方法暴露给主线程:

// worker.ts
import { expose } from '@wordpress/worker-threads/worker';

const api = {
    async processImage( buffer: ArrayBuffer, quality: number ): Promise<ArrayBuffer> {
        // ... 图像处理逻辑
        return resultBuffer;
    },

    async calculateSum( a: number, b: number ): Promise<number> {
        return a + b;
    },
};

expose( api );

// 导出类型,以便在主线程中使用 wrap()
export type WorkerAPI = typeof api;

主线程

包装 worker 以获取类型安全的代理:

// main.ts
import { wrap, terminate } from '@wordpress/worker-threads';
import type { WorkerAPI } from './worker';

// 创建 worker
const worker = new Worker( new URL( './worker.js', import.meta.url ), {
    type: 'module',
} );

// 包装它以获取 RPC 代理
const api = wrap<WorkerAPI>( worker );

// 以异步函数方式调用方法
const result = await api.processImage( imageBuffer, 0.82 );
const sum = await api.calculateSum( 1, 2 );

// 完成后清理
terminate( api );

API 参考

主线程 API

wrap<T>( worker: Worker ): Remote<T>

包装 Worker 以提供类型安全的 RPC 接口。返回的代理对象允许像调用本地异步函数一样调用 worker 中的方法。

terminate( remote: Remote<unknown> ): void

终止已包装的 worker 并清理资源。所有待处理的调用都会被拒绝。

Worker 线程 API

expose<T>( target: T ): void

暴露对象的方法,以便从主线程调用。应在 worker 脚本中调用一次。

类型

Remote<T>

一种类型,将 T 的所有方法转换为其异步版本。每个方法都返回 Promise<Awaited<ReturnType>>。

功能

自动可转移对象检测

该包会自动检测并转移 ArrayBuffer 和其他可转移对象,为大数据提供零复制性能:

// ArrayBuffer 会自动转移,而不是复制
const result = await api.processImage( largeImageBuffer );

错误处理

在 worker 中抛出的错误会被正确传播到主线程:

try {
    await api.riskyOperation();
} catch ( error ) {
    console.error( 'Worker error:', error.message );
}

TypeScript 支持

对方法签名提供完整类型推断:

// TypeScript 知道返回类型和参数类型
const result: ArrayBuffer = await api.processImage( buffer, 0.82 );

为这个包做贡献

这是一个独立包,属于 Gutenberg 项目。该项目以 monorepo 形式组织。它由多个自包含的软件包组成,每个包都有特定用途。此 monorepo 中的包发布到 npm,并被 WordPress 以及其他软件项目使用。

如需了解更多关于为这个包或整个 Gutenberg 项目做贡献的信息,请阅读项目的主要 贡献者指南。