Skip to content

useWorker

TypeScriptReact

useWorker 封装了 Web Worker 的创建、消息发送、消息监听和错误处理,让你更方便地在 React 组件中使用 Web Worker。

交互演示

接口

参数

ts
useWorker<D extends any>(url: string): WorkerResult<D>
参数类型说明
urlstringWorker 脚本文件路径

返回值

ts
interface WorkerResult<D> {
  postMessage: (data: D, transfer?: Transferable[]) => void;
  onMessage: (cb: (data: D, e: MessageEvent<D>) => void) => void;
  onErrMsg: (cb: (e: ErrorEvent) => void) => void;
}
方法说明
postMessage向 Worker 发送消息,支持 Transferable 对象传递
onMessage注册消息回调,接收 Worker 发送的数据
onErrMsg注册错误回调,处理 Worker 中的错误

使用示例

基础用法

tsx
import { useWorker } from 'howie-daily-helpers-react-hooks';

function App() {
  const { postMessage, onMessage, onErrMsg } = useWorker<number>('/worker.js');

  useEffect(() => {
    onMessage((data, e) => {
      console.log('收到消息:', data);
    });

    onErrMsg((e) => {
      console.error('Worker 错误:', e);
    });
  }, [onMessage, onErrMsg]);

  const handleClick = () => {
    postMessage(42);
  };

  return (
    <button onClick={handleClick}>发送消息到 Worker</button>
  );
}

Worker 脚本示例

js
// worker.js
self.addEventListener('message', (e) => {
  const result = e.data * 2;
  self.postMessage(result);
});

传递 Transferable 对象

tsx
const handleTransfer = () => {
  const buffer = new ArrayBuffer(1024);
  postMessage(buffer, [buffer]);
};

注意事项

  • URL 改变时会自动创建新的 Worker 并终止旧的
  • 组件卸载时会自动终止 Worker 并移除事件监听
  • 当前版本仅支持事件回调风格,后续会扩展 Promise 风格支持