1 pontos por GN⁺ 5 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • É possível empacotar projetos Deno feitos com apps web e código TypeScript em binários de aplicativos de desktop redistribuíveis para cada plataforma
  • A saída inclui junto o código da aplicação, o runtime Deno e o motor de renderização web; entrou no Deno v2.9.0, mas ainda não é um lançamento estável
  • O backend WebView padrão usa o webview embutido no sistema operacional para priorizar binários pequenos, e, se for necessária consistência de renderização, é possível escolher o backend Chromium (CEF)
  • Detecta projetos Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start e Vite SSR, executando o servidor de acordo com o modo de release e o modo de desenvolvimento --hmr
  • A comunicação entre o código Deno e o webview usa canais in-process em vez de IPC baseado em sockets, e o escopo também inclui cross-compilation e atualizações automáticas baseadas em bsdiff

Papel e estado atual do deno desktop

  • deno desktop transforma projetos Deno em aplicações de desktop self-contained
    • A entrada pode variar de um único arquivo TypeScript até um app Next.js
    • A saída é um binário redistribuível específico para cada plataforma
    • O binário inclui o código da aplicação, o runtime Deno e o motor de renderização web
  • Esse recurso está incluído no Deno v2.9.0, mas ainda não é um lançamento estável
    • Para testar agora, é preciso instalar o build canary com deno upgrade canary
    • Comandos, chaves de configuração e a API TypeScript podem mudar antes da estabilização

Escolha de backend e execução de projetos web

  • A proposta é usar tecnologias web como toolkit de UI para desktop, reduzindo os trade-offs de ferramentas de apps desktop baseadas na stack web existente
    • Ferramentas como Electron, Tauri e Electrobun podem ter trade-offs como binários grandes, lacunas de suporte entre plataformas, ausência do ecossistema JavaScript, falta de atualizações embutidas e ausência de integração com frameworks
  • O backend WebView padrão usa o webview do sistema operacional para priorizar binários pequenos
    • O ecossistema npm pode ser usado por meio da camada de compatibilidade com Node do Deno
    • Se for preciso ter a mesma renderização em macOS, Windows e Linux, é possível escolher o backend CEF, com Chromium empacotado
  • A detecção automática de frameworks permite executar projetos web existentes no desktop sem alterações no código
    • Os alvos incluem Next.js, Astro, Fresh, Remix, Nuxt, SvelteKit, SolidStart, TanStack Start e Vite SSR
    • No modo release, ele executa o servidor de produção
    • Em --hmr, ele executa o servidor de desenvolvimento com hot reload

Comunicação de runtime, build e atualizações

  • A comunicação entre backend e UI usa canais in-process
    • Os valores são codificados ao atravessar a fronteira de chamada
    • Não há ida e volta entre processos entre o código Deno e o webview
  • É possível fazer cross-compilation para macOS, Windows e Linux a partir de uma única máquina
    • O backend não é compilado localmente; ele é baixado quando necessário
  • A atualização automática usa um mecanismo embutido de atualização diferencial binária com manifesto latest.json e patches bsdiff
    • O runtime cuida de polling, aplicação e rollback em caso de execução com falha

Exemplo simples e organização da documentação

  • Um app de desktop de arquivo único pode ser criado fazendo um main.ts que retorna uma resposta HTML com Deno.serve() e executando deno desktop main.ts
Deno.serve(() =>
  new Response("Hello, desktop

", {
    headers: { "content-type": "text/html" },
  })
);
deno desktop main.ts
  • O binário compilado abre uma janela apontando para um servidor HTTP local vinculado ao handler de Deno.serve()
    • No macOS/Linux, ele é executado com ./main
    • No Windows, ele é executado com .\\main.exe
  • Deno.serve() é vinculado automaticamente ao endereço para o qual o webview navega, então não é necessário informar porta ou nome de host
  • A documentação relacionada é dividida em configuração, backends, serving HTTP, frameworks, gerenciamento de janelas, bindings, menus, tray e dock, caixas de diálogo, notificações, HMR, DevTools, atualização automática, relatório de erros, deploy, comparação e referência da CLI
    • Deno.BrowserWindow trata de ciclo de vida da janela, múltiplas janelas e eventos
    • Deno.autoUpdate() trata de manifesto, bsdiff e rollback
    • bindings.() é a forma de binding para chamar código Deno a partir do webview

1 comentários

 
GN⁺ 5 시간 전
Comentários do Hacker News
  • O Deno Desktop parece ter escolhido esse compromisso de forma bem opiniosa: “o padrão é enxuto, a compatibilidade com Node é completa”
    Testei deno desktop index.ts com o Hello World de 5 linhas do post, e no Windows 10 o resultado foi de 442MB
    Eu esperava que fosse menor que um build de Electron, então fiquei surpreso por ter ficado muito maior; libcef.dll tinha 247MB, e deno-test.dll, com o Hello World, tinha 78MB
    Fiquei me perguntando se fiz algo errado

    • Também lembro do Hello World em Electron ficando em torno de 100~150MB, já incluindo o runtime de navegador/Chromium
      Então eu esperava que, reutilizando algo como a webview do sistema operacional, surgisse uma solução com menos de 20MB, mas passar de 400MB parece meio enganoso
      Pode ser que eu tenha configurado algo errado, então queria saber se além de deno desktop test.ts tem mais alguma coisa que precisa ser feita
  • Achei interessante a parte que diz que, em vez de cada app empacotar seu próprio CEF, dá para gerenciar um runtime compartilhado de CEF, reduzindo o tamanho do binário por app para alguns MB, e que isso está no roadmap
    Como não conheço muito bem CEF, fiquei curioso sobre como funcionaria o gerenciamento de versões
    Se cada app exigir uma versão diferente de CEF, isso acaba voltando para um modelo como o do Electron, em que cada app carrega seu próprio navegador, ou ainda sobra alguma vantagem no runtime compartilhado mesmo nesses casos?
    https://docs.deno.com/runtime/desktop/comparison/

    • CEF é Chromium Embedded Framework
      https://github.com/chromiumembedded/cef
    • Só como referência, CEF também foi usado pela Riot e no cliente de League of Legends
      O resultado não foi muito bom, mas não sei se isso foi um problema da tecnologia CEF em si ou culpa de outros componentes ou processos
      https://www.riotgames.com/en/news/architecture-league-client...
    • Duvido muito que a vantagem seja tão grande
      Na prática, quase todos os apps Electron no desktop usam versões diferentes do Chromium, e às vezes mantêm versões antigas por causa do risco de quebrar algo ao atualizar
    • Desenvolvedores web estão acostumados com um ambiente-alvo que continua sendo atualizado para a versão mais recente, então parece possível dar a opção de participar ou não de um modelo tipo “simplesmente me entregue a versão mais nova que você tiver”
    • Em vez de baixar e gerenciar diretamente um navegador embutido, seria melhor usar a webview do sistema
      No Windows, seria algo no estilo do WebView2
  • O Deno continua impressionando
    Faz bastante tempo que não começo um projeto novo sem Deno, e já passei a apoiar totalmente o ecossistema Deno em vez do Node.js
    Não sei com que frequência eu usaria esse recurso, mas é muito bom ter essa opção

  • Trabalho impressionante
    Parece algo bem interessante para criar apps desktop com vibe coding
    Ferramentas como Lovable, Bolt e v0 já usam TypeScript por padrão ao criar apps web, então isso parece combinar muito bem aqui
    Para apps desktop pequenos eu vinha usando Go/Wails em vez de empacotar Chromium e Node, e o Electron também sempre cumpriu seu papel, mas aquele bundle enorme sempre me incomodou bastante

  • Eu estava curioso para saber como isso se integra com o sistema de permissões do Deno, que é um dos seus maiores pontos fortes
    Isso é especialmente importante quando você deixa agentes circularem livremente no seu dispositivo
    A documentação de referência da CLI diz que “as permissões concedidas na compilação ficam embutidas no binário compilado”
    Seria bom se isso fosse exposto de um jeito que permitisse ao usuário saber e decidir quais permissões serão concedidas
    https://docs.deno.com/runtime/reference/cli/desktop/#runtime...

    • Estamos falando da situação em que se executa um binário recebido de um desenvolvedor
      Nesse caso, mostrar um prompt de permissões do Deno poderia até induzir a erro, porque não haveria garantia de integridade dessas permissões
    • Uma das coisas que ainda faltam no Deno Desktop são permissões em tempo de execução para apps desktop
      Seria uma forma de aplicar o sistema de permissões do Deno ao sandboxing no desktop, exibindo prompts de permissão para cada acesso ao sistema de arquivos ou à rede
  • É um recurso inteligente de lançar
    Parece algo que eu certamente levaria em consideração ao decidir qual plataforma usar

    • Concordo
      Com instalação pequena e multiplataforma, parece uma alternativa decente a Electron ou Tauri
  • Acho que a expressão “tecnologias web são o toolkit de UI mais amplamente conhecido do mundo” não é muito apropriada
    Um dos grandes motivos de tantos apps em Electron receberem críticas é justamente por ele estar quase no extremo oposto de um toolkit de UI
    Muitas vezes ele não segue direito os padrões de UI do sistema operacional hospedeiro
    Tecnologias web são apenas tecnologias web; elas conseguem renderizar um botão, mas não há garantia de que até mesmo um botão sem estilo vá parecer nativo do SO, e isso ainda varia de navegador para navegador

    • Não é por isso que as pessoas usam Electron
      O objetivo nunca foi simplesmente ser um “toolkit de UI” ou “seguir os padrões de UI do SO hospedeiro”
      O Chromium traz uma quantidade enorme de recursos, e o Electron aproveita essa utilidade diretamente, o que é uma vantagem
      Por exemplo, se você já trabalhou com vídeo, sabe que poder usar dentro de um app desktop toda a capacidade de um navegador moderno muda completamente o jogo
      Implementar por conta própria não só a reprodução de vídeo, mas também transcoding com a web moderna e WebCodecs, é um trabalho enorme; ainda mais se for um app desktop que precisa funcionar em Windows/macOS/Linux
      Já fiz um app em Electron em algumas dezenas de horas que, de outro jeito, provavelmente levaria dezenas de dias, e mesmo com IA seria difícil se você não fosse especialista em vídeo
    • Não entendo por que dizer isso seria uma formulação ruim
      Ninguém afirmou que fosse uma UI “nativa”
      A UI nativa no Linux sempre me pareceu bem feia, e eu sempre achei muito melhor usar um layout em HTML+CSS bem feito
      Na minha experiência, Electron costuma ser criticado principalmente por ser pesado e lento; o fato de não ser nativo é mais um ponto adicional que as pessoas mencionam
      Há muito tempo eu queria criar uma integração direta com o navegador que usasse HTML+CSS para layout, mas sem precisar de runtime JavaScript
      Não sei o quão leve é o Servo, mas seria ótimo se uma ideia assim virasse realidade algum dia
    • Sempre que uso o Zed no Linux, macOS e Windows, fico impressionado com o quão estável e rápido é o framework GPUI
      Como usuário, estou muito satisfeito, e embora ainda faltem recursos básicos como acessibilidade, acho que isso deve ser implementado em breve
      Do ponto de vista de desenvolvedor, além do Rust, não vejo muito bem qual seria a barreira de entrada, e ao mesmo tempo o Rust também é um diferencial
    • A questão de a UI parecer nativa já perdeu força como contra-argumento faz muito tempo
      Isso era discussão de uns 25 anos atrás; depois que até a Microsoft deixou de se importar, praticamente ninguém mais ligou muito para isso
    • Parece que você vê como desvantagem não seguir os padrões de UI do SO hospedeiro, mas para mim isso é uma das principais vantagens do Electron
      Eu não quero que meu app pareça diferente em cada SO
      Não tenho recursos para testar em todos os dispositivos, e saber que a tela testada em um sistema vai parecer exatamente igual nos outros é uma vantagem enorme
  • Fico feliz de ver surgir um concorrente nessa área
    Especialmente porque o Deno, no estado atual, consegue executar TypeScript de verdade diretamente, em vez de apenas remover os tipos como a implementação do Node
    Ainda assim, isso parece que vai tomar uma fatia considerável do mercado do Tauri
    Agora, por que eu usaria Tauri?
    Na maioria das conexões de internet, um aumento de 150 MB no tamanho do bundle significa só uma diferença de 1 a 10 segundos no download, e em troca você ganha um mecanismo de renderização confiável

    • O Deno também, ao executar código TypeScript, por padrão apenas remove as anotações de tipo
      Se quiser checagem de tipos, é preciso rodar com deno run --check ou usar separadamente o subcomando deno check
      Durante o desenvolvimento isso geralmente não é um grande problema, porque a IDE costuma fazer checagem de tipos e lint automaticamente
    • O Tauri não te prende a um ecossistema JavaScript específico
      Na verdade, você nem precisa usar JavaScript
      E já vimos várias startups de frameworks para desenvolvedores, como Astro, Nuxt, UV, Bun e Vite, serem adquiridas
      Para software que precisa ser mantido e receber suporte por anos, esse tipo de movimento não inspira muita confiança
    • Eu uso Tauri quando o “backend” não é JavaScript
    • Não entendi muito bem essa história de ganhar um “mecanismo de renderização confiável”
      Deno Desktop e Tauri não usam ambos a webview do sistema?
    • Seguindo essa lógica, então é o mesmo que dizer para usar Electron
      Por que usar isso e não usar Electron?
  • Entre os materiais divulgados pelo Deno, a seção de comparação foi a que eu mais gostei
    Na última linha, o suporte a iOS/Android aparece como “no” para o Electron e “not yet” para o Deno; se eles realmente conseguirem fazer isso, vai ser algo bem maior

  • Parece muito bom para distribuir jogos web como apps da Steam ou apps para compras online
    Pretendo testar