惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
V
Visual Studio Blog
G
Google Developers Blog
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
C
Check Point Blog
D
Docker
M
MIT News - Artificial intelligence
P
Proofpoint News Feed
博客园 - 叶小钗
博客园 - 聂微东
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
Engineering at Meta
Engineering at Meta
腾讯CDC
S
SegmentFault 最新的问题
博客园 - 【当耐特】

钟意博客

国家统计局数据查询 MCP 照见·硅·肆 涌现之前 照见·硅·叁 换行重启 照见·硅·贰 钢筋水泥 照见·硅·壹 你好世界 照见·硅·零 序言 大语言模型的不确定性 科艺知识库 ARM64 胶东半岛观察 海光 K100 DCU VLLM 推理环境构建 博客多平台负载均衡方案 浅谈RAG Spring WebSocket 错误 SpringBoot WebSocket 代理模式、客户端模式 Spring AOP 调用自身失效 window 端口占用但是查不到 Coze同插件不同工具之间代码复用 Pachelbel's Greatest Hit: The Ultimate Canon - 纪念帕海贝尔:终极卡农 圣诞快乐,劳伦斯先生 Merry Christmas Mr. Lawrence
Web技术构建桌面应用方案
钟意 · 2025-06-08 · via 钟意博客

桌面应用方案

从Electron、Tauri、Flutter、pkg四个方案比较,打包复杂度中小web项目为例(vue构建结果10MB左右)

下表列出 Electron、Tauri、Flutter、pkg 四种方案在关键变量下的特性对比:

抉择变量 Electron Tauri Flutter pkg
支持平台 Windows/macOS/Linux (跨平台) Windows/macOS/Linux (跨平台) Windows/macOS/Linux(跨平台) Windows/macOS/Linux(依赖Node)
启动速度 较慢(典型示例约4秒) 较快(示例约2秒) 一般(取决于硬件,Dart AOT编译) 较快(纯Node环境,无浏览器启动开销)
内存占用 较高(空闲时约100MB+) 较低(空闲时约80MB) 低(简单应用约25MB) 较低(无UI时几十MB,不含浏览器进程)
CPU负载 较高(多进程架构、Chromium开销) 较低(Rust后端+系统WebView) 低(编译为原生码、使用GPU加速) 低(单进程Node,轻量运行)
打包体积 较大(包含Chromium+Node,例如示例约244MB) 很小(示例约8.6MB) 中等(包含Flutter引擎,通常几十MB) 中等(包含Node运行时,几十MB)
内置运行时 内置 Chromium 和 Node.js 不内置Node.js,使用系统 WebView 引擎 内置 Dart VM(编译为本地二进制) 内置 Node.js 运行时
运行环境依赖 无需额外环境(Chromium已打包) 需要目标系统提供对应 WebView(Win: WebView2;Linux/Mac: WebKit) 需要目标系统对应的图形库和编译环境 无需预装Node.js(运行时已包含在可执行文件中)
构建资源需求 中等(需要安装Node依赖,下载Electron二进制) 较高(需要安装Rust工具链,首次编译耗时较长) 较高(需安装Flutter SDK及桌面支持工具) 较低(仅需Node环境和pkg工具)
前端兼容性 完全支持任意Web前端(Vue、React等) 完全支持任意Web前端(Vue、React等) 不使用HTML/JS,仅支持Flutter/Dart组件 无原生前端,仅打包Node后台逻辑,不自带GUI
原生功能集成 丰富的Electron API(窗口、托盘、通知等)+Node插件支持 提供Rust后端API和插件(窗口、文件系统、托盘等,需显式暴露) 通过插件或平台通道访问原生(文件系统、窗口管理、托盘可用第三方库) 受限于Node能力,可调用系统命令或Node模块,通常用于CLI或后台逻辑
安全性 中等(默认开启Node集成会增大风险;需严格启用Context Isolation等安全策略) 高(默认安全模型严格,需要显式暴露API;Rust内存安全) 良好(编译为原生,可执行文件难以反编译,但需自行管理应用权限) 中等(打包后源代码不可见,有一定保护;无内置更新机制)
适用场景 适合快速开发的跨平台富GUI应用,如桌面客户端工具、大型桌面应用 适合对包体积和性能敏感的桌面应用,如小型工具、系统实用程序、高安全性需求的应用 适合需要高性能UI和动画交互的应用,如游戏、多媒体应用或跨移动+桌面项目 适合命令行工具或后台常驻程序,如自动化脚本、本地服务器等(不依赖图形界面)

注:
上表中的性能数据和包体积等来自 公开基准测试

简要分析

Electron

