用前端技术写桌面应用在过去十年经历了三次明显的迭代:从 Electron 一家独大,到 Flutter 带着自绘引擎入场,再到 Tauri 用系统 WebView 和 Rust 后端打开新局面。每套方案在包体积、性能、语言生态和平台能力上的取舍完全不同。
本文梳理目前主流的选择,重点关注它们能做什么、用什么语言、适合什么场景。
1. Electron
1.1 架构
Electron = Chromium 渲染进程 + Node.js 主进程。每个 Electron 应用捆绑一份完整的 Chromium 和 Node.js 运行时。
1 2 3 4 5 6 7 8 9 10 11
| ┌──────────────────────────────────────────────────┐ │ Electron App │ │ ┌──────────────┐ ┌────────────────────┐ │ │ │ Main Process │←─IPC─→│ Renderer Process │ │ │ │ (Node.js) │ │ (Chromium) │ │ │ │ 文件系统 │ │ HTML / CSS / JS │ │ │ │ 原生菜单 │ │ React / Vue 等 │ │ │ │ 系统托盘 │ │ DevTools │ │ │ └──────────────┘ └────────────────────┘ │ │ Chromium runtime (≈150MB) │ └──────────────────────────────────────────────────┘
|
1.2 主要技术语言
- 前端:HTML + CSS + JavaScript/TypeScript,任意前端框架(React、Vue、Svelte 等)
- 后端(主进程):Node.js (JS/TS),通过 IPC 与前端通信
- 原生模块:C++(通过 Node.js Native Addon)
1.3 能做什么
- 文件系统读写、本地数据库(SQLite、LevelDB)
- 系统托盘、原生菜单、通知
- 子进程管理、Shell 调用
- 硬件访问(USB、串口,通过原生模块)
- 自动更新机制(electron-updater)
- 系统级快捷键、全局事件
1.4 典型场景
| 场景 |
代表应用 |
| IDE / 编辑器 |
VS Code、Atom |
| 通讯工具 |
Slack、Discord、Teams |
| 数据库管理 |
TablePlus、Postico |
| 设计工具 |
Figma(早期桌面版)、Excalidraw 桌面版 |
| 开发工具 |
GitKraken、Insomnia、Postman |
1.5 优缺点
| 优点 |
缺点 |
| 生态最成熟,社区资源最多 |
包体积巨大(基础 ~150MB) |
| 调试方便(Chrome DevTools) |
内存占用高 |
| 原生能力覆盖全面 |
每个应用捆绑独立 Chromium,磁盘浪费 |
| 任意前端框架都能用 |
性能受限于 Chromium 渲染模型 |
2. Tauri
2.1 架构
Tauri = 系统 WebView(不捆绑浏览器) + Rust 后端。前端代码由操作系统的原生 WebView 渲染(Windows 上为 WebView2,macOS 上为 WKWebView,Linux 上为 WebKitGTK)。
1 2 3 4 5 6 7 8 9 10 11
| ┌──────────────────────────────────────────────────┐ │ Tauri App │ │ ┌──────────────┐ ┌────────────────────┐ │ │ │ Rust Core │←─IPC──→│ System WebView │ │ │ │ tauri crate │ │ (系统自带) │ │ │ │ 文件系统 │ │ HTML / CSS / JS │ │ │ │ 进程调用 │ │ 前端框架 │ │ │ │ 系统 API │ │ │ │ │ └──────────────┘ └────────────────────┘ │ │ ≈ 3–8 MB(不含前端资源) │ └──────────────────────────────────────────────────┘
|
2.2 主要技术语言
- 前端:HTML + CSS + JS/TS,任意前端框架(React、Vue、Svelte、Solid 等)
- 后端:Rust,通过
#[tauri::command] 暴露给前端调用
- 插件系统:Rust + 前端绑定
2.3 能做什么
- 文件系统读写、路径选择对话框
- Shell 命令执行
- 系统托盘、原生菜单、通知
- 全局快捷键
- 窗口管理(多窗口、无边框、透明窗口)
- 自动更新(v2 内置)
- 通过 Sidecar 分发原生二进制程序
- 插件生态:SQLite、Store(本地键值存储)、Shell、FS、Dialog 等(v2 的官方插件)
2.4 典型场景
| 场景 |
说明 |
| 工具类应用 |
计算器、笔记、配置工具 |
| 开发者工具 |
命令行 GUI 封装、日志查看器 |
| 轻量级桌面客户端 |
Web 应用的桌面封装 |
| 系统工具 |
文件管理器、监控面板 |
| 需要 Rust 性能的场景 |
音视频处理、数据计算前端 |
2.5 优缺点
| 优点 |
缺点 |
| 包体积极小(基础 ~3–8 MB) |
系统 WebView 版本依赖用户操作系统 |
| 内存占用低 |
跨平台一致性不如 Chromium 捆绑方案 |
| 启动速度快 |
Rust 学习曲线比 JS/TS 陡 |
| Rust 后端性能强、安全性好 |
插件生态不如 Electron 成熟 |
| 前端开发体验几乎不变 |
部分 Chrome 特性可能不可用(取决于系统 WebView) |
Tauri v2(2024 年稳定版)引入了插件体系、移动端支持(iOS/Android)、多 WebView 窗口等能力,不再只是”桌面端 Electron 替代品”,而是向跨平台运行时方向演进。
3. Flutter Desktop
3.1 架构
Flutter = 自绘渲染引擎(Impeller / Skia) + Dart 运行时。不依赖系统 WebView,也不捆绑 Chromium,所有 UI 都由自己的引擎绘制。桌面端通过 Flutter Window(Windows/macOS/Linux)运行时承载。
1 2 3 4 5 6 7 8 9 10 11
| ┌──────────────────────────────────────────────────┐ │ Flutter App │ │ ┌──────────────┐ ┌────────────────────┐ │ │ │ Dart 业务层 │ │ Flutter Engine │ │ │ │ Widget 树 │ │ Impeller / Skia │ │ │ │ State Mgmt │ │ 自绘渲染 │ │ │ │ 平台通道 │←─FFI──│ 字体 / 布局 │ │ │ └──────────────┘ │ 平台适配层 │ │ │ └────────────────────┘ │ │ ≈ 15–30 MB(不含 Dart 业务代码) │ └──────────────────────────────────────────────────┘
|
3.2 主要技术语言
- UI 与逻辑:Dart,响应式编程模型
- 原生插件:Dart FFI → C/C++/Kotlin/Swift
- 渲染:Skia(旧版)或 Impeller(新版)
3.3 能做什么
- 完整的自定义 UI 渲染(不像 WebView 方案受浏览器限制)
- 动画系统(声明式 + 物理模拟)
- 原生平台能力(通过 Platform Channel 调用)
- 桌面端窗口管理、菜单、托盘
- 与移动端 Flutter 共享大量代码(UI + 业务逻辑)
- 游戏化界面、图表、实时渲染
3.4 典型场景
| 场景 |
说明 |
| 需要自定义 UI 的应用 |
设计工具、播放器界面 |
| 移动端已有 Flutter 应用 |
复用代码扩展到桌面 |
| 嵌入式/工控屏 |
不需要 OS 原生感的场景 |
| 需要像素级控制的场景 |
数据可视化、实时仪表盘 |
3.5 优缺点
| 优点 |
缺点 |
| 跨平台一致性高(自绘引擎) |
桌面端生态仍在成长,三方库不如 Electron 丰富 |
| 移动端 + 桌面端代码复用 |
操作系统原生控件集成不自然 |
| 动画性能优秀 |
Dart 语言生态相对 JS/TS 小 |
| 包体积小于 Electron |
中文文档和社区规模较小 |
| 布局系统强大(声明式 Widget) |
桌面端输入法/无障碍支持不如原生 |
4. React Native for Desktop(React Native Windows + macOS)
4.1 架构
RN Desktop = JavaScript 逻辑 + 原生 UI 组件。通过 React Native 的桥接层,将 JS 中的 UI 声明映射到操作系统的原生控件。
1 2 3 4 5 6 7 8 9
| ┌──────────────────────────────────────────────────┐ │ RN Desktop App │ │ ┌──────────────┐ ┌────────────────────┐ │ │ │ JS Runtime │←─Bridge→│ Native UI Layer │ │ │ │ (Hermes/V8) │ │ 原生窗口控件 │ │ │ │ React 组件 │ │ WinUI / AppKit │ │ │ │ 业务逻辑 │ │ │ │ │ └──────────────┘ └────────────────────┘ │ └──────────────────────────────────────────────────┘
|
4.2 主要技术语言
- UI 与逻辑:JavaScript/TypeScript + React
- 原生模块:C++/C#(Windows)、Swift/ObjC(macOS)
4.3 适用场景
- 已有 RN 移动端应用,需要扩展到桌面端
- 希望保留原生控件体验的场景
- 微软 .NET 生态内的 RN 开发(Windows 上集成 WinUI 3)
4.4 优缺点
| 优点 |
缺点 |
| 代码复用度高(移动端 → 桌面端) |
桌面端社区和文档远小于 Electron |
| 原生 UI 外观 |
配置复杂,构建环境要求高 |
| 与微软生态集成好 |
跨平台适配仍需额外工作 |
5. 综合对比
5.1 核心技术维度
| 维度 |
Electron |
Tauri |
Flutter Desktop |
RN Desktop |
| 前端语言 |
JS/TS |
JS/TS |
Dart |
JS/TS |
| 后端语言 |
Node.js (JS) |
Rust |
Dart |
JS (Bridge) |
| 渲染引擎 |
Chromium |
系统 WebView |
Skia/Impeller |
原生控件 |
| 包体积(最小) |
~150 MB |
~3–8 MB |
~15–30 MB |
~20–40 MB |
| 内存(典型) |
200–500 MB |
50–150 MB |
80–200 MB |
100–250 MB |
| 启动时间 |
慢(~1–3s) |
快(~0.3–1s) |
中(~0.5–1.5s) |
中(~0.5–1.5s) |
5.2 平台支持
| 平台 |
Electron |
Tauri |
Flutter |
RN Desktop |
| Windows |
✅ |
✅ |
✅ |
✅ |
| macOS |
✅ |
✅ |
✅ |
✅ |
| Linux |
✅ |
✅ |
✅ |
✅(社区) |
| iOS |
❌ |
✅(v2) |
✅ |
✅ |
| Android |
❌ |
✅(v2) |
✅ |
✅ |
| Web |
❌(Electron 本身) |
❌ |
✅ |
❌ |
5.3 场景匹配速查
| 你的需求 |
推荐方案 |
| 快速交付、生态成熟 |
Electron |
| 小体积、低内存、性能敏感 |
Tauri |
| 已有 Rust 后端 / 需要 Rust 性能 |
Tauri |
| 移动端也要,全套自绘 UI |
Flutter |
| 已有移动端 RN 应用,扩展到桌面 |
RN Desktop |
| 需要完全自定义 UI(游戏仪表盘、播放器) |
Flutter 或 Tauri |
| 需要原生控件外观 |
RN Desktop 或 Tauri(系统 WebView) |
6. 其他值得一提的方案
NW.js
Electron 的前辈(2012 年出现,比 Electron 早一年)。架构与 Electron 类似,但直接将 Node.js 注入到页面上下文。如今市场份额已被 Electron 大幅挤压,但在需要直接调用 Node API 的前端代码这一特定场景仍有优势。
.NET MAUI / WPF
C# 技术栈,Windows 上最成熟的桌面方案。MAUI(2022 年)是 Xamarin.Forms 的继任者,支持 Windows + macOS + iOS + Android。适合 C#/.NET 生态内团队,但社区和第三方组件不如前端生态活跃。
Qt (QML)
老牌 C++ 跨平台框架。QML(Qt Meta-Object Language)允许用声明式语法写 UI,逻辑用 C++ 或 JS。适合工业软件、嵌入式、音视频工具。不算是”前端”技术栈,但功能最全面。
7. 总结
1 2 3 4 5
| 包体积:Electron(150MB) ≫ Flutter(30MB) > RN(25MB) > Tauri(5MB) Web 生态复用:Electron = Tauri > RN > Flutter 自绘能力:Flutter > Electron > Tauri > RN 新手友好度:Electron > Tauri > Flutter > RN 性能(启动+内存):Tauri > Flutter > RN > Electron
|
当前趋势:
- Electron 仍然是”什么都能做”的默认选项,但体积和内存的代价越来越难以被忽视
- Tauri 在 2024–2026 年发展迅速,v2 的插件体系和移动端支持让它从”Electron 替代品”变为独立的跨平台方案
- Flutter Desktop 在需要深度自定义 UI 和移动端复用的场景有独特优势,但桌面生态仍需时间完善
- 如果现在是选型节点:优先考虑 Tauri(体积/性能优势)或 Flutter(自绘 UI/跨平台一致性),Electron 保留在”快速启动 + 生态成熟度是最高优先级”的场景
参考资料