airi 项目中的 VueUse useWebWorker 实战指南:Web Worker 注册、通信与前端 AI 推理卸载
人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载导读useWebWorker是 VueUse 提供的 Web Worker 注册与通信组合式函数它把new Worker()、postMessage消息监听、terminate生命周期管理等样板代码封装成简洁的响应式 API。本文以 airi 开源仓库中的官方参考文档useWebWorker.md为主体结合仓库内真实的 Whisper 语音识别、Kokoro TTS、背景移除、VAD 语音活动检测等 Worker 使用场景讲解该函数的全部返回值、类型声明与底层原理并给出可直接落地的 Worker 集成方案。useWebWorker 是什么根据参考文档的定义useWebWorker是 Web Workers 的简单注册与通信封装Simple Web Workers registration and communication核心能力包括传入 worker 脚本地址或现成的Worker实例 / 创建函数自动完成注册提供响应式的data引用实时反映 worker 发回的最新消息提供post方法向 worker 线程发送数据提供terminate方法停止并销毁 worker。该函数在 SKILL.md 中归类于 Browser浏览器类别调用规则为AUTO——即只要在 Vue 3 / Nuxt 3 项目中遇到需要 Web Worker 承载重任务、避免阻塞 UI 线程的需求就应优先考虑使用它。它常与useWebWorkerFn参考文档见 useWebWorkerFn.md配合使用前者面向注册 手动收发消息的低层控制后者面向把任意函数丢进 worker 执行并返回 Promise的高层封装。基本用法与返回值参考文档给出的最小用法如下import { useWebWorker } from vueuse/core const { data, post, terminate, worker } useWebWorker(/path/to/worker.js)调用后返回四个成员其中两个是响应式状态、两个是方法State类型说明dataRefany最近一次从 worker 收到的数据的引用可以watch它来响应 worker 发来的消息workerShallowRefWorker \| undefinedWeb Worker 实例的引用方法签名说明post(message: any, transfer: Transferable[]): void(message: any, options?: StructuredSerializeOptions \| undefined): void向 worker 线程发送数据支持可转移对象Transferable与结构化克隆选项terminate() void停止并终止 worker值得注意的细节data是Ref类型意味着你可以用watch(data, ...)或模板中的data直接驱动 UI 更新——这正是 VueUse 把原生事件回调转换成响应式状态的核心价值worker是ShallowRefWorker | undefined浅层引用不会深响应 Worker 实例内部的属性变化适合持有这种引用型对象post的类型直接取自Worker.prototype[postMessage]见下方PostMessage类型因此它与原生worker.postMessage的调用约定完全一致包括两种重载签名带Transferable[]转移列表或带StructuredSerializeOptions选项对象。类型声明解析参考文档给出了完整的 TypeScript 声明可以据此理解其内部设计type PostMessage (typeof Worker.prototype)[postMessage] export interface UseWebWorkerReturnData any { data: ShallowRefData post: PostMessage terminate: () void worker: ShallowRefWorker | undefined } type WorkerFn (...args: unknown[]) Worker export declare function useWebWorkerT any( url: string, workerOptions?: WorkerOptions, options?: ConfigurableWindow, ): UseWebWorkerReturnT export declare function useWebWorkerT any( worker: Worker | WorkerFn, ): UseWebWorkerReturnT从中可以提炼出三层关键信息两个重载第一种传入url: string可选附带WorkerOptions如{ type: module }与ConfigurableWindow用于 SSR 场景下安全获取window第二种直接传入一个Worker实例或一个返回Worker的工厂函数WorkerFn适合需要延迟创建 / 按需重建 worker 的场景。泛型 DatauseWebWorkerT让data携带业务数据类型例如可以把data声明为ShallowRefInferenceResult在编译期获得类型提示。ShallowRef的选择worker 实例与消息载荷通常是大对象或二进制数据浅层引用避免了对其实施深层响应式代理带来的性能与语义开销。与 useWebWorkerFn 的分工参考文档的 frontmatter 中标明了related: useWebWorkerFn两者属于同一主题的两个层次useWebWorker手动注册 worker 手动收发消息适合需要精细控制协议如 requestId 匹配、取消消息、进度事件的场景useWebWorkerFn把普通函数翻译进 worker 执行返回 Promise适合一次性跑重函数的场景。它支持三个配置项useWebWorkerFn.md配置项类型默认值说明timeoutnumberundefined超时毫秒数超时后杀死 workerdependenciesstring[]—worker 需要的外部依赖CDN 脚本 URLlocalDependenciesFunction[]—worker 需要的本地函数会被序列化进 worker 作用域const { workerFn, workerStatus, workerTerminate } useWebWorkerFn( dates dates.sort(dateFns.compareAsc), { timeout: 50000, dependencies: [ https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.js, ], }, )workerStatus是ShallowRefWebWorkerStatus取值依次为PENDING | SUCCESS | RUNNING | ERROR | TIMEOUT_EXPIRED可直接驱动 UI 展示。仓库实战airi 如何用 Web Worker 承载前端 AI 推理airi 是一个在浏览器 / Electron 端实时运行语音、图像推理的 AI 伴侣项目这些任务ASR 语音识别、TTS 合成、背景移除、VAD 检测全部依赖 Web Worker 卸载到后台线程避免阻塞主线程的渲染与交互。虽然仓库中的推理适配器大多直接使用原生WorkerAPI 而非useWebWorker包装但它们的模式恰好完整验证了参考文档描述的那套注册 → post → 监听 → terminate生命周期可作为该组合式函数底层原理的绝佳注脚。1. Worker 注册URL 形式与 module 模式参考文档的第二个重载支持传入Worker | WorkerFn。仓库中 kokoro.ts 的初始化方式与之对应——使用new URL(..., import.meta.url)构造 worker 脚本地址并以{ type: module }模式创建 ES Module workerworker new Worker( new URL(../../../workers/kokoro/worker.ts, import.meta.url), { type: module }, )whisper.ts 则将 worker 地址作为工厂函数参数注入由调用方见 composables/whisper.ts决定具体路径function ensureWorker(): Worker { if (!worker) { worker new Worker(workerUrl, { type: module }) ... } return worker }这两处实践对应了useWebWorker的两种重载形态要么传 URL 字符串要么传 worker 工厂函数后者的价值在于懒创建 断线重建仓库里destroyWorker()后由scheduleRestart()再次调用ensureWorker()重建正是 WorkerFn 的典型应用。2. 消息通信协议化 postMessage参考文档强调data可以watch并响应 worker 消息。仓库中的适配器将这一思想升级为统一的推理协议worker 与主线程通过带requestId与type的结构化消息通信主线程侧用waitForMessage等待特定类型消息whisper.tsfunction waitForMessageT any( w: Worker, requestId: string, targetType: string, timeout: number, onOther?: (data: any) void, signal?: AbortSignal, ): PromiseT它的行为等价于对data做一次带过滤的 watch主线程postMessage({ type: load-model, requestId, ... })发出请求随后await对应的model-ready/inference-result消息中间穿插的progress消息通过onOther回调实时转发驱动下载进度条。这可以看作useWebWorker中watch(data)响应消息这一心智模型的工程化放大——当消息需要按请求配对时单靠一个dataref 是不够的必须引入 requestId 匹配但两者的底层都是worker.addEventListener(message, ...)。3. 生命周期与资源回收terminate 的正确姿势参考文档的terminate对应原生worker.terminate()。仓库在 whisper.ts 中给出了更完整的清理顺序function destroyWorker(): void { if (worker) { if (messageListener) worker.removeEventListener(message, messageListener) if (errorListener) worker.removeEventListener(error, errorListener) messageListener null errorListener null worker.terminate() worker null } }要点先移除事件监听器再 terminate最后置空引用。如果只调用terminate()而残留监听器会造成内存泄漏与悬挂回调配合operationMutex.cancel()whisper.ts还能让所有等待中的 Promise 立即以InferenceAbortError拒绝实现一键取消全部在途请求。4. VAD 语音活动检测worker 内的完整 AI 管线stage-web/src/workers/vad 与 stage-pocket/src/workers/vad 展示了 worker 脚本的组织方式index.ts只做 re-export真正逻辑在 vad.ts 中。该类在 worker 内部完成 Silero VAD 模型的加载与推理AutoModel.from_pretrained(onnx-community/silero-vad, ...)并暴露on/off事件 API——worker 内部的事件模型与主线程useWebWorker的data监听形成呼应主线程无需感知 worker 内部如何组织事件只需订阅最终消息。5. 构建配置Worker 打包使用useWebWorker传入 URL 字符串时需确保构建工具正确处理 worker 资源。仓库的 Vite 配置给出了现成方案apps/stage-web/vite.config.tsworker: { format: es, rollupOptions: { output: { inlineDynamicImports: false, }, }, },apps/stage-tamagotchi/electron.vite.config.ts 中的 renderer 侧配置与之相同。format: es让 worker 以 ES Module 打包与{ type: module }的创建方式匹配inlineDynamicImports: false则保证 worker 内部的动态导入如按需加载的 WASM / 模型分片被拆成独立 chunk避免全部内联导致加载体积膨胀。6. 实战佐证Worker 冒烟测试plugin-chess-worker-smoke.ts 是仓库中一个完整的 Worker 冒烟测试场景它在 Electron 应用中加载国际象棋插件定位 Stockfish 引擎的stockfish-18-lite-single-*.js/.wasm资源然后new Worker(workerUrl)启动、以uci命令轮询、等待uciok就绪信号最后worker.terminate()清理。其中还包含一个通用 worker 探针——用URL.createObjectURL(new Blob([onmessage()postMessage(pong)]))创建内联 worker 验证环境是否支持 Worker。这套创建 → 发消息 → 等待就绪 → 终止的验证序列与useWebWorker的post/data/terminate使用路径完全同构可作为用该组合式函数编写单元测试时的参考模板。从原生 Worker 到 useWebWorker落地改造建议综合参考文档与仓库实践如果要在 airi 这类项目中把某段原生 Worker 代码改写成useWebWorker可按以下步骤注册useWebWorker(new URL(.../worker.ts, import.meta.url), { type: module })把 worker 引用保存到workerref发送用post({ type, requestId, payload })替代worker.postMessage接收watch(data, handleIncoming)替代裸addEventListener(message, ...)并在组件卸载时由组合式函数自动完成清理VueUse 内部通过tryOnScopeDispose释放事件监听销毁退出页面或模型切换时调用terminate()必要时配合worker.value undefined强制下次重建。需要注意的是参考文档的data是最近一次消息的简单 ref不保证按 requestId 配对若业务需要并发请求 / 取消 / 进度流如仓库中 Whisper 适配器那样应在useWebWorker之上自建一层 requestId 路由或直接采用仓库现有的waitForMessage模式。总结useWebWorker用约 20 行封装换掉了 Web Worker 的注册、监听、销毁全套样板代码是 Vue 应用中引入多线程能力的最短路径。通过 airi 仓库中的 AI 推理适配器可以清楚看到它背后那套模块化 worker 创建 → 协议化消息收发 → 安全 terminate → Vite worker 打包的完整工程链路。对于需要同时卸载复杂函数执行的场景useWebWorkeruseWebWorkerFn两者结合即可覆盖从低层通信到高层函数调用的全部需求。参考文件索引useWebWorker 参考文档useWebWorkerFn 参考文档VueUse 技能决策指南SKILL.mdWhisper ASR 适配器实现Kokoro TTS 适配器实现背景移除适配器实现VAD 语音活动检测 workerstage-web Vite 配置worker 打包stage-tamagotchi Electron 配置worker 打包Worker 冒烟测试场景赞分享人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载相关推荐Airi 项目实战VueUse useWebWorker 实现 Web Worker 注册与消息通信的完整指南Airi 项目实战VueUse useWebWorker 实现 Web Worker 注册与消息通信的完整指南 Web Worker 是浏览器将耗时任务移出主人工智能AI 应用大模型AI Agent交互助手语音数字人后端前端桌面应用移动开发GUI 自动化MCP 服务VueUse useWebWorker 详解在 Vue 3 中注册 Web Worker 并与其通信VueUse useWebWorker 详解在 Vue 3 中注册 Web Worker 并与其通信 useWebWorker 是 VueUse packa前端airi 项目中的 VueUse tryOnBeforeUnmount安全卸载生命周期钩子的原理与实战airi 项目中的 VueUse tryOnBeforeUnmount安全卸载生命周期钩子的原理与实战 本篇技术指南以 VueUse 官方技能库中的 tryO人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手后端上一篇【亲测免费】 OpenProject - 开源的项目管理软件下一篇TinyXML-2 完全指南轻量级 C XML 解析器的 DOM 解析、空白模式与打印实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

