0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计

京东云 来源:京东零售 朱天健 作者:京东零售 朱天健 2024-11-27 11:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东零售 朱天健

基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测,本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕

背景

在鸿蒙生态系统中,虽然原生应用通常基于 ArkTS 实现,但在实际研发过程中发现,使用 C++ 可以显著提升应用框架和业务的性能表现。随着鸿蒙系统的不断迭代升级,不同语言环境间的协作已成为不可或缺的开发范式,共同构建了更丰富的研发生态。

Taro 通过接入鸿蒙端的 C-API 相关能力,将组件、样式布局等运行时逻辑下沉到 C++ 层,从而极大地提升了页面的渲染性能。

在这样的背景下,构建一套在 C++、ArkTS 等不同语言环境之间高效通信的事件系统,成为了一个极具价值,对于 Taro 来说也是必修的课题。

多语言环境的事件处理机制

Harmony 端的适配过程中,事件系统扮演着双重角色:不仅驱动应用、页面和各模块组件的生命周期,还因为 ArkTS 和业务代码(JS)之间存在人为设定的界限,需要事件作为桥梁,以便 JS 能够调用 ArkTS 的原生能力。

跨语言环境事件驱动架构的设计考量

在设计跨语言环境的事件驱动架构时,需要同时考虑 ArkTS、JS 和 C++ 等多个语言环境的限制和运行时差异。如何实现事件在这些环境之间的有序传递,以驱动页面和组件的生命周期,是事件系统设计的重要考量。

wKgZPGdGlSOAPZcrAAGmqc6Gcg8659.png

通过 C++ 实现事件的底层逻辑,构建一个高效的事件管理系统,可以有效避免冗余接口的设计。同时,与鸿蒙的 C-API 支持的事件系统对接,将各类事件分发到不同语言环境,确保跨语言环境的事件分发与处理的有序性、高效性。

wKgZO2dGlSSAf2CAAAHX5DoMO1s102.png

回顾 Taro 开始适配鸿蒙至今,事件系统也随之经历了从简单到完善的演进历程。从最初在 ArkTS 方案中的基础实现,到随着 Taro for Harmony 方案迭代发展,事件系统的设计也面临 ArkTS 带来的一些限制。

在 ArkTS 语言环境中事件架构的局限性

基于 ArkTS 语言环境实现的事件架构,在性能方面存在较大局限性。特别是在事件冒泡过程中,性能较差的语法,和回调逻辑可能会导致性能严重劣化,甚至阻塞主线程。这不仅会影响应用的响应速度,更有甚者可能对整体用户体验产生负面影响。

wKgZPGdGlSSAHGGSAADA2t22D_w421.png

为了解决这些问题,提升性能以保证用户体验成为关键目标。通过将事件处理逻辑下沉到 C++ 层,并置于后台线程执行等优化手段。能够有效提高代码执行效率,同时避免逻辑阻塞主线程导致的延迟响应,以提升应用的流畅性,提供更佳的用户体验。

wKgZO2dGlSWAFW8dAADnlqBBExY053.png

构建多语言环境下的事件系统

在构建多语言环境下的事件系统时,首要考虑各种类型的事件,比如:鸿蒙提供的组件通用事件、手势等。事件系统需要有效地管理这些不同的事件来源,并根据框架和用户的监听行为有序进行事件的分发。

wKgZPGdGlSWAV9nbAADVPJmdvnw220.png

在这些事件类型中,大致可以分为普通事件和节点事件两类。前者涵盖系统层面和应用、组件等生命周期的变化,通常由系统或应用状态的改变触发,主要由事件中心(eventCenter)来处理;节点事件则与 DOM Tree 紧密相关,这些事件通常需要快速响应,以确保用户界面的流畅性和交互的即时性。

事件中心(eventCenter)的实现

作为 Taro 运行时中的基础模块,事件中心专注于处理系统事件和生命周期。它允许框架和应用开发者在后台线程注册事件队列,并异步分发事件,从而有效减轻主线程的负担。事件中心能够快速响应各种事件,同时具备健壮的错误处理机制,帮助开发者快速定位和解决事件回调中的问题,从而提升开发效率和系统稳定性。

事件监听与分发

开发者可以在 C++ 和 ArkTS 等多种语言环境中创建事件监听器,并将相应的回调函数添加到事件队列中。这一机制允许开发者在不同的编程语言中灵活地定义和处理事件响应逻辑。

当事件触发时,会根据不同语言环境的运行时差异,将事件参数转换为对应的格式。这种参数转换确保了各语言环境能够正确理解并处理事件及包含的数据,无论是简单的数据类型还是复杂的对象结构,都能在不同语言之间无缝传递。

wKgZO2dGlSWAX-UNAAC4KKWUoWs688.png

事件队列会根据监听器的类型,按照预定义的顺序,将事件分发到相应的语言环境中。这样一来,每个监听器都能在其所属的环境中高效地执行对应的回调函数。通过这种方式,不仅可以实现了跨语言的事件处理,优化事件的分发效率,并确保应用在响应用户交互时保持高性能和高稳定性。

