当前位置: 首页 > news >正文

Tauri 如何跑到鸿蒙上?从 tauri-demo 看 OpenHarmony 适配链路

先说结论这个仓库的重点不是 Vue 页面也不是greet函数而是验证 Tauri 的前端、Rust 后端、Runtime、WebView 和 OpenHarmony Ability 能不能串起来。最近我看了一个很有意思的仓库richerfu/tauri-demo。第一眼看它像一个普通的 Tauri Vue Demo。页面是默认模板Rust 侧只有一个greetcommand。但如果只这么看就把重点看偏了。README 里写得很直接这是一个Tauri prototype for OpenHarmony/HarmonyNext。也就是说它不是在教你写一个桌面应用而是在验证一件事Tauri 这套应用模型能不能被搬到 OpenHarmony / HarmonyNext 上这篇先不讲实操先把这条链路讲清楚。一、它不是一个普通的 Tauri Hello World普通 Tauri 项目大概是这样的结构Web 前端 ↓ Tauri JS API ↓ Rust command ↓ Tauri Runtime ↓ 桌面系统 WebView / 窗口 / 原生能力而这个仓库要验证的是另一条链路Vue 前端 ↓ Tauri JS API ↓ Rust command ↓ Tauri Runtime ↓ OpenHarmony Ability ↓ OHOS WebView / N-API / 原生动态库所以你会发现前端代码和 Rust 业务代码都很简单。简单不是因为没写完而是因为它要验证的不是业务复杂度而是最小链路能不能打通。我建议读这个仓库时不要先盯着页面效果看而是先看构建命令、Cargo.toml、生成出来的 OHOS 工程以及EntryAbility如何接住 Rust 动态库。二、前端层Vue 只是入口不是重点从package.json看项目使用的是 Vue 3、Tauri v2 API 和 Tauri opener 插件开发侧是 Vite、TypeScript、Vue TSC 和 Tauri CLI。前端入口src/main.ts非常干净只做 Vue 挂载import{createApp}fromvue;importAppfrom./App.vue;createApp(App).mount(#app);真正的跨端调用发生在App.vue。它从tauri-apps/api/core里导入invoke然后在表单提交时调用 Rust commandasyncfunctiongreet(){greetMsg.valueawaitinvoke(greet,{name:name.value});}这行代码很小但意义很大。它代表 WebView 里的前端页面通过 Tauri 的 IPC 通道去调用 Rust 侧的本地函数。在普通桌面环境里这说明 Tauri 的前后端通信打通了。在 OpenHarmony 场景里它还多了一层意义这个调用链要能穿过 OHOS 的应用模型继续成立。三、Rust 层最小 command验证最大链路Rust 侧的代码也很克制。src-tauri/src/lib.rs里定义了一个greetcommand#[tauri::command]fngreet(name:str)-String{format!(Hello, {}! Youve been greeted from Rust!,name)}然后在run()里注册进去tauri::Builder::default().plugin(tauri_plugin_opener::init()).invoke_handler(tauri::generate_handler![greet]).run(tauri::generate_context!()).expect(error while running tauri application);这里有两个关键点。第一#[tauri::command]让 Rust 函数可以被前端调用。第二generate_handler![greet]把这个 command 注册给 Tauri。所以完整调用链是Vue 表单 ↓ invoke(greet) ↓ Tauri IPC ↓ generate_handler![greet] ↓ Rust greet() ↓ 返回字符串给前端这就是 Tauri 的最小闭环。四、真正的地图在 Cargo.toml如果只看 Vue 和greet这个项目看不出什么特别。真正关键的是src-tauri/Cargo.toml。这里的tauri和tauri-build不是普通 crates.io 版本而是指向richerfu/tauri的feat/open-harmony分支。同时项目还 patch 了 Wry、Tao、tauri-runtime、tauri-utils 等关键组件并引入了 OpenHarmony Ability 相关依赖。tauri tauri-build tauri-runtime tauri-runtime-wry wry tao openharmony-ability napi-ohos这说明一件事这个 demo 的核心工作不在业务代码而在 Tauri runtime、窗口层、WebView 层和 OHOS Ability 桥接层。也就是说这不是“写一个鸿蒙页面”而是“让 Tauri 的应用模型被 OHOS 承载”。五、构建结果不是桌面 App而是 OHOS 工程README 里的构建方式是cdsrc-tauricargotauri ohos build构建后要用 DevEco Studio 打开src-tauri/gen/ohos这一步很关键。它说明 Tauri CLI 在这里的角色不只是“打一个桌面包”而是生成一个可以被 OHOS 工具链继续处理的工程。生成的 OHOS 工程里module.json5定义了EntryAbility设备类型包含phone、tablet、2in1并申请了INTERNET权限。六、EntryAbility 是 Tauri 和 OHOS 的接头再看EntryAbility.ets。它继承自ohos-rs/ability的NativeAbility并声明了一个很重要的字段publicmoduleName:stringtauri_demo_lib这个名字正好对应 Rust 侧的动态库名称。换句话说OHOS 的 Ability 启动后会通过这层 NativeAbility把生命周期和 Rust / Tauri 侧的入口接起来。README 里也特别备注了一句RustAbility will forward lifecycle automatically.我的理解是这句话才是整个 demo 的关键OHOS 的生命周期需要被转发给 Rust/Tauri runtimeTauri 才能继续完成初始化、窗口创建、WebView 承载和事件处理。七、一张图总结把它完整串起来就是下面这条链路Vue 页面 ↓ tauri-apps/api/core invoke() ↓ Tauri IPC ↓ Rust #[tauri::command] ↓ Tauri Builder / Runtime ↓ richerfu/tauri feat/open-harmony ↓ Wry / Tao OpenHarmony 适配 ↓ src-tauri/gen/ohos ↓ EntryAbility / NativeAbility ↓ OHOS WebView / 原生动态库所以这个项目虽然小但它的价值很清楚tauri-demo 不是一个业务 demo而是一个 Tauri OpenHarmony 适配链路的最小验证工程。八、它证明了什么还没证明什么它已经证明了几个关键点Tauri CLI 可以走到 OHOS 构建路径。Vue 前端可以通过 Tauriinvoke调 Rust。Rust 侧可以作为动态库被 OHOS Ability 承接。生成的 OHOS 工程可以交给 DevEco Studio 继续运行。但它还没有证明全部能力。比如复杂插件、文件系统、窗口管理、多页面、系统权限、打包发布、生产级调试这些都还需要后续继续验证。所以这篇文章的结论很简单这个 demo 值得看不是因为它写了多少代码而是因为它把 Tauri 上鸿蒙的关键路径暴露出来了。下一篇我们不再讲原理直接动手跑一遍安装依赖、构建 OHOS 工程、用 DevEco Studio 打开并尝试改一个 Rust command。
http://www.zskr.cn/news/1360653.html

相关文章:

  • 3MF格式导入导出:Blender3mfFormat插件终极指南
  • 别再手动调参了!用LabVIEW+VeriStand实时控制你的Simulink三相逆变器模型
  • 2026北京大兴律师事务所权威推荐(2026 精选版)|避坑指南 + 精准选型攻略,严选北京百富律师事务所 - 新闻快传
  • 5.17全系统联动调试
  • ESP32硬件信息全知道:从esptool命令到系统API,一篇搞定芯片型号、Flash和内存查询
  • 终极指南:如何用30+专业模板快速美化Power BI报表
  • 对比直连与通过Taotoken调用大模型API的延迟体感差异
  • 品牌在AI搜索时代不被推荐,问题可能出在这三个地方
  • 北京大兴十大知名金牌律师事务所排名,严选北京百富律师事务所,专业顶尖团队口碑一流 - 新闻快传
  • 从蓝牙信标到Web地图:用JavaScript在浏览器里玩转RSSI三点定位
  • 2026 年专为 C 语言打造超便携标准库 sp.h,设计原则与非目标全解析!
  • 山东德鲁克新材料有限公司—A2 防火板/铝锥芯三维板/无胶蜂窝板/冰火板/铝单板/钢制墙板/铝天花/铝方通/铝方管源头工厂 - 新闻快传
  • 长期使用Taotoken Token Plan套餐的成本控制实践分享
  • 别再手动标数据了!用UE5+UnrealSynth,5分钟搞定AI训练用的合成数据集
  • 2026广东高端手表定制深度评测:5大维度数据排行 - 新闻快传
  • java+vue+SpringBootjava+vue+SpringBoot中小型制造企业质量管理系统(程序+数据库+报告+部署教程+答辩指导)(程序+数据库+报告+部署教程+答辩指导)
  • RT-Thread物联网实战:用MQTT+ESP8266+AHT10,打造一个温湿度远程监控与LED控制终端
  • Qt 5.9.1 MinGW 32位下,手把手搞定周立功CAN二次开发库的加载与配置
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan集成详细步骤
  • 为HermesAgent配置Taotoken作为自定义模型提供商
  • 别再死记硬背了!通过SCL写冒泡排序,彻底搞懂PEEK/POKE和PLC内存模型
  • 5分钟快速上手!用VeriStand为你的Simulink BUCK模型搭一个简易监控界面(附控件使用技巧)
  • 用C语言指针实战分析双色球历史数据:一个C语言初学者的趣味项目
  • 告别Typora和Vditor?在WordPress后台打造你的全能Markdown写作环境
  • OpenTSN 3.2硬件架构实战:从报文进入交换机到发出的完整数据流追踪
  • S5P6818开发板选型避坑:POS机、广告机项目到底选4418还是6818?
  • 深度学习的缺失数据革命:使用MIDAS实现高效多重插补
  • 告别抢票焦虑:大麦网自动抢票系统终极使用指南
  • 【收藏干货】2026 版大模型推理底层原理拆解!吃透 Prefill/Decode 与 vLLM 核心优化
  • 告别BiocManager安装失败:手把手教你用conda一键部署clusterProfiler及其所有依赖