WinPython Zero 发行版 3.7.4.1(32bit)变更日志解读:从 History 文件看 Python 包的升级脉络

WinPython Zero 发行版 3.7.4.1(32bit)变更日志解读:从 History 文件看 Python 包的升级脉络

开发工具构建工具CLI包管理器 【免费下载链接】winpython A free Python-distribution for Windows platform, including prebuilt packages for Scientific Python. 项目地址: https://gitcode.com/gh_mirrors/wi/winpython 点击查看 免费下载 本文以 WinPython 仓…

2026/10/16 5:33:37 阅读更多 →
asc-devkit Tiling 调测实战:ContextBuilder::NodeIoNum 声明算子输入输出个数与内部实现解析

asc-devkit Tiling 调测实战:ContextBuilder::NodeIoNum 声明算子输入输出个数与内部实现解析

人工智能深度学习算子库CANNAscend 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址&…

2026/10/16 5:33:37 阅读更多 →
信号与频谱入门:从时域波形到傅里叶变换的底层逻辑

信号与频谱入门:从时域波形到傅里叶变换的底层逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 5:33:37 阅读更多 →

最新新闻

函数调用集成实战:机器学习如何让AI原生应用从聊天到办事

函数调用集成实战:机器学习如何让AI原生应用从聊天到办事

