Tauri 用“系统 WebView + 原生能力”构建更小更快的跨平台应用

20 阅读6分钟

1. Tauri 是什么

Tauri 是一个用于构建跨平台桌面与移动应用的框架,目标是产出“tiny, fast binaries”(体积小、启动快、性能好)的应用包。它允许你使用任何能够编译到 HTML / JavaScript / CSS 的前端框架来构建用户界面,同时在需要时用 Rust 来编写后端逻辑(也支持通过插件提供 Swift / Kotlin 绑定)。

一句话概括: Tauri = Web UI(你选框架) + 系统 WebView(不自带浏览器内核) + Rust/原生能力(安全与性能)

2. 为什么选择 Tauri:三大优势

官方把 Tauri 的核心优势总结为三点,我用更工程化的方式展开一下,便于你做技术选型。

2.1 安全底座:Rust 带来的“默认更安全”

Tauri 基于 Rust 构建,因此天然能受益于 Rust 的内存安全、线程安全、类型安全等特性。对应用开发者而言,即使你不是 Rust 专家,也能“默认吃到”一部分安全红利。

更重要的是,Tauri 对发布版本会进行安全审计,覆盖的不仅是 Tauri 组织内的代码,也会关注其依赖的上游依赖库。它不能消除所有风险,但能把底座风险压到更可控的范围内,适合更严肃的企业/生产场景。

你在安全治理上可以怎么落地:

  • 尽量把高权限操作封装为少量、明确的命令(command),减少暴露面
  • 针对 invoke 入口做参数校验与权限校验
  • 插件选型优先官方/高活跃社区插件,减少引入“不可审计黑盒”的概率

2.2 更小体积:利用系统原生 WebView

Tauri 的一个关键设计是:使用用户系统自带的 WebView 来渲染 UI。这意味着你的应用不需要像一些方案那样把整个浏览器引擎打包进安装包里。

因此,Tauri 应用的包体通常更小。官方提到极简应用甚至可以做到小于 600KB(具体体积会随功能、资源、平台不同而变化)。对于“分发成本”“冷启动”“增量更新”等维度,这一点非常有价值。

你在体积优化上可以进一步做:

  • 前端资源按需加载、路由懒加载、压缩图片与字体
  • 关闭不需要的特性与插件
  • 按平台做差异化资源打包

2.3 架构更灵活:前端随意选,原生能力可扩展

Tauri 对前端框架几乎没有限制:只要你的 UI 能编译成 HTML/JS/CSS,就能塞进 Tauri。React、Vue、Svelte、Solid、Angular,甚至纯静态页面都可以。

而当你需要更深层的系统集成时,Tauri 提供了多层扩展路径:

  • 直接用 invoke 做 JS 与 Rust 的桥接

  • 通过 Tauri Plugins 扩展能力,并提供 Swift / Kotlin 绑定(更贴近移动端生态)

  • 如果你需要更底层的窗口与 WebView 控制,还可以直接使用 Tauri 维护的底层库

    • TAO:窗口创建与事件循环
    • WRY:WebView 渲染与封装

这种分层非常“工程化”:你可以先用框架能力快速交付,后续再逐步下沉到插件或更底层库来解决复杂需求。

3. 快速开始:create-tauri-app 一键起项目

Tauri 推荐用 create-tauri-app 来创建项目。最简单的方式之一是直接执行脚本(Bash):

sh <(curl https://create.tauri.app/sh)

创建完成后,你应该马上去看两块内容:

  • Prerequisites(前置依赖):不同平台需要不同依赖(例如 macOS 的 Xcode、Windows 的构建工具链等)
  • Project Structure(项目结构):搞清楚哪些是前端目录、哪些是 Tauri/Rust 侧目录、配置文件分别控制什么

如果你想快速对照学习,也可以参考官方示例仓库的项目结构与特性组合(例如 tauri、plugins-workspace 等示例集合)。

4. 核心工作方式:前端渲染 + 后端命令

Tauri 的开发体验通常长这样:

  1. 前端负责页面与交互
  2. 需要系统能力(文件、系统信息、加密、数据库、通知、窗口控制等)时
  3. 前端通过 invoke 调用 Rust 侧命令(command)
  4. Rust 执行并返回结果给前端渲染

一个“最小心智模型”示例:

前端(JavaScript)调用:

import { invoke } from "@tauri-apps/api/core";

const res = await invoke("greet", { name: "Tauri" });
console.log(res);

后端(Rust)提供命令:

#[tauri::command]
fn greet(name: String) -> String {
  format!("Hello, {}!", name)
}

你可以把它理解为:前端发起 RPC,Rust 侧提供受控的能力接口。这也是 Tauri 安全模型常见的落点:尽量减少命令数量、缩小参数面、做严格校验。

5. 插件体系:把“常用系统能力”模块化

真实项目里,你不可能所有能力都自己从零写。Tauri 维护了一组官方插件,同时社区也提供了大量插件可选。插件的价值在于:

  • 把常见能力(如文件系统、对话框、通知、系统托盘等)标准化
  • 降低跨平台差异处理成本
  • 提供 Swift / Kotlin 绑定,让同一能力在移动端更自然地调用

选型建议(很实用):

  • 能用官方插件优先官方
  • 社区插件重点看:维护频率、issue 响应速度、最近版本发布时间、平台覆盖情况
  • 企业场景建议做一次“插件清单 + 权限与风险评估”,尤其是涉及敏感权限时

6. 什么时候 Tauri 特别合适

如果你符合下面任意一条,Tauri 通常会是很舒服的选择:

  • 想用 Web 技术做 UI,但不想承受“应用包巨大”的成本
  • 对安全与稳定性有要求,希望底座更可审计、更可控
  • 应用需要调用大量系统能力,但希望接口边界清晰
  • 需要跨平台,同时希望后端逻辑更接近系统、性能更好

反过来,如果你的应用强依赖某个特定浏览器内核特性,或者你希望所有用户环境完全一致(不受系统 WebView 差异影响),那你需要额外评估系统 WebView 的兼容边界与测试策略。

7. 总结:Tauri 的“设计哲学”

Tauri 的哲学其实很清楚:

  • UI 用 Web:开发效率高、生态成熟
  • 渲染用系统 WebView:体积小、分发轻
  • 能力层用 Rust/原生:更安全、更稳定、更可控
  • 通过插件与底层库(TAO/WRY)提供从“快速交付”到“深度定制”的梯度

如果你准备开始上手,建议路径是:

  1. 用 create-tauri-app 起项目
  2. 把核心 UI 跑起来
  3. 把系统能力用 invoke 串起来
  4. 再引入必要插件,逐步打磨工程结构与安全边界