与其他工具的比较
deno desktop 将随 Deno v2.9.0 发布,目前仍未进入稳定版本。要立即试用,
请运行 deno upgrade canary 来安装
canary 构建版本。该命令、配置键以及
TypeScript API 在该功能稳定之前仍可能发生变化。
deno desktop 是使用 Web 技术发布桌面应用的几种方式之一。下面是它与其他替代方案的对比。
一览 Jump to heading
| Electron | Electrobun | Tauri | Dioxus | deno desktop |
|
|---|---|---|---|---|---|
| 语言 | JS/TS (Node.js) | JS/TS (Bun) | Rust + Web 前端 | Rust | JS/TS (Deno) |
| Web 引擎 | 内置 Chromium | 系统 WebView | 系统 WebView | 系统 WebView | 内置 CEF 或 WebView |
| 一致的渲染 | 是 | 否 | 否 | 否 | 是(CEF) |
| 进程模型 | 多进程 | 多进程 | 多进程 | 单进程 | 多线程(CEF)/ 进程组(WebView) |
| 后端 ↔ UI | IPC | IPC | IPC | 原生 Rust | 进程内通道 |
| 应用体积 | ~100 MB+ | ~14 MB | ~2–10 MB | ~5 MB | ~40 MB / ~150 MB(CEF) |
| npm / Node 兼容性 | 是 | 是 | 否 | 否 | 是 |
| 框架自动检测 | 否 | 否 | 否 | 否 | 是 |
| HMR | 否 | 是 | 是(基于 Vite) | 是(dx serve) |
是 |
| 内置自动更新 | 完整二进制 | bsdiff | 插件 | 无 | bsdiff |
| 内置安装器 | 是 | 否 | 是 | 否 | 部分支持(DMG,AppImage) |
| 交叉编译 | 是(electron-builder) | 否(仅 macOS) | 否(需要目标 OS) | 否 | 是(--target) |
| macOS / Windows / Linux | 三者都支持 | 仅 macOS | 三者都支持 | 三者都支持 | 三者都支持 |
| iOS / Android | 否 | 否 | 是 | 是 | 尚未支持 |
deno desktop 的优势 Jump to heading
零配置框架支持。 在 Next.js、Astro 或 Fresh 项目上运行 deno desktop . 无需适配器也无需配置:生产服务器以 release 模式运行,开发服务器则在 --hmr 下运行。其他工具都没有在这个层级上自动检测框架。
可从一台机器交叉编译。 与 deno compile --target 类似。Tauri 和 Dioxus 需要在本地具备目标平台才能构建(它们的工具链包含 Rust,而 Rust 必须针对目标平台编译)。Electrobun 仅在 macOS 上发布。Electron 通过 electron-builder 支持跨平台构建,但每个目标平台都需要 Node 和平台特定的签名工具。
完整的 Node 兼容性,并且可选择后端。 Electron 同时捆绑了 Chromium 和 Node,但体积非常大。Tauri 和 Dioxus 体积小,但没有 JS 生态。deno desktop 默认使用操作系统的 webview(体积小,类似 Tauri),同时仍通过 Deno 提供完整的 Node 兼容层,包括处理器中的 npm: 导入和 bindings,并且在你需要一致渲染时还能打包 Chromium(CEF)。
进程内绑定,而不是 IPC。 Electron / Electrobun / Tauri 都在后端与 UI 之间使用基于 socket 的 IPC。调用会被序列化、跨越进程边界,然后再反序列化。deno desktop 将 Deno 运行时和渲染后端运行在同一进程内,通过进程内通道通信。值在调用过程中仍会被编码为 JSON,但不存在跨进程往返。
内置基于二进制差分的自动更新。 Electron 提供完整二进制。Tauri 的更新插件下载完整构建。Electrobun 和 deno desktop 都使用 bsdiff 补丁,但 deno desktop 将更新流程与运行时集成:无需单独的更新器二进制、自动回滚、清单轮询全部整合到一个 API 中。
其他工具的优势 Jump to heading
Electron:生态。 多年的工具、打包和签名体系。几乎所有主流编辑器和聊天应用都在使用它。如果你需要成熟的插件生态(Spectron、electron-builder、autoUpdater 抽象),Electron 已经具备。
Tauri:体积小和移动端。 Tauri 的二进制体积比 deno desktop(或 Electron)小一个数量级,而且 Tauri 2 支持 iOS 和 Android。如果体积或移动端优先,Tauri 更胜一筹。
Electrobun:在 macOS 上快速迭代。 Electrobun 在 macOS 上有不错的启动速度和 HMR。如果你只发布 Mac 应用,并且使用 Bun 生态,它值得一看。
Dioxus:纯 Rust。 完全没有 JS 运行时。如果你从头到尾都用 Rust 编写,并且希望统一代码库,Dioxus 是不错的选择。
deno desktop 目前还没有的能力 Jump to heading
这些内容在本节相关页面中都有文档说明,但值得集中列出:
- 一步式公证。 macOS 安装包会进行代码签名(默认使用临时签名,或者使用已配置的 Developer ID 身份),但公证仍然是单独的
notarytool步骤。参见 分发。 - Windows MSI 和 Linux
.deb/.rpm安装器输出。 - Windows 上的自动更新。 基于二进制差分的 自动更新 适用于 macOS 和 Linux; 目前尚不支持 Windows。
- iOS / Android 目标平台。
- 原生剪贴板和安全存储 API(在这些能力上线之前,请先在 webview 侧使用 Web 的
ClipboardAPI)。原生 通知 和 系统托盘 / Dock API 已 可用。 - 桌面应用的运行时权限(即对每次文件系统 / 网络访问都进行权限提示,也就是将 Deno 的权限系统应用于桌面沙箱)。
- 应用之间共享 CEF 运行时。 目前每个应用都会捆绑自己的一份 CEF。若采用托管的共享运行时,每个应用的二进制体积将降至几 MB。已在路线图上。
何时选择 deno desktop Jump to heading
- 你的代码库是 JavaScript / TypeScript,并且不想写 Rust。
- 你希望跨平台获得一致的渲染,并且能接受捆绑 Chromium 带来的二进制体积。
- 你已经有一个 Next.js / Astro / Fresh / 等 Web 应用,并希望在不改代码的情况下得到桌面版本。
- 你希望从一台机器进行交叉编译。
- 你的后端代码需要完整的 Node 兼容性(npm 包、原生模块)。
- 你希望自动更新是内置的,而不是后加的。
何时选择其他方案 Jump to heading
- Tauri:如果二进制体积是硬性要求、你不需要 npm,而且你还需要移动端支持。
- Electron:如果你团队现有的工具、签名和 CI 已经围绕 Electron 构建。
- Dioxus:如果你从头到尾都使用 Rust 编写。
- Electrobun:如果你只发布 macOS,并且想留在 Bun 生态中。