Shopping cart

Subtotal $0.00

View cartCheckout

Building better devs

TnewsTnews
Programação

Adeus Electron: Deno Desktop Cria Apps Nativos com 1 Comando

Email : 3

Um comando. Um binário. Três plataformas.

Você tem um app web rodando em Next.js, Astro ou Fresh. Funciona lindo no navegador. Aí o cliente pede uma versão desktop. E você já sabe o que vem: Electron, 300 MB de RAM no idle, binário de 100 MB, e aquele gostinho amargo de estar empacotando um Chrome inteiro pra renderizar um formulário.

O Deno acabou de mudar essa conversa. Com o deno desktop, lançado no Deno v2.9.0 (ainda em canary, mas já funcional), um único comando transforma qualquer projeto Deno — incluindo frameworks como Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit e mais — em um aplicativo desktop nativo. Sem adapter. Sem config extra. Sem Rust.


deno desktop .

Isso é tudo. Sério.

Por que isso importa agora

O mercado de frameworks para apps desktop com tecnologias web virou um campo de batalha nos últimos anos. Electron dominou por quase uma década — VS Code, Slack, Discord, Figma, todos construídos nele. Mas o custo é alto: cada app carrega uma cópia completa do Chromium, consumindo memória como se não houvesse amanhã.

O Tauri surgiu como alternativa em Rust, usando a webview nativa do sistema operacional. Resultado: binários de 2-10 MB contra 100+ MB do Electron. Mas exige que você aprenda Rust pro backend, e compilação cruzada é dolorosa — precisa da toolchain de cada plataforma-alvo.

O Deno Desktop entra nessa briga com uma proposta que, francamente, parece boa demais pra ser verdade: você escreve TypeScript (ou JavaScript), usa qualquer pacote npm, e compila pra macOS, Windows e Linux de uma única máquina. Sem Rust. Sem toolchain extra. Sem adaptadores de framework.

Como funciona por baixo

A arquitetura do Deno Desktop é fundamentalmente diferente do Electron e do Tauri. Enquanto ambos usam um modelo multi-processo — onde o backend e o frontend rodam em processos separados e se comunicam via IPC — o Deno Desktop roda tudo no mesmo processo.

A comunicação entre o backend (seu código TypeScript) e o frontend (a webview) acontece por canais in-process. Os valores ainda são serializados como JSON, mas não existe round-trip entre processos. Na prática, isso significa menos latência e menos overhead.


┌─────────────────────────────────────┐
│           Processo único            │
│                                     │
│  ┌──────────┐    ┌──────────────┐  │
│  │ Deno      │◄──►│ WebView/CEF  │  │
│  │ Runtime   │    │ Renderer     │  │
│  └──────────┘    └──────────────┘  │
│       │ in-process channels │       │
└─────────────────────────────────────┘

Você tem duas opções de backend de renderização:

Backend O que é Tamanho do binário Quando usar
——— ——— ——————- ————-
WebView (padrão) Usa a webview nativa do SO (WebKit no macOS, WebView2 no Windows, WebKitGTK no Linux) ~40 MB Quando tamanho importa
CEF (Chromium) Embarca o Chromium completo ~150 MB Quando consistência de renderização entre plataformas é crítica

A escolha é sua:


# Webview nativa (padrão, menor)
deno desktop main.ts

# Chromium embarcado (maior, consistente)
deno desktop --backend cef main.ts

Detecção automática de frameworks — e eu testei

A feature mais impressionante, na minha opinião, é a detecção automática de frameworks. O Deno Desktop reconhece oito frameworks sem nenhuma configuração:

Framework Detecção Arquivo/Indicador
———– ———- ——————-
Next.js Automática next.config.{js,mjs,ts}
Astro Automática astro.config.{mjs,ts,js}
Fresh Automática fresh.gen.ts ou _fresh/
Remix Automática Dependência @remix-run/react
Nuxt Automática nuxt.config.{ts,js,mjs}
SvelteKit Automática svelte.config.{js,ts}
SolidStart Automática Dependência no package.json
TanStack Start Automática Dependência no package.json

O fluxo para um projeto Next.js, por exemplo:


# Build normal do Next.js
npx next build

# Empacota como app desktop
deno desktop .

Pronto. O Deno detecta o next.config.js, gera um entry point sintético pro servidor do framework, embarca o output do build (.next/) no filesystem virtual do binário, e na hora de rodar, extrai tudo pra que o código do framework encontre seus arquivos normalmente.

Nenhum outro framework desktop faz isso. No Electron, você precisa do electron-builder com configs extensas. No Tauri, precisa de um adapter específico. Aqui? Zero config.

Compilação cruzada de verdade

Essa é outra feature que o Deno Desktop acerta onde os concorrentes erram. Compilação cruzada — gerar um binário para outra plataforma sem precisar dela — é historicamente dolorosa:

  • Electron: Precisa do electron-builder e frequentemente precisa rodar em CI com runners de cada plataforma
  • Tauri: Precisa da toolchain nativa da plataforma-alvo. Quer compilar pra Windows no Mac? Boa sorte

No Deno Desktop:


# Build para macOS ARM (Apple Silicon) a partir de qualquer SO
deno desktop --target aarch64-apple-darwin main.ts

# Build para Windows x64
deno desktop --target x86_64-pc-windows-msvc main.ts

# Build para TODAS as plataformas de uma vez
deno desktop --all-targets main.ts

Um comando. Todas as plataformas. Sem Docker, sem CI multi-runner, sem VMs.

Auto-update embutido (não gambiarrado)

Se você já trabalhou com auto-update no Electron, sabe a dor. O electron-updater funciona, mas é uma camada a mais que você configura, testa, e torce pra não quebrar. No Tauri, é um plugin.

No Deno Desktop, auto-update é first-class. Funciona com binary diff (bsdiff) — ou seja, baixa só a diferença entre versões, não o binário inteiro. E se o update falhar na hora de iniciar, faz rollback automático.

A configuração vai no deno.json:


{
  "desktop": {
    "release": {
      "baseUrl": "https://updates.meuapp.com"
    }
  }
}

Nada mais. O Deno gera os manifests e diffs automaticamente.

Hot Module Replacement no desktop

Desenvolvimento local é onde o Deno Desktop brilha de um jeito que ninguém mais oferece. Com a flag --hmr, você tem hot module replacement funcionando no app desktop:


deno desktop --hmr main.ts

Editou o código? A janela do app atualiza instantaneamente, preservando o estado. Nada de fechar e reabrir. Nada de recompilar.

No Electron, não existe HMR nativo — você precisa configurar webpack/vite por conta própria. No Tauri, existe via Vite, mas é a configuração do seu frontend, não do framework desktop.

A comparação que você quer ver

Vamos ser honestos. Números importam mais que marketing. Aqui está a comparação direta:

Métrica Deno Desktop Electron Tauri
——— ————- ———- ——-
Linguagem do backend TypeScript/JavaScript JavaScript Rust
Engine web WebView ou CEF Chromium (embutido) WebView nativa
Tamanho do binário ~40 MB (webview) / ~150 MB (CEF) ~100 MB+ ~2-10 MB
Consistência de renderização Sim (com CEF) Sim Depende do SO
Modelo de processo Multi-thread (processo único) Multi-processo Multi-processo
Compilação cruzada Sim, nativo Via electron-builder Precisa do SO-alvo
HMR Sim, built-in Não Sim (via Vite)
Auto-update bsdiff built-in Binário completo Plugin
Mobile Ainda não Não iOS/Android (v2+)
Compatibilidade npm Total (via Deno) Total (Node.js) Limitada (frontend only)

Onde cada um ganha:

  • Tauri vence em tamanho de binário de longe. 2-10 MB é imbatível. E tem suporte mobile.
  • Electron vence em ecossistema. Milhares de pacotes, ferramentas de signing maduras, e praticamente todo app desktop grande usa.
  • Deno Desktop vence em DX (developer experience). Zero config pra frameworks, compilação cruzada real, auto-update built-in, e você não precisa aprender Rust.

O que ainda falta

Eu não seria honesto se não listasse as limitações atuais. O Deno Desktop está em v2.9.0 canary — as APIs podem mudar antes da versão estável.

O que ainda não tem:

  • Notarização macOS em um passo — precisa rodar notarytool separadamente
  • Instaladores Windows (MSI) e empacotadores Linux (.deb/.rpm) — por enquanto só binário direto
  • Auto-update no Windows — funciona no macOS, mas Windows ainda está em desenvolvimento
  • iOS/Android — o Tauri tem essa vantagem clara
  • Runtime CEF compartilhado — cada app carrega seu próprio Chromium, diferente do que o Electron faz com versões compartilhadas

São limitações reais, mas todas têm “ainda” na frente. O roadmap é claro, e considerando que isso é uma primeira release, a base já é mais sólida do que o Electron era na sua v1.

Na prática: criando um app do zero

Chega de teoria. Vamos montar um app desktop com Deno Desktop em menos de 20 linhas:


// main.ts
const html = `
<!DOCTYPE html>
<html>
<head>
  <title>Meu App Desktop</title>
  <style>
    body { font-family: system-ui; padding: 2rem; background: #1a1a2e; color: #eee; }
    h1 { color: #e94560; }
    button { padding: 0.5rem 1rem; background: #e94560; color: white; border: none; border-radius: 4px; cursor: pointer; }
    button:hover { background: #c73e54; }
    #info { margin-top: 1rem; padding: 1rem; background: #16213e; border-radius: 8px; }
  </style>
</head>
<body>
  <h1>Deno Desktop App</h1>
  <button onclick="fetchInfo()">Buscar Info do Sistema</button>
  <div id="info"></div>
  <script>
    async function fetchInfo() {
      const res = await fetch('/api/info');
      const data = await res.json();
      document.getElementById('info').innerHTML =
        '<pre>' + JSON.stringify(data, null, 2) + '</pre>';
    }
  </script>
</body>
</html>
`;

