尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
uni-app x Worker 多线程开发指南:uni.createWorker 完整 API 解析与跨端实践
uni-app x Worker 多线程开发指南uni.createWorker 完整 API 解析与跨端实践【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app现代 CPU 都是多核的而 uni-app x 的代码默认运行在主线程UI 线程上。当遇到大量计算、数据压缩等耗时任务时可以通过 Worker API 将计算任务剥离到子线程执行利用多核并行能力提升应用响应速度。本文基于开源仓库 uni-appGitHub 加速计划 / un / uni-app中docs/api/create-worker.md的完整文档结合仓库内uni-createWorker模块源码、示例工程与自动化测试系统讲解uni.createWorker的参数、返回对象、错误码、完整使用流程与跨端注意事项帮助你写出可在 Web、微信小程序、AppAndroid/iOS/HarmonyOS多端运行的 Worker 代码。一、为什么需要 Worker主线程与子线程的边界uni-app x 的代码默认都是在主线程执行的主线程也称为 UI 线程。所有 UI 操作、界面绘制都必须在主线程进行也就是说子线程不能操作 DOM API、不能操作绑定在界面上的响应式变量。当主线程被耗时任务如大文件压缩、复杂计算阻塞时就会出现掉帧、卡顿。Worker 就是为此设计的跨端封装通过uni.createWorker在子线程中执行计算任务主线程通过消息与子线程通信。常见的使用场景包括当界面掉帧时检查是什么耗时任务导致不能及时渲染考虑是否可以把计算任务剥离到子线程来做多份大数据需要尽快处理比如多个 JSON 文件需要压缩可以启动多线程并行处理。需要特别说明的是Worker API 只是一种跨端封装并且为了跨端约束了一些写法。开发者也可以在 uts 插件中自行使用纯原生代码来操作线程参见 uts 插件文档。同时Worker 与 Android 的协程是不同概念——Android 上requestAPI 内部已经使用了协程而 Worker 是独立的线程机制。二、uni.createWorker(url)API 总览2.1 函数签名与参数uni.createWorker(url)用于创建一个 Worker 对象其唯一参数说明如下| 名称 | 类型 | 必填 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | url | string | 是 | iOS: x; iOS UTS 插件: 4.81 | Worker 脚本的 URL |2.2 返回值| 类型 | 描述 | | :- | :- | | Worker | Worker 对象 |2.3 兼容性| Web | 微信小程序 | Android(VDOM) | Android(Vapor) | Android(Vapor) UTS 插件 | iOS | iOS UTS 插件 | HarmonyOS | | :- | :- | :- | :- | :- | :- | :- | :- | | 4.81 | 4.41 | 4.81 | x | 5.21 | x | 4.81 | 4.81 |说明表格中的 x 表示该平台/模式暂不支持具体版本要求以所用 HBuilderX 版本为准。iOS 平台及 Android 的蒸汽Vapor模式下Worker 仅支持在 uts 插件 中使用不能直接在uvue页面中调用uni.createWorkeruni.createWorker是一个 uts API无法在 js 环境使用。2.4 源码中的类型定义在仓库源码中CreateWorker的类型定义位于 src/uni_modules/uni-createWorker/utssdk/interface.uts/** * CreateWorker */ export type CreateWorker (url: string) Worker export interface Uni { /** * 创建一个Worker对象 * param url Worker脚本的URL */ createWorker: CreateWorker }其参数校验协议定义在 src/uni_modules/uni-createWorker/utssdk/protocol.utsexport const CREATE_WORKER createWorker export const CreateWorkerApiProtocol new Mapstring, ProtocolOptions([ [ url, { type: string, required: true } ] ])从协议定义可以看出url是必填的 string 类型参数类型不匹配或缺失时会在 API 层直接拦截。三、Worker 对象属性与方法详解3.1 属性envWorker 内的环境变量| 名称 | 类型 | 必备 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | env |WorkerEnv| 否 | Web: x; 微信小程序: 4.41; Android: x; iOS: x; iOS UTS 插件: 4.81; HarmonyOS: x | worker 内的环境变量 |其中env的属性| 名称 | 类型 | 必备 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | USER_DATA_PATH | string | 否 | Web: x; 微信小程序: 4.41; Android: x; iOS: x; iOS UTS 插件: 4.81; HarmonyOS: x | 文件系统中的用户目录路径本地路径 |WorkerEnv类型在源码中的定义为见 src/uni_modules/uni-createWorker/utssdk/interface.uts/** * worker内的环境变量 */ export type WorkerEnv { /** * 文件系统中的用户目录路径 (本地路径) */ USER_DATA_PATH?: string | null };目前从兼容性矩阵看env仅在微信小程序4.41和 iOS UTS 插件4.81上可用其他平台标记为 x不支持因此在跨端代码中访问worker.env?.USER_DATA_PATH时建议做空值判断。3.2 方法一onMessage(callback)onMessage(callback: WorkerOnMessageCallback): void;监听「主线程/Worker 线程」向当前线程发送的消息的事件。参数| 名称 | 类型 | 必填 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | callback | (message: any) void | 是 | iOS: x; iOS UTS 插件: 4.81 | 监听消息 Callback |兼容性| Web | Android(VDOM) | Android(Vapor) | Android(Vapor) UTS 插件 | iOS | iOS UTS 插件 | HarmonyOS | | :- | :- | :- | :- | :- | :- | :- | | 4.81 | 4.81 | x | 5.21 | x | 4.81 | 4.81 |3.3 方法二onError(callback)onError(callback: WorkerOnErrorCallback): void;监听 Worker 线程错误事件。当 Worker 线程中发生脚本错误时会触发此事件。参数| 名称 | 类型 | 必填 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | callback | (result: WorkerOnErrorCallbackResult) void | 是 | iOS: x; iOS UTS 插件: 4.81 | Worker 错误 callback |兼容性与 onMessage 相同Web 4.81、Android(VDOM) 4.81、Android(Vapor) UTS 插件 5.21、iOS UTS 插件 4.81、HarmonyOS 4.81Android(Vapor) 与 iOS 直接使用为 x。WorkerOnErrorCallbackResult 的属性值| 名称 | 类型 | 必备 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | errCode | number | 是 | iOS: x; iOS UTS 插件: 4.81 | Worker 错误码 | | errSubject | string | 是 | iOS: x; iOS UTS 插件: 4.81 | 统一错误主题模块名称 | | data | any | 否 | iOS: x; iOS UTS 插件: 4.81 | 错误信息中包含的数据 | | cause | Error | 否 | | 源错误信息可以包含多个错误详见 SourceError | | errMsg | string | 是 | iOS: x; iOS UTS 插件: 4.81 | 错误信息描述 |在源码中WorkerOnErrorCallbackResult继承自IUniError并约束了errCode的取值范围见 src/uni_modules/uni-createWorker/utssdk/interface.uts/** * Worker错误回调参数 */ export interface WorkerOnErrorCallbackResult extends IUniError { errCode: WorkerOnErrorCallbackResultErrorCode };cause字段对应的Error标准可参考 err-spec.md 中的 UniError 规范。3.4 方法三postMessage(message, options?)postMessage(message: any, options?: WorkerPostMessageOptions): void;向「主线程/Worker 线程」发送消息。参数| 名称 | 类型 | 必填 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | message | any | 是 | iOS: x; iOS UTS 插件: 4.81 | 发送的数据 | | options |WorkerPostMessageOptions| 否 | iOS: x; iOS UTS 插件: 4.81 | 主线程/Worker 线程发送消息的参数 |options 的属性描述| 名称 | 类型 | 必备 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | harmonySendable | boolean | 否 | Web: x; Android: x; iOS: x; iOS UTS 插件: 4.81; HarmonyOS: 4.81 | 是否支持符合 Sendable 协议的对象作为共享变量发送使用 postMessageWithSharedSendable 实现默认值为 false仅鸿蒙平台支持 | | transfer | Arrayany | 否 | Web: 4.81; Android: x; iOS: x; iOS UTS 插件: 4.81; HarmonyOS: 4.81 | 可转移对象数组默认值为空数组仅鸿蒙、Web 平台支持 |源码中的WorkerPostMessageOptions定义见 src/uni_modules/uni-createWorker/utssdk/interface.uts/** * 主线程/Worker线程 发送消息的参数 */ export type WorkerPostMessageOptions { /** * 是否支持符合Sendable协议的对象作为共享变量发送使用postMessageWithSharedSendable实现默认值为false * 仅鸿蒙平台支持 */ harmonySendable?: boolean /** * 可转移对象数组默认值为空数组 * 仅鸿蒙、web平台支持 */ transfer?: any[] }3.5 方法四terminate()terminate(): void;结束当前 Worker 线程。仅限在主线程 worker 对象上调用。兼容性Web 4.81、Android(VDOM) 4.81、Android(Vapor) UTS 插件 5.21、iOS UTS 插件 4.81、HarmonyOS 4.81。3.6 Worker 接口的源码全貌将上述成员汇总Worker接口在 src/uni_modules/uni-createWorker/utssdk/interface.uts 中的完整定义如下/** * Worker对象 */ export interface Worker { env?: WorkerEnv | null; /** * 监听 主线程/Worker线程 向当前线程发送的消息的事件。 */ onMessage(callback: WorkerOnMessageCallback): void; /** * 监听 Worker 线程错误事件。当 Worker 线程中发生脚本错误时会触发此事件。 */ onError(callback: WorkerOnErrorCallback): void; /** * 向 主线程/Worker线程 发送的消息。 */ postMessage(message: any, options?: WorkerPostMessageOptions | null): void; /** * 结束当前 Worker 线程。仅限在主线程 worker 对象上调用。 */ terminate(): void; }四、错误码体系errCode 合法值当 Worker 运行出错时onError回调会收到带有errCode的结果对象。合法错误码如下| 合法值 | 兼容性 | 描述 | | :- | :-: | :- | | 5000501 | iOS: x; iOS UTS 插件: 4.81 | worker 运行错误 | | 5000502 | iOS: x; iOS UTS 插件: 4.81 | worker 序列化失败 | | 5000503 | iOS: x; iOS UTS 插件: 4.81 | worker 实例未运行 | | 5000504 | iOS: x; iOS UTS 插件: 4.81 | worker 线程中不支持调用的 API | | 5000505 | iOS: x; iOS UTS 插件: 4.81 | worker 线程初始化失败 | | 5000506 | iOS: x; iOS UTS 插件: 4.81 | worker 文件路径无效 | | 5000510 | iOS: x; iOS UTS 插件: 4.81 | 非主线程调用 worker API | | 5000511 | iOS: x; iOS UTS 插件: 4.81 | worker 线程无效 |这些错误码在源码中都有对应的常量定义与英文错误信息见 src/uni_modules/uni-createWorker/utssdk/unierror.utsexport const WORKER_RUN_FAILED 5000501; export const WORKER_SERIALIZATION_FAILED 5000502; export const WORKER_INSTANCE_IS_NOT_RUNNING 5000503; export const WORKER_CALL_NOT_SUPPORTED 5000504; export const WORKER_INIT_FAILED 5000505; export const WORKER_PATH_INVALID 5000506; export const WORKER_THREAD_FAILED 5000510; //非主线程调用worker api export const WORKER_INVALID 5000511; //worker线程无效 export const CreateWorkerUniErrorMap: MapWorkerOnErrorCallbackResultErrorCode, string new Map([ [WORKER_RUN_FAILED, worker run failed.], [WORKER_SERIALIZATION_FAILED, worker serialization failed.], [WORKER_INSTANCE_IS_NOT_RUNNING, The Worker instance is not running.], [WORKER_CALL_NOT_SUPPORTED, The called API is not supported in the worker thread.], [WORKER_INIT_FAILED, Worker initialization failed.], [WORKER_PATH_INVALID, The worker file path is invalid.], [WORKER_THREAD_FAILED, An error occurred when a non-main thread called the worker api.], [WORKER_INVALID, The worker thread is invalid.], ]);错误主题errSubject统一为uni-createWorker错误对象通过WorkerOnErrorCallbackResultImpl构造errMsg由错误码对应的英文信息与具体reason拼接而成见 src/uni_modules/uni-createWorker/utssdk/unierror.uts。这也解释了为什么错误回调中的errMsg常常带有reason:xxx后缀。五、Worker 完整使用流程步骤 1配置 Worker 信息manifest.jsonWorker 代码是独立的uts文件所有 worker 代码文件需要放置在专门的目录。在项目的manifest.json中可配置 Worker 文件放置的目录{ //... workers: { path: workers, // 相对于项目根目录。此配置的意思是在项目根目录下的workers目录下存放worker代码。 isSubpackage: true // 是否分包默认为 false仅微信小程序有效 } }如果不使用微信小程序的分包配置也可以使用简写配置{ //... workers : workers }在仓库的示例工程 src/manifest.json 中正是使用了简写形式workers: workers即项目根目录下的workers目录。步骤 2添加 Worker 代码文件参考上一步的配置在项目根目录下创建workers目录并创建示例HelloWorkerTask.uts文件项目结构如下├─ static ├─ workers // Worker 目录 │ └─ HelloWorkerTask.uts // Worker 代码文件 ├─ App.uvue ├─ main.uts ├─ manifest.json └─ pages.jsonWorker 代码除了可以放到manifest.json - workers配置的目录还支持放置到项目 uni_modules 插件中此时目录为固定的插件id/workers注意这里的 workers 目录是固定的跟 manifest.json 配置没有关系比如uni_modules/test-worker/workers├─ static ├─ uni_modules/test-worker/workers // 固定的插件 Worker 目录 │ └─ HelloWorkerTask.uts // Worker 代码文件 ├─ App.uvue ├─ main.uts ├─ manifest.json └─ pages.json仓库中 src/workers/ 目录实际存放了两个 Worker 文件helloWorkerTask.uts与sendableTransferWorker.uts可作为真实参考。步骤 3编写 Worker 代码Worker 代码中需定义一个类并继承自基类WorkerTaskImpl重写onMessage方法接收主线程发送的数据。以下是HelloWorkerTask.uts示例代码/** * HelloWorkerTask */ export class HelloWorkerTask extends WorkerTaskImpl { /** * 构造函数 */ constructor() { super(); //初始化操作 // console.log(构造器初始化); } /** * 实现入口函数 */ override entry() { //入口函数Worker 启动时执行 // console.log(启动完成等待主线程消息); } /** * 实现接收主线程发送的消息 */ override onMessage(message : any) { // 处理消息对象 const messageData message as UTSJSONObject; // console.log(收到主线程数据:, messageData); // 发送消息给主线程 this.postMessageToMain(); } /** * 回复消息 */ private postMessageToMain() { const response { msg: message send by worker! }; // 调用 postMessage 发送消息给主线程 this.postMessage(response); } }其中WorkerTaskImpl基类定义如下/** * WorkerTaskImpl */ export class WorkerTaskImpl { /** * 入口函数 * 可重写修改 */ override entry():void; /** * 接收主线程发送的消息 * 可重写修改 */ override onMessage(message: any): void; /** * 向主线程发送消息 */ postMessage(message: any, options: WorkerPostMessageOptions|null null): void; } /** * WorkerPostMessageOptions */ export type WorkerPostMessageOptions { /** * 是否支持符合Sendable协议的对象作为共享变量发送使用postMessageWithSharedSendable实现默认值为false * 仅鸿蒙平台支持 */ harmonySendable: boolean /** * 可转移对象数组默认值为空数组 * 仅鸿蒙、web平台支持 */ transfer: Arrayany }仓库中的真实 Worker 代码 src/workers/helloWorkerTask.uts 展示了更贴近实战的写法——接收主线程传来的数据与needReply标志在子线程完成「数字 1」后通过this.postMessage(response)回传结果export class HelloWorkerTask extends WorkerTaskImpl { //constructor constructor() { super(); console.log([WorkerTask] HelloWorkerTask 构造器初始化); } //实现入口函数 override entry() { console.log([WorkerTask] HelloWorkerTask 启动完成等待主线程消息); } //接收主线程发送的消息 override onMessage(message : any) { console.log([WorkerTask] 收到主线程消息: , message); // 处理消息对象 const messageData message as UTSJSONObject; const msgData messageData[data] as string; const needReply messageData[needReply] as boolean; console.log([WorkerTask] 数据: ${msgData}, 需要回复: ${needReply}); // 根据是否需要回复来处理 if (needReply) { this.sendReply(msgData); } } // 发送回复消息 private sendReply(msgData : string) { const response new UTSJSONObject(); // 尝试将接收到的数据转换为数字并加1 const inputNumber parseInt(msgData); if (isNaN(inputNumber)) { response.data 输入${msgData}不是有效数字; } else { const result inputNumber 1; response.data result.toString() } console.log([WorkerTask] 发送回复消息:, response); this.postMessage(response); } }步骤 4主线程中创建 Worker在主线程的代码中调用uni.createWorker创建并返回 Worker 对象可通过其onMessage方法监听 Worker 子线程发送的数据通过其onError方法监听 Worker 子线程的错误。参考以下示例代码// 创建 Worker 实例 const worker uni.createWorker(workers/HelloWorkerTask.uts); // 监听 Worker 消息 worker.onMessage((message: any) { const messageData message as UTSJSONObject; console.log(收到Worker子线程数据:, messageData); }); // 监听 Worker 错误 worker.onError((error: WorkerOnErrorCallbackResult) { console.error(Worker子线程发生错误:, error); });步骤 5主线程向 Worker 发送消息调用 Worker 对象的postMessage方法向 Worker 子线程发送数据。参考以下示例代码// 向 Worker 子线程发送消息 worker.postMessage({ msg: message send by main! });步骤 6harmonySendable 与 transfer 的使用仅HarmonyOS和Web支持该能力详见仓库示例页面 worker-sendable-transfer 页面测试 与 sendableTransferWorker.uts。harmonySendable仅 HarmonyOS 支持在 uts 插件的同级建立 ets 文件导出Sendable对象Sendable export class SendableObject { a: number 45; }在 uts 插件中引入注意引入时要有.ets后缀// #ifdef APP-HARMONY import { SendableObject } from ./sendable.ets; // #endif在 uts 插件中使用向子线程发送 Sendable 对象workerImp.postMessage(new SendableObject())在 worker 中接收到该对象后的修改会直接体现到宿主线程中。仓库中的 sendableTransferWorker.uts 正是这一机制的实现样例——Worker 线程收到 Sendable 对象后直接修改其属性并回传export class SendableTransferWorker extends WorkerTaskImpl { //接收主线程发送的消息 override onMessage(message : any) { console.log([WorkerTask] 收到主线程消息: , JSON.stringify(message)); // #ifdef APP-HARMONY if (typeof message object typeof (message as ESObject).a number) { (message as ESObject).a 666 } // #endif this.sendReply(message); } // 发送回复消息 private sendReply(message : any) { console.log([WorkerTask] 发送回复消息); this.postMessage(message); } }transfer可转移对象数组Web 支持ArrayBuffer[]、MessagePort[]、ImageBitmap[]等可转移对象HarmonyOS 仅支持ArrayBuffer[]。注意事项HarmonyOS 平台上使用transfer后转移的 ArrayBuffer 长度不会改变但数组本身变为在宿主线程不可用Web 平台使用transfer后转移的数组长度会变为 0。步骤 7结束 WorkerWorker 线程不再使用需主动结束释放相关资源调用 Worker 对象的terminate方法结束子线程。参考以下示例代码// 结束 Worker 子线程 worker.terminate();实际工程中建议在页面销毁时同步释放资源例如在onUnmounted生命周期中调用terminate参见仓库页面 src/pages/API/create-worker/create-worker.uvue 的onUnmounted(() { destory(); })写法。六、端到端示例create-worker 页面与自动化测试6.1 页面示例仓库 src/pages/API/create-worker/create-worker.uvue 提供了一个可直接运行的演示页面完整演示了「创建 Worker → 添加消息监听 → 添加错误监听 → 发送数据子线程 1 后返回→ 销毁 Worker」的操作闭环。核心脚本逻辑如下// 创建Worker const create () { worker.value uni.createWorker(workers/helloWorkerTask.uts); workerStatus.value created; addLog(Worker创建成功, success); created_boolean.value true; } const onWorkerMsg () { if (worker.value null) { addLog(请先创建worker, warning); return; } worker.value!.onMessage((result) { // 处理Worker返回的消息 console.log(收到Worker消息:, result); const res result as UTSJSONObject; const resultData res[data] as string; taskResult.value resultData; inputValue.value taskResult.value addLog(收到WorkerTask返回: ${resultData}, receive); }) } // 向workerTask发送消息 const sendMessage () { // 检查输入值 if (inputValue.value ) { addLog(请输入有效的数字, warning); return; } const options { data: inputValue.value, needReply: true }; worker.value!.postMessage(options, null); addLog(发送值到WorkerTask: ${inputValue.value}, send); } // 销毁Worker const destory () { if (worker.value null) { addLog(没有创建worker,无法销毁, warning); return; } worker.value!.terminate(); workerStatus.value destroyed; isListening.value false; addLog(Worker已销毁, warning); created_boolean.value false; } onUnmounted(() { destory(); })页面中还通过defineExpose暴露了taskResult、create、onWorkerMsg、sendMessage、test_resetInputValue等成员供自动化测试调用。6.2 自动化测试验证仓库中针对该页面编写了自动化测试 src/pages/API/create-worker/create-worker.test.js验证了 Worker 通信闭环的正确性it(workerTask , async () { await page.callMethod(test_resetInputValue); await page.waitFor(500); await page.callMethod(create); await page.waitFor(500); await page.callMethod(onWorkerMsg); await page.callMethod(sendMessage); await page.waitFor(async () { const taskResult await page.data(taskResult.value) return taskResult.length 0 }); expect(await page.data(taskResult.value)).toBe(2); });该测试输入默认值1发送到子线程执行 1 操作后断言返回值等于2同时针对 iOS 平台直接跳过执行if(isIOS) { ... return }与文档中「iOS 平台 Worker 仅支持在 uts 插件中使用」的限制保持一致。七、源码级实现解析以 HarmonyOS 为例uni.createWorker的跨端实现中HarmonyOS 平台实现位于 src/uni_modules/uni-createWorker/utssdk/app-harmony/index.uts其核心逻辑如下创建线程通过 ArkTS 的worker.ThreadWorker创建真实子线程并先发送一条__UNI_THREAD_WORKER_ALREADY__标记消息用于解决「子线程过早调用 postMessage 导致主线程收不到消息」的时序问题消息分发主线程侧使用EventHub将底层onmessage/onerror事件转发给onMessage/onError回调错误转换通过transformErrorCode将 ArkTS 原生错误码如 10200004、10200005、10200003、10200007映射为 uni-app x 的统一错误码5000503、5000504、5000505、5000506默认映射为 5000501 worker 运行错误Sendable 与 transfer当options.harmonySendable为 true 时调用postMessageWithSharedSendable当options.transfer非空时以ArrayBuffer[]作为转移列表调用原生postMessageWorkerTaskImpl 基类Worker 侧基类在构造时注册workerPort.onmessage在收到__UNI_THREAD_WORKER_ALREADY__标记前把postMessage调用暂存进消息队列标记到达后统一发送确保 Worker 启动早期回传消息不丢失。从源码结构可以看出主线程侧的WorkerImpl与 Worker 子线程侧的WorkerTaskImpl是一对对应的封装消息通过postMessage/onmessage双向流通而terminate在清理事件监听后真正结束线程。八、注意事项Tipsuni.createWorker仅支持在主线程中使用在 Worker 子线程中使用会返回错误对应错误码 5000510各平台在 Worker 中使用全局变量或静态属性在内存管理中存在差异Android/iOS 平台可以共享内存其它平台不能共享为了避免这些差异带来的影响建议不要使用全局变量和静态属性Worker 子线程间暂不支持直接互相通讯如要通讯可通过主线程中转发送消息来实现Android/iOS 平台主线程与 Worker 线程传输的引用类型数据是直接共享使用的其它平台默认为复制需避免并发访问。当前暂未提供线程间安全访问机制需通过业务逻辑控制避免并发访问这些共享数据多线程同时写同一个变量、或一个线程读而另一个线程在写同一个变量可能引发崩溃鸿蒙平台主线程与 Worker 线程传输的数据默认为浅拷贝如需传出共享对象可在 uts 插件 中混编开发定义 Sendable 对象调用Worker.postMessage发送这些共享对象时设置harmonySendable参数为 trueWorker 中仅支持调用界面无关的 API如uni.request、uni.getLocation等这些 API 触发的回调运行在 Worker 线程中Web 平台不支持在 worker 中调用uni上的 APICPU 的核数有限不要同时开太多线程线程之间通信可以 post 消息也可以共享变量。web 和小程序仅支持shareArrayBuffer数据类型的共享App 平台没有限制引用类型都可以共享变量。但共享变量时需要开发者注意线程安全问题Android 上通过 surface 渲染的界面组件可以在子线程操作。九、总结uni.createWorker是 uni-app x 中为数不多的多线程能力入口其 API 形态onMessage/onError/postMessage/terminate与 Web Worker、微信小程序 Worker 保持一致降低了跨端学习成本。使用时把握三条主线即可配置与放置在manifest.json的workers字段配置目录或放入 uni_modules 插件的固定workers目录Worker 代码写成继承WorkerTaskImpl的类创建与通信主线程uni.createWorker(url)创建实例通过postMessage发送、onMessage接收、onError监听错误、terminate释放资源平台差异iOS 与 Android(Vapor) 需在 uts 插件中使用全局变量、共享引用、harmonySendable/transfer等能力存在平台差异务必按上文的兼容性表格与 Tips 处理。深入理解 uni-createWorker 模块源码 与 workers 示例可以帮你更准确地预测各平台的行为差异写出真正可跨端运行的多线程代码。【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址: https://gitcode.com/gh_mirrors/un/uni-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

