uni-app 中基于 UTS 封装 Worker 多线程:uts-worker 插件源码解析与实战
示例工程前端移动开发跨平台【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址https://gitcode.com/gh_mirrors/un/uni-app点击查看免费下载导读uts-worker是当前 uni-app 开源仓库中自带的一个 UTS API 插件位于src/uni_modules/uts-worker/它把 uni-app 内置的uni.createWorker多线程能力封装成一组更简洁、可复用的 UTS 接口帮助开发者把耗时任务如数值计算、数据处理放到独立的 Worker 线程中执行避免阻塞 UI 主线程。读完本文你将掌握该插件的模块结构、5 个核心 API 的调用方式与底层实现链路、Worker 任务端WorkerTaskImpl的编写规范以及一个可运行的主线程 ↔ Worker 线程收发消息完整实战示例。一、插件定位为什么需要 uts-worker在 App 端JavaScript 主线程承担了 UI 渲染与业务逻辑一旦遇到大数据量计算或复杂数据处理页面就会卡顿甚至无响应。uni-app 提供了uni.createWorker这一原生 API 来创建独立线程执行任务但直接使用该 API 需要自己处理创建、监听、销毁等样板代码且返回类型是面向 JS 的。uts-worker插件使用 UTS 语言将这一过程封装为类型化、可复用的模块其package.json声明了以下适用版本见 package.jsonHBuilderX^3.6.8uni-app^3.1.0uni-app-x^3.1.0也就是说该插件面向 uni-app 与 uni-app-x 的 App 端Android / iOS / Harmony场景仓库中的示例页面 uts-create-worker.uvue 即展示了其完整用法。二、模块结构一览uts-worker遵循 uni_modules 插件的标准目录约定整体结构如下src/uni_modules/uts-worker/ ├── package.json # 插件元信息版本、兼容引擎、平台声明 ├── readme.md # 插件说明开发文档入口 ├── changelog.md # 更新日志 └── utssdk/ ├── index.uts # 插件入口导出 5 个公开 API 与 UTSWorkerImpl 实现 ├── interface.uts # 全部类型定义Options、回调与函数签名 └── unierror.uts # 错误相关定义当前为空与插件配套的还有仓库根目录下的示例资源src/workers/helloWorkerTask.utsWorker 任务端实现在独立线程中运行src/pages/API/create-worker/uts-create-worker.uvue完整演示页面。package.json中uni_modules.platforms声明了该插件在uni-app与uni-app-x双引擎下的 Appandroid / ios / harmony等平台可用发布渠道通过dcloudext.sale标记为免费插件价格 0.00。三、公开 API 与类型定义插件对外只暴露 5 个函数全部定义在 utssdk/index.uts 并通过export * from ./interface.uts一并导出类型函数作用对应原生调用createWorkers()创建 Workeruni.createWorker(...)sendWorkerMessage(options)向 Worker 发送消息worker.postMessage(...)onWorkerMessage(options)监听 Worker 返回消息worker.onMessage(...)onWorkerError(options)监听 Worker 错误worker.onError(...)destroyWorker()销毁 Workerworker.terminate()对应的类型定义位于 utssdk/interface.utsexport type UTSWorkerSendWorkerMessageOptions { data : string, // 发送给 Worker 的数据字符串 needReply : boolean // 是否需要 Worker 回复 } export type UTSWorkerAddListenerOptions { success ?: UTSWorkerReceiveEventCallback // 收到消息的回调 } export type UTSWorkerAddListenerOptionsSuccess { result : UTSJSONObject // Worker 回传的结果对象 } export type UTSWorkerErrorOptions { success ?: UTSWorkerErrorCallback // 出错时的回调 } export type UTSWorkerErrorCallbackSuccess { message : string // 错误信息 } export type UTSWorkerErrorCallback (error: UTSWorkerErrorCallbackSuccess) void export type UTSWorkerReceiveEventCallback (callback: UTSWorkerAddListenerOptionsSuccess) void export type SendWorkerMessage (options: UTSWorkerSendWorkerMessageOptions) void export type OnWorkerMessage (options: UTSWorkerAddListenerOptions) void export type OnWorkerError (options: UTSWorkerErrorOptions) void export type CreateWorkers () void export type DestroyWorker () void可以注意到消息数据data被设计为string类型而回传结果统一包装为UTSJSONObject这一约定保证了跨线程消息的可序列化。四、核心实现解析UTSWorkerImpl 单例index.uts中所有公开函数都只是薄封装真正的逻辑集中在UTSWorkerImpl类单例shared。从源码结构看该类的设计要点如下export class UTSWorkerImpl{ static shared : UTSWorkerImpl new UTSWorkerImpl() private workerImp : Worker | null null; private options : UTSWorkerAddListenerOptions | null null; private errorOptions : UTSWorkerErrorOptions | null null; ... }使用静态单例shared保证整个应用生命周期内只维护一个 Worker 实例内部持有workerImp底层Worker对象以及消息、错误两个回调容器任何操作前都会做workerImp null的空值保护未创建 Worker 时直接打印错误日志并返回。4.1 create创建 Workercreate(){ if (this.workerImp ! null) { console.warn([UTS Plugin] Worker已存在先销毁旧的Worker); this.destroy(); } const worker uni.createWorker(workers/helloWorkerTask.uts); this.workerImp worker; }关键信息重复创建时先销毁旧实例避免线程泄漏Worker 入口脚本路径写死为workers/helloWorkerTask.uts对应仓库根目录 src/workers/helloWorkerTask.uts。在实际接入其他任务时此路径需要按项目结构调整。4.2 sendMessage发送消息sendMessage(options : UTSWorkerSendWorkerMessageOptions){ ... const msgData options.data; const needReply options.needReply; // 构造发送给 Worker 的消息对象 const messageToWorker { data: msgData, needReply: needReply }; this.workerImp!.postMessage(messageToWorker,null); }插件在发送前把用户传入的data与needReply组装成{ data, needReply }结构化消息再调用底层postMessage投递给 Worker 线程。postMessage的第二个参数传入null表示不需要 transfer 转移的可转移对象。4.3 onMessage / onError注册监听onMessage(options : UTSWorkerAddListenerOptions){ ... this.options options; this.workerImp!.onMessage((result) { if (this.options ! null this.options.success ! null){ let success : UTSWorkerAddListenerOptionsSuccess { result: result as UTSJSONObject } this.options.success(success); } }) }监听器把底层回调返回的result强转为UTSJSONObject后包装进UTSWorkerAddListenerOptionsSuccess交给上层success回调。onError同理但当前源码中错误信息是固定字符串worker error见 utssdk/index.uts这是该示例插件的简化实现真实场景建议从error.message透传具体错误。4.4 destroy销毁 Workerdestroy(){ if (this.workerImp ! null) { this.workerImp.terminate(); this.workerImp null; this.options null; this.errorOptions null; } }调用底层terminate()终止线程同时清空内部引用与已注册的回调防止内存泄漏。五、Worker 任务端继承 WorkerTaskImplWorker 线程中运行的逻辑在 src/workers/helloWorkerTask.uts 中实现任务类需要继承WorkerTaskImpl并覆写三个钩子export class HelloWorkerTask extends WorkerTaskImpl { constructor() { super(); console.log([WorkerTask] HelloWorkerTask 构造器初始化); } // Worker 启动时的入口函数 override entry() { console.log([WorkerTask] HelloWorkerTask 启动完成等待主线程消息); } // 接收主线程发送的消息 override onMessage(message : any) { const messageData message as UTSJSONObject; const msgData messageData[data] as string; const needReply messageData[needReply] as boolean; if (needReply) { this.sendReply(msgData); } } private sendReply(msgData : string) { const response new UTSJSONObject(); const inputNumber parseInt(msgData); if (isNaN(inputNumber)) { response.data 输入${msgData}不是有效数字; } else { const result inputNumber 1; response.data result.toString() } this.postMessage(response); } }要点entry()线程启动入口适合做初始化onMessage(message)与主线程插件侧的{ data, needReply }消息协议严格对应这里通过UTSJSONObject解包出data与needReplypostMessage(response)把结果回传主线程触发主线程注册的onWorkerMessage回调。该示例演示了一个典型的输入数字 1 返回计算任务主线程发送data: 5, needReply: trueWorker 线程计算后回传data: 6从而验证跨线程通信链路。六、实战在页面中驱动完整流程仓库示例页面 uts-create-worker.uvue 给出了从导入到销毁的完整代码路径。导入方式import { onWorkerError, createWorkers, sendWorkerMessage, onWorkerMessage, destroyWorker, UTSWorkerAddListenerOptions, UTSWorkerReceiveEventCallback, UTSWorkerSendWorkerMessageOptions, UTSWorkerErrorOptions } from /uni_modules/uts-worker;6.1 创建并注册监听function create() { createWorkers(); // #ifndef APP-IOS onWorkerMessage({ success: (res : any) { const result (JSON.parse(JSON.stringify(res)) as UTSJSONObject).getAny(result) as UTSJSONObject; const resultData result.getString(data); taskResult.value resultData as string; addLog(收到WorkerTask返回: ${resultData}, receive); } }); onWorkerError({ success: (error : any) { const errorMsg (error as UTSJSONObject).getString(message); addLog(Worker错误: ${errorMsg}, error); } } as UTSWorkerErrorOptions); // #endif }6.2 发送消息function sendMessage() { const options { data: inputValue.value, needReply: true } as UTSWorkerSendWorkerMessageOptions; sendWorkerMessage(options); }6.3 销毁与生命周期清理function destory() { destroyWorker(); workerStatus.value destroyed; } onUnload(() { destory(); })页面在onUnload时主动销毁 Worker是避免线程泄漏的必要实践。示例还通过defineExpose暴露了create、sendMessage等测试方法供自动化测试调用。6.4 平台差异与运行前提示例页面对 iOS 平台做了条件编译处理#ifdef APP-IOS/#ifndef APP-IOS页面顶部也给出了明确提示见 uts-create-worker.uvue在iOS 平台消息监听与错误监听放在sendMessage内部注册而非create时因为 iOS 上 Worker 消息监听存在时序差异Windows 系统标准基座在 iOS 平台无法运行本地 UTS 插件需要自定义基座才能运行本示例。这两个提示说明使用 UTS 插件化封装原生能力时平台行为差异需要以条件编译或文档标注的方式显式处理。七、扩展阅读Sendable 传输变体仓库还提供了该主题的姊妹插件uts-worker-sendable-transfersrc/uni_modules/uts-worker-sendable-transfer/用于演示如何在 Worker 之间进行 Sendable 对象的传输。其任务端 src/workers/sendableTransferWorker.uts 展示了鸿蒙APP-HARMONY下直接修改传入对象属性的用法override onMessage(message : any) { // #ifdef APP-HARMONY if (typeof message object typeof (message as ESObject).a number) { (message as ESObject).a 666 } // #endif this.sendReply(message); }对比可见普通uts-worker走的是字符串 UTSJSONObject的序列化协议而 Sendable 变体可以传递对象引用并在线程间共享内存适合高频大数据量场景。演示页面位于 worker-sendable-transfer.uvue。八、总结uts-worker是一个小而完整的 UTS 插件范本它揭示了在 uni-app / uni-app-x 中封装多线程能力的标准姿势API 层用 UTS 类型定义Options 回调收敛原生 API 的入参提升类型安全实现层单例 空值保护 重复创建兜底销毁保证线程生命周期可控协议层{ data, needReply }结构化消息约定主线程与 Worker 的通信格式任务端继承WorkerTaskImpl覆写entry/onMessage用postMessage回传结果实践层页面中创建 → 监听 → 发送 → 销毁并在页面卸载时回收线程。如果你需要在 uni-app 项目中执行图片处理、数据解析、加解密等耗时计算可以以本插件为模板替换workers/下的任务脚本路径并自定义消息协议快速落地一套类型安全的跨线程任务体系。深入阅读仓库内插件入口实现src/uni_modules/uts-worker/utssdk/index.uts类型定义src/uni_modules/uts-worker/utssdk/interface.uts插件元信息src/uni_modules/uts-worker/package.jsonWorker 任务端示例src/workers/helloWorkerTask.uts完整演示页面src/pages/API/create-worker/uts-create-worker.uvueSendable 传输变体src/uni_modules/uts-worker-sendable-transfer/UTS 语言参考docs/uts/README.mdUTS 插件开发指南docs/plugin/uts-plugin.mdUTS 组件开发指南docs/plugin/uts-component.mdHello UTS 示例工程examples/hello-uts/赞分享示例工程前端移动开发跨平台【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址https://gitcode.com/gh_mirrors/un/uni-app点击查看免费下载相关推荐uni-app 实战UTS 插件 uts-tencentgeolocation 接入腾讯定位Android/iOSuni app 实战UTS 插件 uts tencentgeolocation 接入腾讯定位Android/iOS 本指南基于开源仓库 gh_mirror示例工程前端移动开发跨平台uni-app UTS 原生组件实战基于 Lottie 实现跨端 uts-animation-view 动画组件uni app UTS 原生组件实战基于 Lottie 实现跨端 uts animation view 动画组件 uts animation view 是 H示例工程前端移动开发跨平台uni-app x 中的 uni.installApkAndroid APK 安装能力解析与 UTS 插件源码实践uni app x 中的 uni.installApkAndroid APK 安装能力解析与 UTS 插件源码实践 uni.installApk 是 uni示例工程前端移动开发跨平台上一篇解决《游戏王》系列在PPSSPP模拟器中的画面偏移问题从技术原理到实操方案下一篇3分钟解决Dub CLI集成难题从安装到故障排除全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

