1. Deno Desktop (docs.deno.com)
Deno Desktop 概览
deno desktop 是 Deno v2.9.0 引入的新命令(目前可通过 deno upgrade canary 尝鲜,尚未稳定,API 仍可能变动),可将任意 Deno 项目(从单个 TypeScript 文件到 Next.js 等完整 Web 应用)打包为自包含的桌面应用。输出是一个可重新分发的二进制文件,整合了用户代码、Deno 运行时和网页渲染引擎,按平台分发生成独立包。
核心特性与权衡
与现有桌面方案(如 Electron、Tauri、Electrobun 等)相比,deno desktop 在以下方面提供了明确的取舍:
- 默认轻量,完整 Node 兼容:默认使用操作系统自带 WebView 以控制体积,同时通过 Deno 的 Node 兼容层保留完整 npm 生态;若需跨平台渲染完全一致,可切换至捆绑的 Chromium(CEF)后端。
- 框架自动检测:支持 Next.js、Astro、Fresh、Remix、Nuxt、SvelteKit、SolidStart、TanStack Start 及 Vite SSR 等项目。Release 模式自动运行生产服务器,
--hmr下启动开发服务器并支持热重载,现有 Web 项目无需修改代码即可直接转制为桌面应用。 - 进程内绑定(Bindings):UI 与 Deno 后端通过进程内通道通信,而非基于 Socket 的 IPC。值在跨越调用边界时仍需编码,但省去了跨进程往返开销。
- 单机构建跨平台:同一台机器即可交叉编译 macOS、Windows 和 Linux 版本,渲染后端按需下载,无需本地构建。
- 内置二进制差分自动更新:开发者只需提供
latest.json清单与 bsdiff 补丁,运行时即会自动轮询、应用更新,并在启动失败时自动回滚。
快速入门
创建一个单文件桌面应用:
Deno.serve(() =>
new Response("<h1>Hello, desktop</h1>", {
headers: { "content-type": "text/html" },
})
);
执行 deno desktop main.ts 编译后,生成的二进制文件运行时会打开窗口,并自动导航到 Deno.serve() 所绑定的本地 HTTP 地址,无需手动指定端口或主机名。
文档涵盖内容
官方文档围绕以下主题展开:
- 配置:
deno.json中的desktop配置块。 - 后端:CEF、系统 WebView、raw 等选项及选择依据。
- HTTP 服务:
Deno.serve()集成与服务模型。 - 框架支持:Next.js、Astro、Fresh 等主流框架的适配细节。
- 窗口管理:
Deno.BrowserWindow生命周期、多窗口与事件。 - 绑定机制:通过
bindings.<name>()从 WebView 调用 Deno 代码。 - 系统集成:应用菜单、上下文菜单、托盘/Dock、原生对话框、系统通知。
- 开发体验:
--hmr热模块替换、统一的 Deno 与 WebView DevTools。 - 更新与分发:
Deno.autoUpdate()、差分更新、跨平台编译、输出格式与安装包。 - 错误与对比:未捕获异常与 panic 上报、与 Electron/Tauri 等方案的对比。