Deno 2.9: 推出用于原生应用程序的 `deno desktop`

Deno 2.9: 推出用于原生应用程序的 deno desktop

deno desktop 在 Deno 2.9 中推出,这是一个新命令,可将 Deno 项目(从单个 TypeScript 文件到像 Next.js 这样的全栈框架)转换为自包含、可分发的桌面二进制文件。该工具将应用程序代码、Deno 运行时和 Web 渲染引擎打包进一个特定平台的单一可执行文件中。

deno desktop 的核心能力

deno desktop 旨在通过提供高度集成的工具链来减少构建桌面应用程序的摩擦,该工具链可以处理打包、渲染和更新。

灵活的渲染后端

开发者可以在两种主要的渲染策略之间进行选择,以平衡二进制文件大小和一致性:

  • OS WebView (默认): 使用操作系统的原生 Webview 以保持较小的二进制文件大小。
  • Chromium (CEF): 打包 Chromium Embedded Framework (CEF) 以确保在 macOS、Windows 和 Linux 上的渲染效果完全一致。

框架自动检测

deno desktop 内置了对流行 Web 框架的支持。它会自动检测并配置以下框架:

  • Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start, 和 Vite SSR。

在发布模式下,它会运行生产服务器;在开发期间,它支持 --hmr 标志以进行热模块替换,而无需对原始 Web 项目进行代码更改。

进程内通信

与通常依赖于基于 socket 的进程间通信 (IPC) 的 Electron 或 Tauri 不同,deno desktop 在后端和 UI 之间使用进程内通道进行通信。虽然在跨越调用边界时值仍然会被编码,但这种架构消除了跨进程的往返开销。

跨平台编译与更新

  • 单机构建: 开发者可以在单台机器上为 macOS、Windows 和 Linux 编译,因为后端是根据需要下载的,而不是在本地构建。
  • 二进制差异更新 (Binary-Diff Auto-Updates): 运行时包含一个使用 Deno.autoUpdate() 的内置更新系统。它利用 latest.json 清单文件和 bsdiff 补丁来轮询、应用并自动回滚失败的更新。

技术实现与 API

创建一个基础的桌面应用程序需要极少的设置。在 main.ts 文件中一个简单的 Deno.serve() 处理程序即可通过命令 deno desktop main.ts 转换为二进制文件。

集成功能

deno desktop 提供了一套全面的原生 API 和配置:

  • 窗口管理: Deno.BrowserWindow 处理多个窗口的生命周期和事件。
  • 原生 UI 元素: 支持应用程序菜单和上下文菜单、系统托盘图标以及 macOS dock 集成。
  • OS 集成:prompt()alert()confirm() 提供原生弹出窗口,以及通过 Web Notification API 提供的原生 OS 通知。
  • 开发者工具: 统一的 DevTools,可同时连接到 Deno 运行时和 webview。

社区观点与分析

在发布公告后,开发者社区强调了关于 deno desktop 架构的几个战略优势和潜在担忧。

与现有框架的比较

一些用户指出,deno desktop 通过使用原生 WebViews 来实现较小的二进制文件,其架构模仿了 Tauri,但使用 TypeScript 而不是 Rust 来处理业务逻辑。

"Sounds like a similar architecture to Tauri, but your business logic is in typescript instead of rust."

其他人则认为,能够直接运行真正的 TypeScript——而无需剥离类型——使 Deno 在与基于 Node 的替代方案相比中具有竞争优势。

安全与权限

关于 Deno 的权限系统在编译后的二进制文件背景下的问题被提出了。目前,在编译时授予的权限被固化在二进制文件中。

UI 和 UX 担忧

批评者指出,无论使用何种运行时,依赖 Web 技术构建桌面 UI 往往会导致应用程序无法遵循原生 OS 设计模式。

"The reason Electron apps get a lot of flak is because they are everything but a UI toolkit. They consistently miss the mark in adopting UI patterns from their host OS."

性能与资源管理

关于基于 CEF 的应用的二进制文件大小的讨论正在进行中。一个提议的路线图项目涉及在应用程序之间共享 CEF 运行时,以减少每个应用的占用空间,从数百兆字节减少到几兆字节。

Sources