上个月我在重构一个AI原生应用的信息聚合助手时,遇到一个特别典型的困境:模型已经很聪明了,能理解用户的复杂表达,但它只会输出文字。用户问"明天北京适合穿什么出门",它确实可以回答"明天北京有小雨&a…

2026/10/17 7:48:14 阅读更多 →
Python命令行待办清单实战:用标准库串起基础语法与本地持久化

Python命令行待办清单实战:用标准库串起基础语法与本地持久化

简介:这是一份面向 Python 初学者的命令行待办事项练习资源,帮助读者在本地环境中通过实现增删任务、保存与加载数据等核心功能,掌握 CLI 程序的基本开发思路。资源围绕 add_one_task、print_list、delete_task、save_todos、load_todos 五个…

2026/10/17 7:48:14 阅读更多 →
Python命令行待办工具入门:从零实现本地任务管理CLI

Python命令行待办工具入门:从零实现本地任务管理CLI

简介:这是一份面向 Python 初学者的命令行待办事项练习资源,帮助读者在本地环境中通过实现增删任务、保存与加载数据等核心功能,掌握函数封装、文件读写与 CLI 交互的基本思路。压缩包共 7 个文件,约 295KB,包含 2 个 …

2026/10/17 7:48:14 阅读更多 →
具身智能端侧推理引擎:从100ms到26ms的关键优化技术拆解