在 Mac 上本地跑通语音合成与识别:MLX-Audio 完整实操教程

在 Mac 上本地跑通语音合成与识别:MLX-Audio 完整实操教程

在 Mac 上本地跑通语音合成与识别:MLX-Audio 完整实操教程 【免费下载链接】mlx-audio A text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apples MLX framework, providing efficient speech analysis on Apple Silicon.…

2026/9/20 6:57:05 阅读更多 →
Animeko 代码风格与协作规范实践:EditorConfig 格式化、Kotlin 官方风格与 PR Review 惯例

Animeko 代码风格与协作规范实践:EditorConfig 格式化、Kotlin 官方风格与 PR Review 惯例

音视频移动开发视频 【免费下载链接】animation-garden 集找番、追番、看番的一站式弹幕追番平台,云收藏同步 (Bangumi),离线缓存,BitTorrent,弹幕云过滤。100% Kotlin/Compose Multiplatform 项目地址: https://gitco…

2026/9/20 6:57:05 阅读更多 →
RPCS3 2025 版:从源码到跑通 PS3 游戏,30 分钟手把手配置指南

RPCS3 2025 版:从源码到跑通 PS3 游戏,30 分钟手把手配置指南

RPCS3 2025 版:从源码到跑通 PS3 游戏,30 分钟手把手配置指南 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 RPCS3 是一款免费的 PlayStation 3 模拟器,能把你…

