Tauri 2.0 Beta体验:跨平台移动端支持

Tauri 2.0 Beta终于出了。最让人兴奋的变化是移动端支持——同一套代码可以编译到iOS和Android。虽然还是Beta阶段,但已经值得提前了解。这篇记录一下Tauri 2.0的主要变化和移动端体验。

Tauri 2.0的核心变化

Tauri 1.x只支持桌面端(Windows/macOS/Linux),2.0把目标扩展到了移动端。主要变化:

移动端支持

这是2.0最大的卖点。Tauri 2.0在移动端使用系统自带的WebView(iOS上是WKWebView,Android上是WebView2),和桌面端的思路一致——不打包浏览器引擎,用系统组件渲染前端。

移动端的Rust后端通过JNI(Android)和Swift桥接(iOS)与原生层通信。这意味着理论上可以调用所有原生API。

插件系统重构

1.x的API是硬编码在核心里的,2.0改成了插件架构。文件系统、Shell、对话框等原来内置的功能都拆成了独立插件:

# Cargo.toml
[dependencies]
tauri = "2.0.0-beta"
tauri-plugin-fs = "2.0.0-beta"
tauri-plugin-dialog = "2.0.0-beta"
tauri-plugin-shell = "2.0.0-beta"

好处是按需引入,减小打包体积。也便于社区开发第三方插件。

权限系统

2.0引入了细粒度的权限控制。每个插件的每个能力都需要在配置中显式声明:

{
  "tauri": {
    "allowlist": {
      "fs": {
        "scope": ["$APPDATA/**", "$DOWNLOAD/**"],
        "readFile": true,
        "writeFile": true
      },
      "dialog": {
        "open": true,
        "save": true
      },
      "shell": {
        "open": true,
        "execute": false
      }
    }
  }
}

这比1.x的all-or-nothing安全多了。用户可以明确知道应用请求了哪些权限。

与1.x的区别

特性 Tauri 1.x Tauri 2.0
平台支持 桌面端 桌面+移动端
API架构 内置 插件化
权限控制 粗粒度 细粒度
IPC协议 JSON序列化 更高效的协议
配置格式 tauri.conf.json 支持JSON/TOML
最低Rust版本 1.59 1.70

迁移成本方面,如果1.x项目不复杂,主要是把内置API调用改成插件调用,工作量不大。但如果用了很多自定义Command,需要逐个检查兼容性。

移动端体验

环境准备

开发移动端需要额外的工具链:

  • iOS:需要Xcode和iOS模拟器
  • Android:需要Android Studio、NDK和模拟器

Tauri CLI已经集成了移动端的初始化和构建命令:

# 添加移动端支持
cargo tauri android init
cargo tauri ios init

# 开发模式
cargo tauri android dev
cargo tauri ios dev

# 构建
cargo tauri android build
cargo tauri ios build

实际体验

我拿一个简单的Tauri 1.x项目试了迁移。前端是React + Tailwind,后端有几个文件操作的Command。

iOS:在模拟器上跑起来了,WKWebView渲染效果和Safari一致。页面交互流畅,Rust Command调用正常。但有些CSS效果在移动端需要调整(比如hover状态)。

Android:也能跑,但遇到了一些WebView兼容性问题。不同Android版本的WebView差异还是挺大的,低版本上部分CSS特性不支持。

性能:冷启动速度比Electron快很多(废话,没打包Chromium),和原生App差距不大。内存占用也很低,比React Native还小。

移动端的限制

Beta阶段还有不少限制:

  • 部分桌面端插件还没适配移动端
  • 热重载在移动端不太稳定
  • 打包签名流程还不够自动化
  • 移动端特有的API(推送通知、传感器等)插件还不全

性能表现

对比了一下同一个简单应用在不同框架下的表现(Android):

指标 Tauri 2.0 React Native Flutter
APK大小 ~8MB ~25MB ~15MB
冷启动 ~400ms ~800ms ~300ms
内存占用 ~60MB ~120MB ~80MB

Tauri在包体积和内存占用上优势明显。冷启动速度不如Flutter但比RN好。不过这是一个很简单的应用,复杂应用可能差异更大。

迁移建议

  • 如果是新项目且需要同时覆盖桌面和移动端,可以考虑直接上2.0
  • 现有1.x项目不急着迁移,等正式版出来再说
  • 如果只做桌面端,1.x已经很稳定了,等2.0稳定了再升级
  • 重度依赖移动端原生能力的项目(相机、蓝牙、NFC等),现阶段还不太适合Tauri

总体评价

Tauri 2.0的移动端支持让Rust+Web的技术栈覆盖面一下子大了很多。虽然Beta阶段还有不少毛糙的地方,但方向是对的。对于前端开发者来说,用熟悉的Web技术做跨平台应用,Tauri正在成为Electron之外的真正可选项。

期待正式版发布。