← 返回内容列表

Deno Desktop 发布:JavaScript 运行时进军桌面应用领域

Deno Desktop 发布:JavaScript 运行时进军桌面应用领域

Deno v2.9.0 将推出 deno desktop 命令,将 JS/TS 项目打包为跨平台桌面应用。使用系统 WebView、进程内绑定、内置自动更新,挑战 Electron 和 Tauri。

在 HN 上获得 732 点热度的 Deno Desktop,标志着 JavaScript 运行时正式进军桌面应用领域。这个功能将随 Deno v2.9.0 发布,目前可通过 canary 版本试用。

核心特性

Deno Desktop 的设计理念可以用一句话概括:用最小的代价把 Web 项目变成桌面应用。具体来说:

  • 一行命令构建桌面应用:只需 deno desktop main.ts,即可生成可执行二进制文件
  • 默认小体积:使用操作系统自带的 WebView 渲染,而非捆绑完整 Chromium,显著减小应用体积
  • 完整 npm 兼容:通过 Deno 的 Node 兼容层,整个 npm 生态可用
  • 框架自动检测:Next.js、Astro、Fresh、Remix、Nuxt、SvelteKit 等框架无需改代码即可运行
  • 跨平台编译:从一台机器即可构建 macOS、Windows、Linux 三个平台的二进制文件
  • 内置自动更新:基于 bsdiff 补丁的增量更新,支持失败自动回滚

与 Electron 的关键差异

Electron 是当前最流行的 Web 桌面应用方案(VS Code、Slack、Discord 都基于它),但长期被诟病的是体积庞大——每个 Electron 应用都捆绑了一份完整的 Chromium。Deno Desktop 选择了不同路线:

特性ElectronDeno Desktop渲染引擎捆绑 Chromium系统 WebView(可选 CEF)后端-前端通信跨进程 IPC进程内绑定包体积100MB+显著更小(默认 WebView)自动更新需第三方方案内置 bsdiff + 回滚跨平台编译需各平台 CI单机交叉编译 进程内绑定:性能的关键

Deno Desktop 最具创新性的设计是进程内绑定(in-process bindings)。在 Electron 中,后端代码(Node.js 主进程)和前端代码(Chromium 渲染进程)运行在不同进程中,通过 IPC 通信,数据需要序列化/反序列化。而 Deno Desktop 将 Deno 运行时和 WebView 放在同一个进程中,通过 bindings.() 直接调用,减少了跨进程通信的开销。

这意味着你的 TypeScript 后端代码可以直接操作前端 UI,无需 IPC 桥接。虽然值在跨越运行时边界时仍会编码,但没有网络往返的延迟。

框架集成:零配置支持主流框架

Deno Desktop 自动检测项目类型并做出相应处理:

  • Release 模式:运行框架的生产构建服务器
  • 开发模式(--hmr):启动 dev server 并支持热模块替换

这意味着你可以把一个现有的 Next.js 或 SvelteKit 项目直接用 deno desktop 打包,无需修改任何代码。

自动更新:开箱即用

桌面应用的自动更新一直是个痛点。Electron 通常需要 electron-updater 等第三方库。Deno Desktop 内置了完整的更新方案:

  1. 发布一个 latest.json manifest 文件
  2. 运行时自动轮询检查更新
  3. 下载 bsdiff 二进制差异补丁(而非完整文件)
  4. 应用补丁后启动新版本
  5. 如果新版本启动失败,自动回滚到上一个版本

开发者生态影响

Deno Desktop 的出现为 JavaScript 开发者提供了继 Electron 和 Tauri 之后的第三个选择。它的差异化优势在于 TypeScript 原生支持 + 进程内通信 + 内置更新的三合一组合。对于已经使用 Deno 生态的团队,这几乎是零成本迁移到桌面应用开发的方案。

不过需要注意,Deno Desktop 目前还处于 canary 阶段,API 可能变动。对于生产环境,建议等待 v2.9.0 正式发布后再采用。

Deno Desktop 发布:JavaScript 运行时进军桌面应用领域 | 必学必会