2026/9/20 6:57:05 阅读更多 →

最新新闻

arXiv每日论文分析报告:轻量级本地化学术情报流水线

arXiv每日论文分析报告:轻量级本地化学术情报流水线

1. 这不是“爬虫教程”,而是一份可复用的学术情报流水线设计手记你有没有过这样的体验:早上打开arXiv,面对3000篇新提交论文,标题扫过去全是“Vision-Language Alignment via Contrastive Token Refinement with Adaptive Semanti…

2026/9/20 7:42:22 阅读更多 →
接口测试全攻略:从用例设计到Apifox自动化实战

接口测试全攻略:从用例设计到Apifox自动化实战

接口测试知识总结要说接口测试,很多人的第一反应是“发个请求看看通不通”。但真正在服务端项目里滚过几年的人都知道,接口测试绝不只是把接口调通那么简单。我见过太多团队,前端页面测试做得花团锦簇,结果一上生产环境就爆雷&…

2026/9/20 7:42:22 阅读更多 →
kkFileView CAD图纸在线预览+手绘批注:3步跑通,全程零插件

kkFileView CAD图纸在线预览+手绘批注:3步跑通,全程零插件

kkFileView CAD图纸在线预览手绘批注:3步跑通,全程零插件 【免费下载链接】kkFileView Universal File Online Preview Project based on Spring-Boot 项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView 中午11点40,甲方在…