Electron 基于 Chromium 及 Node.js 运行时,支持 Windows、macOS、Linux 三大平台。它将 Web 应用封装为桌面应用,对于习惯 Web 开发的程序员来说,上手简单,功能强大。
性能方面:启动时间通常在几秒左右,内存与 CPU 消耗较高——Windows 下测试显示空闲状态约消耗 120 MB 内存。
包体积方面:整合 Chromium 和 Node,使得最终体积通常为几百 MB。
依赖方式:打包时已将所有运行时一并内置,终端用户无需额外配置。
前端兼容性:可任意使用 Vue、React 等现代框架。
原生接口:提供如窗口控制、系统托盘、文件访问、通知等丰富 API,并可直接使用 Node 模块。
安全性:默认允许主进程完全访问 Node,会带来潜在风险——推荐启用 contextIsolation、预加载脚本等安全策略。
更新机制:常见方案为 electron-updater 与 GitHub Releases 的结合,实现自动更新。

总结:生态成熟、开发快速,适合需要大量 Web 交互、复杂界面的大型应用,但在包体体积和运行效率上存在较大代价。

Tauri

Tauri 后端采用 Rust,界面部分使用操作系统自带的 WebView(例如 Win 的 WebView2,Linux/macOS 的 WebKit),实现了小巧和高效的目标。
性能方面:启动速度快,实测约 2 秒;Windows 空闲内存约 80 MB,多窗口下整体占用约 170 MB。
包体积方面:经测试仅约 8.6 MiB。
依赖方式:最终需要系统中预装相应 WebView 运行时。
开发成本:需要安装 Rust 工具链,首次编译时间较长,但后续增量编译迅速。
兼容性:支持 Vue、React 等任意 Web 技术。
原生接口:提供可控的 Rust 插件体系,默认不开放危险 API,提高安全性。
安全性:默认启用 CSP 和权限许可机制,攻击面极小。
更新机制:可内置轻量自更新模块,结合 JSON、HTTP 等方案完成。

总结:安全、高效、体积极小,适合轻量型或系统级工具,但对 Rust 生态掌握有所要求,社区相对年轻。

Flutter

Flutter 使用 Dart 编写,通过自带的 Skia 渲染引擎生成原生界面。桌面支持 Windows、macOS、Linux。
性能方面:编译为本地执行码,UI 流畅,GPU 加速友好。Linux 测试显示,轻量应用占用约 25 MB 内存、50 MB 磁盘,比 Electron 更轻量。
包体积方面:需打包 Flutter 引擎,“Hello World” 即超过 50 MB。
依赖方式:需要目标平台对应的 Flutter 运行库及工具链支持。
开发成本:需安装 Flutter SDK 和桌面构建插件,环境搭建稍重。
兼容性:不得使用 JS 框架,必须采用 Dart + Flutter。
原生接口:通过 plugin 或 platform channels,可调系统功能。
安全性:源码被编译,逆向相对困难;但需自行实现更新机制。

总结:适合 UI 复杂、动画丰富、还需移动+iOS支持的项目,不建议用于简单工具或仅 Web 前端项目。

pkg

pkg 将 Node.js 应用打包为可执行文件的工具,支持 Windows/macOS/Linux。
性能方面:性能接近原生 Node.js,启动迅速。
包体积方面:包含 Node 运行时,体积几十至一百多 MB,介于脚本与 Electron 之间。
依赖方式:无需用户预装 Node 环境。
开发成本:仅需 Node/npm 环境,配置简单。
兼容性:不支持 GUI,适用于 CLI 或后台业务。
功能支持:可调用任意 Node 模块与系统命令,适合自动化、脚本工具。
安全性:源码被打包,具基本保护,但无自动更新机制。

总结:最适合命令行工具、本地后台服务等无需前端的项目,不支持桌面 GUI。

基于项目类型推荐

  • Electron:适合需要快速开发、依赖丰富Web生态的大型跨平台桌面应用(如聊天客户端、IDE、管理工具等)。对于开发者熟悉Web栈的项目,Electron可实现复杂功能,但会带来较大包体和运行时开销。
  • Tauri:适合对应用体积、安全和性能敏感的场景,如系统实用工具、轻量级编辑器或企业级安全应用。Tauri 能制作极小的可执行文件,运行内存低,并内建安全策略。
  • Flutter:适合对UI/动画要求高的应用,如图形化界面、游戏、多媒体工具或需要同时覆盖移动和桌面的项目。Flutter 的原生性能强劲,但包体较大,且开发需使用 Dart 生态。
  • pkg:适合纯后端或命令行型工具(无需GUI),例如自动化脚本、CLI工具和后台服务。它可以打包Node应用为独立可执行文件,方便分发和部署。

除非真的只打包基于node的工具类,不轻易推荐 pkg. 非特定Dart编写, 即正常web项目推荐rust驱动的tauri打包构建. 亲身经验在占用和丝滑度来说尚佳!

构建参考

贴几个参考,然后再补构建参考教程嘞,又是拖更的一天