Electron 的问题
Electron 自 2013 年诞生以来,让 Web 开发者能够轻松构建桌面应用。但随着时间推移,它的几个固有缺陷日益突出:
体积臃肿
每个 Electron 应用都打包了完整的 Chromium 浏览器内核(约 150MB)和 Node.js 运行时。一个简单的"Hello World"应用安装包超过 50MB,实际应用动辄 200MB 以上。
内存占用高
Chromium 多进程架构使每个 Electron 应用启动时就占用 100-300MB 内存。同时打开 VS Code、Slack、Discord 等 Electron 应用,内存消耗可达数 GB。
安全模型薄弱
早期 Electron 应用 Node.js 直接注入 WebView,前端代码可调用任意 Node.js API,XSS 漏洞即可导致整个系统被攻陷。
启动慢
冷启动需要初始化完整的 Chromium 渲染引擎,在低端机器上等待 3-5 秒很常见。
更新困难
Chromium 版本固化在应用内,安全补丁需要整个应用重新发布,无法利用用户系统自带的浏览器安全更新。
Tauri 的解决方案
Tauri 由 Daniel Thompson-Yvetot 和 Lucas Nogueira 于 2019 年发起,核心理念是:用系统原生 WebView 替代内嵌 Chromium,用 Rust 替代 Node.js 作为后端。
┌─────────────────────────────────────────┐
│ Tauri 应用进程模型 │
│ │
│ ┌─────────────────┐ IPC Bridge │
│ │ 前端(Web) │ ←──────────────→ │
│ │ React/Vue/等 │ │
│ │ │ Commands │
│ │ 系统 WebView │ Events │
│ │ WKWebView(Mac) │ │
│ │ WebView2(Win) │ ┌──────────────┐ │
│ │ GTK WebKit(Li) │ │ Rust 核心 │ │
│ └─────────────────┘ │ 系统 API │ │
│ │ 文件/网络等 │ │
│ └──────────────┘ │
└─────────────────────────────────────────┘
WebView 跨平台差异
macOS / iOS
WKWebView(WebKit 引擎)。Apple 平台内置,性能优秀,支持最新 Web 标准。Safari 技术预览版通常领先 Chrome 实现新 API。
Windows
WebView2(基于 Chromium 的 Edge 引擎)。Windows 10/11 系统自带,与最新 Chrome 兼容性极好。Windows 7/8 需要单独安装 WebView2 Runtime。
Linux
WebKitGTK(WebKit 引擎的 GTK 绑定)。各发行版版本差异较大,需注意 CSS/JS 兼容性,通常比 macOS WebKit 落后一些。
Android
Android 系统的 WebView(基于 Chromium)。Tauri 2.0 新增支持,通过 Capacitor 风格的 Android 项目结构实现。
WebView 兼容性注意
由于不同平台 WebView 版本不同,某些较新的 CSS 特性(如 container queries、:has())或 JavaScript API 在 Linux/旧版 Windows 上可能不可用。建议在目标平台上充分测试,或使用 polyfill。
Tauri vs 竞品对比
| 特性 | Tauri 2.0 | Electron | Wails v2 | NW.js |
|---|---|---|---|---|
| 后端语言 | Rust | Node.js | Go | Node.js |
| WebView | 系统原生 | 内嵌 Chromium | 系统原生 | 内嵌 Chromium |
| 安装包大小 | ~3-10 MB | ~150-300 MB | ~5-15 MB | ~100-200 MB |
| 内存占用 | 低(~30MB) | 高(~100MB+) | 低(~40MB) | 高(~100MB+) |
| 移动端支持 | iOS + Android | 无 | 无 | 无 |
| 安全模型 | Capability-based | Node.js 集成 | 绑定模型 | Node.js 集成 |
| 前端框架 | 任意 | 任意 | 任意 | 任意 |
| 生态成熟度 | 成长中 | 非常成熟 | 成长中 | 成熟 |
Tauri 1.x vs 2.0 的变化
移动端目标
2.0 最重要的新特性——支持编译为 iOS 和 Android 应用,一套代码覆盖桌面和移动端。
Capability 权限系统
全新的基于能力的权限模型,替代 1.x 的 allowlist 配置。更细粒度的 API 访问控制,每个窗口和插件独立配置权限。
插件系统重构
核心 API 拆分为独立插件(plugin-fs、plugin-http、plugin-notification 等),按需引入,减小打包体积。
多窗口改进
新的 WebviewWindow API 更直观,支持窗口间通信,父子窗口关系管理更清晰。
Swift/Kotlin 插件
移动端插件支持 Swift(iOS)和 Kotlin(Android)原生代码,可调用平台专属 API。
安全模型:Capability-based
Tauri 2.0 采用基于能力(Capability)的安全模型,默认情况下前端代码无法访问任何系统 API,必须在配置中显式声明权限:
// src-tauri/capabilities/default.json
{
"identifier": "default",
"description": "Default capabilities for the main window",
"windows": ["main"],
"permissions": [
"core:default",
"fs:allow-read-text-file",
"fs:allow-write-text-file",
"dialog:allow-open",
"dialog:allow-save"
]
}
最小权限原则
只授予应用实际需要的权限。每个权限都有对应的文档说明其作用范围。比如 fs:allow-read-text-file 只允许读取文本文件,不能读取二进制文件,也不能写入——这种细粒度控制是 Tauri 相比 Electron 的重要安全优势。
环境安装
系统依赖
# macOS(安装 Xcode Command Line Tools)
xcode-select --install
# Ubuntu/Debian
sudo apt update && sudo apt install -y \
libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libxdo-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev
# Windows:安装 Visual Studio Build Tools(含 C++ 工作负载)
# 从 https://visualstudio.microsoft.com/downloads/ 下载
安装 Rust
# 安装 rustup(Rust 工具链管理器)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
# 验证安装
rustc --version # rustc 1.82.0 或更高
cargo --version # cargo 1.82.0 或更高
安装 Node.js 与 Tauri CLI
# 推荐使用 fnm 管理 Node.js 版本
curl -fsSL https://fnm.vercel.app/install | bash
fnm install --lts
fnm use lts-latest
# 安装 Tauri CLI(npm 方式,推荐)
npm install -g @tauri-apps/cli@latest
# 验证
tauri --version # tauri-cli 2.x.x
# 也可以用 cargo 安装(纯 Rust 方式)
cargo install tauri-cli --version "^2"
移动端额外依赖(可选)
# iOS 开发(仅 macOS)
# 需要 Xcode 14+ 和 iOS 模拟器
rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim
# Android 开发
# 需要 Android Studio + NDK
rustup target add \
aarch64-linux-android \
armv7-linux-androideabi \
i686-linux-android \
x86_64-linux-android
# 设置 ANDROID_HOME 和 NDK_HOME 环境变量
export ANDROID_HOME="$HOME/Android/Sdk"
export NDK_HOME="$ANDROID_HOME/ndk/$(ls -1 $ANDROID_HOME/ndk | tail -n1)"
推荐使用 Tauri 官方 prerequisites 检查工具
运行 cargo tauri info(在项目目录内)可以自动检查所有依赖是否正确安装,并列出当前系统信息、Rust 版本、前端构建工具版本等诊断信息,是排查环境问题的首选工具。
Tauri 架构深度解析
Tauri 2.0 架构图
┌─────────────────────────────────────────────────────────┐
│ Tauri 应用进程 │
│ │
│ ┌──────────────────────────────┐ │
│ │ WebView(系统内置) │ │
│ │ ┌────────────────────────┐ │ │
│ │ │ 前端代码(React/Vue) │ │ │
│ │ │ HTML + CSS + JS │ │ │
│ │ └────────────────────────┘ │ │
│ │ ↕ IPC(invoke/emit) │ │
│ └──────────────────────────────┘ │
│ ↕ │
│ ┌──────────────────────────────┐ │
│ │ Rust Core(后端) │ │
│ │ ┌────────────┐ ┌─────────┐ │ │
│ │ │ Commands │ │ Plugins │ │ │
│ │ │ (invoke) │ │ (fs/http│ │ │
│ │ └────────────┘ └─────────┘ │ │
│ │ ↕ 直接调用系统 API │ │
│ └──────────────────────────────┘ │
│ ↕ │
│ ┌──────────────────────────────┐ │
│ │ 操作系统(Windows/macOS/Linux)│ │
│ │ 文件系统 / 网络 / 通知 / etc. │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
WebView 引擎对比
WKWebView(macOS/iOS)
Apple 的 WebKit 引擎,随 macOS/iOS 系统预装。性能优秀,Safari 渲染引擎。不支持某些 Chrome 专有特性(如 SharedArrayBuffer 在某些配置下)。
WebView2(Windows)
Microsoft 基于 Chromium 的 WebView 引擎,自 Windows 10 21H1 起系统预装。渲染效果与 Chrome 基本一致。Tauri 检测到未安装时会提示用户安装。
WebKitGTK(Linux)
GTK 版本的 WebKit,在各 Linux 发行版上版本差异较大。是 Tauri 在 Linux 下 WebView 差异最明显的平台,需要用户安装 webkit2gtk 包。
跨平台兼容性注意事项
- CSS 渲染差异:WebKit(macOS)和 Chromium(Windows)在某些 CSS 属性上行为不同,需要在所有目标平台测试。
- Web API 支持:某些实验性 API 在 WKWebView 上不支持(或需要特定 macOS 版本)。使用前检查 MDN 的兼容性表格。
- 字体渲染:三个平台的默认字体栈不同,显式设置 font-family 以保证一致性。
本章小结
本章核心要点
- Tauri 的核心优势:使用系统 WebView(无需打包 Chromium),应用体积小 10-20 倍;Rust 后端内存安全、性能接近原生;Capability 权限模型比 Electron 更安全。
- 架构三层:WebView(前端 UI)→ IPC 层(invoke/emit)→ Rust Core(系统 API 访问);前端无法直接访问系统,必须通过 Rust 中间层,安全边界清晰。
- 跨平台 WebView 差异:macOS 用 WKWebView(Safari 内核),Windows 用 WebView2(Chromium),Linux 用 WebKitGTK;需要在所有平台测试 UI。
- Tauri 2.0 新特性:移动端支持(iOS/Android)、细粒度 Capability 权限、插件系统重构(按需引入)、Swift/Kotlin 插件扩展。
- 环境要求:Rust 1.82+、各平台系统依赖(Xcode/MSVC/webkit2gtk);
cargo tauri info检查环境是否完整。