2026/9/20 7:42:22 阅读更多 →
别把ITSM做成工单流转:面向AI与信创的选型评估指南

别把ITSM做成工单流转:面向AI与信创的选型评估指南

1. 别把ITSM做成工单流转:先把场景想清楚这两年帮几家中大型企业做ITSM(IT服务管理)平台选型评审,有个感受特别明显:很多企业嘴上说“要上一套ITSM”,实际上只想要一个“工单系统”。需求文档翻来覆去就是报…

2026/9/20 7:42:22 阅读更多 →
前牙美学修复的光学逻辑与Kerr分层体系解析

前牙美学修复的光学逻辑与Kerr分层体系解析

1. 前牙美学修复不是“选颜色”,而是重建视觉逻辑链“前牙美学修复用什么品牌?Kerr自然与经典的搭配”——这个标题乍看像一句导购提问,实则藏着临床一线最常被忽视的认知断层:很多医生把前牙修复简化为“挑个好看的颜色”&#x…

2026/9/20 7:42:22 阅读更多 →
Sails 可安装钩子(Installable Hooks)开发完全指南:创建、命名、测试与发布

Sails 可安装钩子(Installable Hooks)开发完全指南:创建、命名、测试与发布

Sails 可安装钩子(Installable Hooks)开发完全指南:创建、命名、测试与发布 【免费下载链接】sails Realtime MVC Framework for Node.js 项目地址: https://gitcode.com/gh_mirrors/sa/sails 导读 可安装钩子(Installabl…

2026/9/20 7:41:22 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →