Compilando Typescript/Javascript para executáveis nativos com Deno

Compilando Typescript/Javascript para executáveis nativos com Deno

O Deno tem evoluído muito rápido, e cada dia vem trazendo novas features que o deixam cada vez mais interessante, na versão 1.6 que saiu dia 8/12/2020 foi introduzida, entre outras features (como o suporte experimental aos novos macs com chips M1), essa nova funcionalidade que permite gerar um executável nativo standalone and self contained. Algo semelhante ao que libs como nexe e pkg fazem com o node, porém de forma integrada.

Na versão seguinte, a 1.7 lançada em 19/01/2021, tivemos ainda algumas melhorias que incluem a possibilidade de fazer compilação cruzada de qualquer arquitetura estável suportada (Windows x64, MacOS x64 e Linux x64) para qualquer outra arquitetura, o que possibilita criar binários para Windows ou Mac a partir de uma máquina linux por exemplo. Outra feature muito interessante incluída na nova versão foi a flag “—lite” que pode gerar um executável entre 40/60% menor.

Caso já tenha instalado versões anteriores do Deno pode fazer a atualização usando o comando "deno upgrade", porém caso esteja fazendo a instalação pela primeira vez, pode usar os seguintes comandos a depender do seu sistema operacional:

Using Shell (macOS and Linux)
1
curl -fsSL https://deno.land/x/install/install.sh | sh
Using PowerShell (Windows)
1
iwr https://deno.land/x/install/install.ps1 -useb | iex 
Using homebrew (MacOS)
1
brew install deno
Using Scoop (Windows)
1
scoop install deno
Using Chocolatey (Windows)
1
choco install deno
Build from source using cargo
1
cargo install deno

Um dos pontos que me agradam bastante no ecossistema do Deno é que ele busca, provavelmente inspirado em outros ecosistemas como o de Go ou Rust, prover todo um pacote nativo completo com ferramentas para formatação (deno fmt) e Lint (deno lint) por exemplo, com a versão 1.6 foi incluído o compile, que é o responsável por prover essa nova feature, tema deste artigo.

Como usar o compile

Para testar a ferramentas nada melhor que um hello world, assim:

1
echo "console.log('Hello World')" > index.ts

Para compilar esse arquivo é bem simples, basta executar o seguinte comando:

1
deno compile --unstable index.ts

O executável gerado por essa compilação:

-rwxrwxrwx 1 ronaldo staff 44M Feb 4 10:26 compile

Porém usando a nova flag “—lite” da versão 1.7 o executável é reduzido consideravelmente como pode ser visto abaixo:

1
deno compile --unstable --lite index.ts

Gerando o seguinte executável:

-rwxrwxrwx 1 ronaldo staff 30M Feb 4 10:24 compile

Comparando com soluções similares do ecosistema node

Como referência vamos fazer o mesmo teste usando uma solução similar no node o pkg.

Para instalar o pkg basta executar:
1
npm install -g pkg
Gerando o mesmo arquivo .js para compilação
1
echo "console.log('Hello World')" > index.js
Para compilar
1
pkg --targets node14-macos-x64 index.js --output compile

O que resulta em um executável consideravelmente maior, mesmo se comparado a versão completa do Deno, como pode ser visto abaixo:

-rwxr-xr-x 1 ronaldo staff 69M Feb 4 10:40 compile

Nem só de Hello World vive uma solução :)

A própria equipe do Deno disponibiliza um exemplo de aplicação que sobe um servidor http e pode ser uma boa referência, para compilar e gerar o executavel, basta executar os comandos:

Compilando
1
deno compile --unstable --allow-net=0.0.0.0:8080 --allow-read=. https://deno.land/[email protected]/http/file_server.ts --cors --port 8080
Executando
1
./file_server

HTTP server listening on http://0.0.0.0:8080/

Limitações atuais do compile do Deno

O compile do deno ainda não é uma ferramenta perfeita, e tem limitações claras que precisam ser levadas em consideração ao usá-la, algumas delas já estão mapeadas e tendem a ser resolvidas em breve, segue abaixo algumas das limitações:

  • Os Web Workers não são suportados atualmente. #8654 .
  • Você não pode incluir código dinamicamente com importação dinâmica. #8655 .
  • A personalização de sinalizadores V8 e permissões de sandbox não é possível atualmente. #8656 .

Conclusão

O Deno tem trilhado um caminho muito interessante, o compile é só mais uma pimenta que com certeza agrega muito ao ecosistema que vem sendo criado ao entorno do Deno. É evidente que ele ainda tem um chão para amadurecer e ganhar “músculos”, mas me agrada os caminhos e as possibilidades que abrem com essa visão do time core do Deno.

E ai o que acharam dessa nova feature?

Comentários

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×