具身智能端侧推理引擎:从100ms到26ms的关键优化技术拆解

这套引擎到底解决了什么问题,又凭什么能把延迟压到 26ms,我结合自己跑过的一些端侧项目经验,做一个比较完整的拆解。先说结论:在具身智能这个赛道里,端侧推理引擎不是“把模型塞进机器人”那么简单。真正的难点在于&am…

2026/10/17 7:48:14 阅读更多 →
堆排序为何比快排慢?缓存局部性才是关键

堆排序为何比快排慢?缓存局部性才是关键

有一次我在某项目中需要给一个几千万规模的数据集排序,为了实现方便直接手写了堆排序。跑完一看耗时,比同复杂度、同样是 O(n log n) 的快速排序慢了将近一倍。一开始我以为是自己实现水平问题,直到用性能分析工具查看了缓存未命中数据&#…

2026/10/17 7:48:14 阅读更多 →
DbUtils下划线转驼峰:BeanHandler列名映射全解析

DbUtils下划线转驼峰:BeanHandler列名映射全解析

大概每个写过 JDBC 报表查询的 Java 开发者,都经历过类似的场景:数据库表里明明写着user_name、create_time,Java 实体类里是userName、createTime,用 Apache Commons DbUtils 的BeanHandler一查,返回的对象里全是 nul…

2026/10/17 7:47:13 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →