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:
1 | curl -fsSL https://deno.land/x/install/install.sh | sh |
1 | iwr https://deno.land/x/install/install.ps1 -useb | iex |
1 | brew install deno |
1 | scoop install deno |
1 | choco install deno |
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.
1 | npm install -g pkg |
1 | echo "console.log('Hello World')" > index.js |
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:
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 |
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?