配了五年桌面应用,今天才发现替代 Electron 的东西就在你工具链里——Deno desktop
做桌面应用五年了,每次起步都要先装一套 Node.js + Electron + 构建脚本,光环境配置就能耗掉半天。
不是没有更好的方案。Electron 本身不差——Chromium 加 Node.js 的组合足够成熟,生态也完整。但它的问题从第一天就没变过:重。bundle 动不动几百 MB,冷启动慢,内存占用高,而且每换一台机器都要重新配一遍开发环境。
这些问题在 2026 年的今天本来已经不该是问题了。
Deno 2.9 在六月底悄悄上线了一个叫 deno desktop 的功能。核心逻辑很简单:你写一个入口脚本,它编译成一个独立的二进制,直接发给用户。用户不需要装任何运行时,也不需要理解什么是 Node。
“`typescript
// main.ts
Deno.serve(() => new Response(
“<h1>Hello from Deno desktop</h1>”,
{ headers: { “content-type”: “text/html” } }
));
// 编译
$ deno desktop main.ts
“`
这行命令跑完,当前目录下会多出一个对应系统的安装包。Windows 是 .exe/.msi,macOS 是 .app/.dmg,Linux 是 .AppImage/.deb/.rpm。整个过程没有 Electron、没有 Tauri、没有额外的工具链。
支持的主流框架和直接检测,不需要手动指定入口路径:
“`bash
自动检测 Next.js、Astro、Fresh、Remix、Nuxt、SvelteKit……
deno desktop
deno desktop –hmr # 开发模式带热更新
“`
如果框架检测不到,或者你想用一个更轻量的入口,直接 deno desktop main.ts 就行。Deno.serve() 在桌面模式下会自动绑定到 webview 打开的端口,不需要你手动处理端口通信。
原生桌面 API,零依赖
Deno 2.9 把一整套原生桌面接口直接做到了运行时里,不需要任何第三方包:
“`typescript
// 系统托盘
const tray = new Deno.Tray();
tray.setIcon(iconBytes);
const panel = tray.attachPanel({ url: “https://localhost:8000/panel” });
panel.window.bind(“doThing”, async () => { / … / });
// 自动更新
Deno.autoUpdate();
// 窗口控制
new Deno.BrowserWindow({ width: 1200, height: 800 })
“`
prompt()、alert()、confirm() 在桌面模式下直接渲染成系统原生对话框,不需要自己写 HTML/CSS 去模拟。打包后的二进制权限和你在 deno run 时授予的权限一致,编译时 baked in。
两个渲染引擎,按需选
默认的 webview 模式直接调操作系统的内置引擎:Windows 用 WebView2,macOS 和 Linux 用 WebKit。二进制体积最小、启动最快,但渲染效果依赖用户系统自带的 webview 版本。
如果需要保证所有用户看到完全一致的渲染,加 --backend cef 打包一份 Chromium。代价是多了几十 MB 的下载量和更长的 CI 构建时间。
“`bash
deno desktop –backend webview main.ts # 默认,系统 webview
deno desktop –backend cef main.ts # 打包 Chromium,保证一致性
“`
跨平台交叉编译也不需要目标机器上装任何工具链:
“`bash
deno desktop –target aarch64-apple-darwin main.ts # macOS ARM
deno desktop –target x86_64-pc-windows-msvc main.ts # Windows
deno desktop –all-targets main.ts # 全平台
“`
性能数据
Deno 2.9 的性能提升不只是在桌面场景里。官方博客给了一个冷启动对比:hello-world 程序从 2.8 版的 34ms 降到 17ms。内存方面,1MiB 内容传输时峰值从 197MB 压到 62MB。HTTP 吞吐量提升 1.11x 到 1.27x,视负载类型而定。
对于桌面场景来说,启动速度和内存占用的改善最直接——Electron 的冷启动通常在 2-5 秒,内存轻松破 300MB,而 Deno desktop 的 hello-world 实测在 20ms 以内。
迁移成本
Deno 2.9 专门优化了从其他包管理器迁移的路径。deno install 现在直接读 npm、pnpm、yarn、Bun 的 lockfile,不需要逐个包重新装。
“`bash
原来项目在 npm 下,直接切过去
deno install
“`
对于原来跑在 Electron 里的项目,最大的改动是把 Electron 的 BrowserWindow API 替换成 Deno.BrowserWindow,把 IPC 通信替换成 window.bind() 桥接。Deno 官方博客的示例仓库里有 Vue/React 项目迁移的完整对照。
什么时候不该用它
deno desktop 目前标记为 experimental(实验阶段),生产环境直接跑需要自己评估风险。另外有几个场景还不适合:
- 需要深度系统集成的场景(macOS AppKit、Windows Win32 API)仍然要靠 Tauri 或 Electron
- 如果你的 Electron 项目重度依赖 node: 原生模块,需要逐个检查兼容性
- 嵌入式 webview 或 hybrid app 场景,Deno desktop 面向的是独立桌面应用
对于内部工具、简单的桌面客户端、或者想把现有 Web 项目快速包装成分发版本的团队,这个方向已经值得测试了。
下一步
- 装 Deno 2.9:
curl -fsSL https://deno.land/install.sh | sh - 用官方示例跑一个最小化 demo:
deno desktop --hmr main.ts - 把现有项目丢进去跑一遍,看框架检测是否正常工作
不需要删掉 Electron。但如果 deno desktop 能解决你当下的交付问题,这个替代品的切换成本可能比你想象的低得多。
评论区
登录后可评论。