奥的斯ACD2 MR电梯GECB与OVF变频器调试参数及井道自学习故障排查

奥的斯ACD2 MR电梯GECB与OVF变频器调试参数及井道自学习故障排查

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

📅 2026/9/20 17:40:54
VuePress 主题继承(Theme Inheritance)实战指南:从 extend 配置到 @theme / @parent-theme 别名机制

VuePress 主题继承(Theme Inheritance)实战指南:从 extend 配置到 @theme / @parent-theme 别名机制

VuePress 主题继承(Theme Inheritance)实战指南:从 extend 配置到 theme / parent-theme 别名机制 【免费下载链接】vuepress 📝 Minimalistic Vue-powered static site generator 项目地址: https://gitcode.com/gh_mirrors/vu…

📅 2026/9/20 17:40:54
Lostlife2.0整合LLama-Factory:从LoRA微调到NPC智能对话实践

Lostlife2.0整合LLama-Factory:从LoRA微调到NPC智能对话实践

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

📅 2026/9/20 17:40:54
MORE NEWS

更多资讯

📰

radare2 沙箱机制全解析:原生 -S 沙箱与 OSX/OpenBSD/FreeBSD 系统级沙箱实践指南

radare2 沙箱机制全解析:原生 -S 沙箱与 OSX/OpenBSD/FreeBSD 系统级沙箱实践指南 【免费下载链接】radare2 UNIX-like reverse engineering framework and command-line toolset 项目地址: https://gitcode.com/gh_mirrors/ra/radare2 导读 本文基于 radar…

📰

ESP32-P4 USB Host实战:从零读取鼠标HID报告

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

📰

ESP32+MAX30102健康监测实战:从血氧测量到可信数据闭环

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

📰

Windows 版 OpenClaw 一键装完,模型渠道怎么接?TaoToken 只给 Key 和 Base URL

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

📰

B站视频下载工具选型指南:DownKyi、GreenVideo、飞鱼、BiliTools深度对比

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

📰

NetBox Front Port 完全指南:面板穿通端口(Pass-Through Port)建模与前后端口映射实践

后端网络数据建模 【免费下载链接】netbox The premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/ 项目地址: https://gitcode.com/gh_mirrors/ne/ne…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