需要注意的是,受限于底层限制,在 ArkTS 环境中注册的事件需要回到主线程执行,同时在鸿蒙端不支持 Symbol 类型的事件。

节点事件处理(domEvent)

在 HTML 中,节点事件处理流程会如下图所示,事件从根节点开始向下传播至目标节点,触发后再从目标节点顺着节点树向上冒泡。在鸿蒙端实现中,Taro 基于这一事件传播流程,为开发者提供一致的事件处理机制。

事件类型

在 Taro 框架中,节点主要处理三种类型的事件:鸿蒙事件、鸿蒙手势事件和自定义事件。这些事件都是从TaroElement上进行监听和触发的。根据事件的类型不同,节点会从相应的事件源设置Receiver(事件接收器)来进行监听并处理回调逻辑。

wKgZPGdGlSaAPAyhAAFa9l80Ruk679.png

鸿蒙事件和鸿蒙手势事件分别通过RenderNode注册到Receiver,确保事件能够正确地传递和触发。而自定义事件则根据节点实现或用户自行触发,以满足各种不同类型的交互响应。

事件传播

当TaroElement上的事件被触发后,事件会沿着节点树向上传播。每个节点依次接收到事件,并执行相应的回调。执行完回调后,会检查开发者是否阻止冒泡,以决定是否继续向上传播。事件从目标节点开始,逐级往上直到根节点或者冒泡被阻止。

wKgZO2dGlSaAZxgwAABZX9izNiM649.png


这允许开发者在事件传播过程中,通过任意节点处理或拦截事件来调整业务逻辑实现,以更灵活的方式在特定节点上执行逻辑,或通过阻止冒泡避免对上层节点的影响。这样的设计对于前端开发者来说,更加熟悉、直观。

鸿蒙系统的底层节点事件也有自己的传播逻辑,但由于其机制与 ArkNode 节点树差异,为避免其事件干扰,需要阻止其冒泡行为并接管其传播流程,以确保事件传播与节点树正确关联。

事件回调

由于节点事件也需要回调 JS 环境中执行,根据事件类型的不同,按照 Web 标准将相应的节点、值和方法如 target、stopPropagation、value 等等挂载到事件对象上。通过执行当前回调的序列化方法,确保事件在不同语言环境传递时,可以保证其回调对象能力一致、参数完整。

在 C++ 中,许多组件依赖于事件机制来实现功能。例如,通过鸿蒙事件更新组件属性,还有各个组件节点间的事件传递等。这些组件利用事件机制来确保数据变化能够及时反映,并且用户交互能够顺利传递到系统的各个部分。

总结与展望

在多语言环境中,确保事件在不同语言环境传递时的一致性尤为重要,各个模块以及应用内不同页面或组件通过事件解耦驱动来提升可维护性。当前的解决方案有效提升了系统的响应速度和模块间的协作能力。

当下方案实现中仍然存在一些问题,比如早期通过事件绕过 ArkTS 与 JS 之间相互调用限制等场景,可以通过 TurboModule 来提供更加直接的调用方案。

未来,在 Taro for Harmony 场景下,各语言模块的协同将进一步增强。基于事件系统的设计,可以有效地解耦模块间逻辑,实现更灵活的组合。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 系统设计
    +关注

    关注

    0

    文章

    169

    浏览量

    22661
  • 鸿蒙
    +关注

    关注

    60

    文章

    2858

    浏览量

    45354
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开源鸿蒙技术大会2025丨编译器与编程语言分论坛:语言驱动系统创新,编译赋能生态繁荣

    在万物智联的时代背景,操作系统底层能力的构建离不开编程语言与编译器的关键支撑。作为开源鸿蒙生态的核心技术
    的头像 发表于 11-20 17:24 483次阅读
    开源<b class='flag-5'>鸿蒙</b><b class='flag-5'>技术</b>大会2025丨编译器与编程<b class='flag-5'>语言</b>分论坛:<b class='flag-5'>语言</b>驱动<b class='flag-5'>系统</b>创新,编译赋能生态繁荣

    【置顶公告】视美泰开源鸿蒙系列产品业务咨询与商务合作通道正式开启!

    设计。 生态解决方案整合智慧政务、智慧医疗、智慧园区、智慧教育、智慧安平、工业物联网等领域鸿蒙系统集成与场景落地。 技术授权与联合创新OpenHarmony生态兼容性认证、
    发表于 10-20 16:23

    阿里巴巴国际站关键字搜索 API 实战:3 步搞定多语言适配 + 限流破局,询盘量提升 40%

    跨境电商API开发常陷合规、多语言、限流等坑。本文详解从国际合规(GDPR/CCPA)到参数优化、数据结构化及区域化搜索的全链路方案,附Python代码模板与缓存重试架构,助力提升调用成功率至99%+,精准询盘增长42%。
    的头像 发表于 10-20 14:44 855次阅读

    速卖通全球运营利器:商品详情接口多语言 + 合规 + 物流适配技术全解析

    速卖通全球化适配是跨境成功关键!本文详解2025最新接口方案,涵盖多语言智能翻译、合规自动校验、物流精准推荐与性能优化四大模块,助力商家提升转化率30%+,降低风险,提效80%。附实操代码与新手步走策略,适合所有想出海的卖家。
    的头像 发表于 10-16 09:30 322次阅读
    速卖通全球运营利器:商品详情接口<b class='flag-5'>多语言</b> + 合规 + 物流适配<b class='flag-5'>技术</b>全解析

    Taro on HarmonyOS 技术架构深度解析

    2025 年 6 月,在华为开发者大会 2025 开发者场景技术共建分论坛,本文作者进行了《京东 Taro 框架鸿蒙版本正式开源 助力鸿蒙
    的头像 发表于 08-04 16:10 564次阅读
    <b class='flag-5'>Taro</b> on HarmonyOS <b class='flag-5'>技术</b>架构深度解析

    EASY EAl Orin Nano(RK3576) whisper语音识别训练部署教程

    1Whisper简介Whisper是OpenAI开源的,识别语音识别能力已达到人类水准自动语音识别系统。Whisper作为一个通用的语音识别模型,它使用了大量的多语言和多任务的监督数据来训练,能够在
    的头像 发表于 07-25 15:21 550次阅读
    EASY EAl Orin Nano(RK3576) whisper语音识别训练部署教程

    开源系统适配:聚徽分享国产工控平板在 Linux / 鸿蒙系统技术优化

    工控平板进行技术优化,实现与 Linux、鸿蒙系统的高效适配,成为行业关注的焦点。 一、Linux 系统国产工控平板的
    的头像 发表于 06-13 16:29 711次阅读

    京东开源Taro on HarmonyOS C-API版本

    近日,京东正式开源了Taro on HarmonyOS C-API 版本,为鸿蒙应用跨端开发提供高性能框架。这次版本的发布,带来了更丰富的样式适配、更高效的渲染性能、更全面的组件支持,让开发者以Web范式的方式来开发出媲美鸿蒙
    的头像 发表于 06-09 09:19 948次阅读
    京东开源<b class='flag-5'>Taro</b> on HarmonyOS C-API版本

    开源鸿蒙开发新体验,开鸿Bot系列今日开启预售!

    技术支持与配套文档资源支持、打造开源鸿蒙开发者的“标准配置”等,这将进一步降低开发者参与开源鸿蒙生态建设的门槛。 开鸿Bot系列的推出,开启了开源鸿
    发表于 05-16 14:13

    快手上线鸿蒙应用高性能解决方案:数据反序列化性能提升90%

    通用能力、垂类行业等场景推出系列开发者场景化解决方案,不断提升鸿蒙应用的创新体验和开发效率,与广大开发者共建繁荣的
    发表于 05-15 10:01

    语言康复行业首家!阳光语言正式接入DeepSeek

    “新”与“老”的结合,将融合和迸发更多可能性,为更多语言障碍者提供更加科学、智能、精准的服务。 智能问答 一触即达 在陪伴孩子成长的过程中,家长会面临方方面面的问题,发音不准、口吃、语言发育迟缓等等。面对这些语言发育问题,家长该
    的头像 发表于 03-06 14:14 484次阅读
    <b class='flag-5'>语言</b>康复行业首家!阳光<b class='flag-5'>语言</b>正式接入DeepSeek

    鸿蒙文件传输方库上线开源鸿蒙社区 十行代码实现大文件高速传输

    “super_fast_file_trans”,下载使用。未来,华为也将持续创新,面向底座技术通用能力、垂类行业等场景推出系列开发者场景
    发表于 03-06 10:29

    了解DeepSeek-V3 和 DeepSeek-R1两个大模型的不同定位和应用选择

    DeepSeek-V3 更适合聊天机器人、内容创作、多语言翻译、基础数据分析等通用需求。 DeepSeek-R1 聚焦科研辅助、数学教育、金融建模、代码审查等需强逻辑推理的场景,尤其在需要分步推导(如数
    发表于 02-14 02:08

    Meta与UNESCO合作推动多语言AI发展

    Meta最近宣布了一项与联合国教科文组织(UNESCO)合作的全新计划——语言技术伙伴计划。该计划旨在收集多种语言的语音录音和文字记录,以推动未来开放可用的人工智能(AI)技术的发展,
    的头像 发表于 02-08 11:04 893次阅读

    微软Copilot Voice升级,积极拓展多语言支持

    近日,据报道,微软近期在人工智能领域取得了新的进展,正积极拓展其Copilot Voice的多语言支持功能。这一举措标志着微软在语音识别和自然语言处理技术上又迈出了重要一步。 此次Copilot
    的头像 发表于 02-06 14:10 702次阅读