Deno.serve({ port: 3000 }, (req: Request) => {
  const url = new URL(req.url);

  if (url.pathname === '/api/info') {
    return Response.json({
      os: Deno.build.os,
      arch: Deno.build.arch,
      deno: Deno.version.deno,
      pid: Deno.pid,
      memory: Deno.memoryUsage(),
    });
  }

  return new Response(html, {
    headers: { 'content-type': 'text/html' },
  });
});

Compilar e rodar:


# Instalar canary do Deno (necessário por enquanto)
deno upgrade canary

# Compilar para desktop
deno desktop --allow-read --allow-net main.ts

# Ou durante desenvolvimento com HMR
deno desktop --hmr main.ts

O resultado é um binário nativo de ~40 MB que abre uma janela com seu app. Sem servidor externo, sem dependências, sem Node.

Configuração avançada no deno.json

Para projetos mais sérios, o deno.json permite configuração detalhada:


{
  "desktop": {
    "app": {
      "name": "MeuApp",
      "identifier": "com.empresa.meuapp",
      "icons": {
        "macos": "./icons/icon.icns",
        "windows": "./icons/icon.ico",
        "linux": "./icons/icon.png"
      }
    },
    "backend": "webview",
    "release": {
      "baseUrl": "https://updates.meuapp.com"
    },
    "errorReporting": {
      "url": "https://errors.meuapp.com/report"
    }
  }
}

Com isso configurado, deno desktop . já gera o binário com ícone, nome correto, auto-update, e reporte de erros.

Migração do Electron: vale a pena?

Se você já tem um app Electron em produção, a pergunta óbvia é: devo migrar?

A resposta curta: ainda não. A resposta longa: depende do quanto de dor o Electron te causa.

O Electron carrega problemas estruturais que não vão embora. Cada instância roda seu próprio Chromium — se o usuário tem Slack, VS Code e Discord abertos, são três Chromiums na memória. O consumo de RAM facilmente passa de 200-300 MB por app no idle. E o tamanho dos instaladores assusta: o VS Code, que é provavelmente o app Electron mais otimizado que existe, ainda pesa mais de 100 MB.

O Deno Desktop resolve alguns desses problemas (binário menor com webview, menos RAM por causa do modelo single-process), mas não resolve todos. A falta de instaladores nativos (.msi, .deb, .rpm) e a ausência de auto-update no Windows são blockers reais pra apps em produção.

Minha recomendação: se você está começando um projeto novo e o time já usa ou está disposto a usar Deno, vale muito a pena começar com Deno Desktop. Se já tem um Electron rodando, monitore o progresso e planeje a migração pra quando a versão estável sair — provavelmente no Q3/Q4 de 2026.

Para quem está entre Tauri e Deno Desktop, a decisão é mais simples: se seu time é forte em Rust, Tauri. Se é forte em TypeScript, Deno Desktop. O Tauri entrega binários menores, mas exige Rust no backend. O Deno Desktop entrega DX melhor pra quem vive no ecossistema JavaScript/TypeScript.

O impacto no ecossistema JavaScript

O Deno tem feito movimentos agressivos nos últimos meses. A compatibilidade com Node.js e npm chegou a um ponto onde a maioria dos pacotes “just works”. O deno compile já transformava scripts em binários standalone. Agora, com deno desktop, o Deno se posiciona como uma plataforma completa: servidor, CLI, desktop — tudo com TypeScript, tudo com um runtime.

Isso pressiona diretamente o Node.js, que nunca teve ambição de ser uma plataforma desktop. E pressiona o Electron, que depende do ecossistema Node para existir. Se o Deno conseguir entregar uma experiência desktop tão boa quanto a de servidor (e os sinais iniciais são promissores), o argumento pra usar Node.js em novos projetos fica cada vez mais fraco.

Não estou dizendo que o Node vai morrer — ele tem 15 anos de ecossistema e inércia. Mas a proposta de valor do Deno está ficando difícil de ignorar: um runtime, uma toolchain, TypeScript nativo, e agora apps desktop. Tudo sem node_modules, sem webpack.config.js, sem tsconfig.json com 47 opções.

Quem deveria prestar atenção nisso

Se você é um dev TypeScript/JavaScript que precisa entregar apps desktop, o Deno Desktop é a coisa mais interessante que aconteceu nesse espaço desde o Tauri.

Não é pra todo mundo — se tamanho de binário é crítico, o Tauri ainda vence com folga. Se você já tem um pipeline inteiro de Electron funcionando em produção, migrar agora seria prematuro.

Mas se você está começando um projeto novo, ou se tem um app web em Next.js/Astro/SvelteKit que precisa virar desktop, a barreira de entrada do Deno Desktop é tão baixa que não experimentar seria negligência.

O Electron tem 11 anos. O Tauri mudou as regras com Rust e webview nativa. O Deno Desktop está apostando que a maioria dos devs não quer aprender Rust — quer escrever TypeScript e compilar pra todas as plataformas com um comando.

E sabe o que mais? Eles provavelmente estão certos.


Fonte de inspiração: Deno Desktop — Documentação Oficial

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Posts