Hello World, Deno!

Uhul! Saiu oficialmente a primeira vers√£o da nova runtime Deno ūü¶ē

Escrito por Myreli em May 16, 2020 · 16 mins de leitura

WTF is Deno?! ūü¶ē

Uhul! Saiu oficialmente a primeira vers√£o da nova runtime Deno ūü¶ē

Essa é a primeira parte de uma série de artigos sobre Deno:

  1. Hello World, Deno! - Parte I você está aqui
  2. Hello World, Deno! - Iniciando uma aplicação - Parte II em breve
  3. Hello World, Deno! - Visitando APIs Web - Parte III em breve
  4. Hello World, Deno! - Visitando APIS Nativas - Parte IV em breve
  5. Hello World, Deno! - Considera√ß√Ķes finais Parte V em breve

Com suporte nativo a JavaScript e TypeScript, utilizando a engine V8 e construído em Rust, acho que Deno tem tudo pra decolar:

  • Constru√≠do com seguran√ßa por padr√£o;
  • Instala√ß√£o extramente simples e entregue em um √ļnico, muito pequeno, arquivo execut√°vel;
  • Funcionalidades pr√≥prias de inspe√ß√£o, formata√ß√£o e uma esp√©cie de curadoria de m√≥dulos;
  • M√≥dulos de arquivos super simples e r√°pidos, suporte a WebAssembly, customiz√°vel e bem estruturado;
  • Sem reinventar a roda: se existem APIs bem estruturadas e com performance satisfat√≥ria na Web, Deno traz ela para a runtime;
  • Erros exibidos de forma clara e com sugest√Ķes de a√ß√£o;
  • Focado em produtividade e simplicidade: olhem o c√≥digo fonte √© limpo e objetivo. √Č simples. √Č claro. ūü¶ē;
  • E uma imagem muito linda (que utilizei como capa dessa postagem, espero que isso n√£o d√™ problemas)

DeNo <=> NoDe

Antes de começar a bisbilhotar o ecossistema Deno, vamos falar sobre Node.

Node está cada vez mais famoso e com uma comunidade cada vez maior e mais sólida, inclusive no ambiente corporativo. No entanto, Node tem vários problemas, todo mundo sabe disso.

Ok, talvez n√£o seja todo mundo que sabe disso, ent√£o para citar alguns problemas:

  • grande demora na ado√ß√£o das novas vers√Ķes de ECMAScript;
  • sem suporte ao TypeScript;
  • consideravelmente devagar;
  • documenta√ß√£o extensa;
  • implementa√ß√£o complexa;
  • p√©ssimo gerenciamento de depend√™ncias.

N√£o apenas isso, mas montar um ambiente de desenvolvimento no Node exige muita ‚Äúgarimpagem‚ÄĚ. Quase nenhum desenvolvedor Node sabe utilizar Node (estranho, mas ver√≠dico). A maioria sabe utilizar express e um template pr√©-pronto com Babel, Webpack, ESLint, Prettier e toda a parafern√°lia necess√°ria.

E tamb√©m √© muito dificil para um desenvolvedor de outras linguagens se adaptar ao ecossistema, principalmente algu√©m mais j√ļnior.

Deno bebendo l√°grimas do Node.js

Isso não torna o Node ruim e impossível de utilizar, é claro, e apesar de tudo é uma boa opção em vários casos - o maior problema dos projetos em Node são os programadores.

Mas √© problem√°tico por natureza e inclusive o pr√≥prio criador j√° falou sobre isso. Por isso ele pr√≥prio resolveu ‚Äúcome√ßar de novo‚ÄĚ, com decis√Ķes mais maduras e com op√ß√Ķes mais robustas (como a troca de C++ por Rust). Por isso ele criou Deno, que al√©m de fazer um trocadilho com Node, traz todo o poder do JavaScript para fora do browser, mas com muita coisa muito bacana extra.

Enfim, eu não odeio Node.js, juro. Mas… eu também não gosto muito. Agora, com Deno, finalmente me senti confortável com JavaScript fora do browser. Pela primeira vez considero utilizar outra linguagem que não Python para meus scriptzinhos.

E, no geral, eu não ficava tão animada com uma tecnologia nova assim em meses. Sério, vale a pena dar uma chance.

Referências

Se você não faz ideia do que eu estou falando aqui e nunca ouviu falar de Deno, vale muito a pena dar uma passadinha pelo site Deno Land (em inglês) bonitinho que apresenta tudo muito melhor do que eu jamais poderia.

E, principalmente, outra recomendação é ler o artigo muito legal que foi postado anunciando o lançamento oficial no próprio site.

Nessa série eu vou compartilhar os primeiros passinhos de bebê em Deno 1.0.0 que estou dando e principalmente apresentar o potencial.

Ah, absolutamente tudo aqui foi extraído do site oficial e da documentação da API (abre a documentação, o carregamento é maravitop) =D

Agora chega de devaneios (he-he). Bora l√°?

Get Started

Nota: para seguir estes passos é necessário que você esteja confortável com JavaScript para entender o que está acontecendo. Se quiser, pode tentar acompanhar, mas seria legal você saber algumas coisinhas antes. Caso você não sinta que sabe o suficiente pode ver essa excelente (Re) Introdução ao JavaScript criada pela Mozilla e aí voltar aqui :)

Nota 2: Deno tem apenas 2 aninhos de idade e sua primeiríssima versão foi lançada agora - poucos dias antes de eu começar a escrever este artigo. Por isso ainda não é recomendado para produção.

Nota 3: eu utilizo uma distribuição Unix e o Zsh, então podem existir divergências se você tentar reproduzir os mesmos passos na sua máquina. Eu vou tentar descrever os passos de tudo, mas recomendo utilizar WSL se estiver no Windows… e o zsh tem o incrível oh-my-zsh, então para que você gostaria de ficar no bash mesmo? =D

Instalação

Quando comentei que era instalação fácil e apenas um arquivo executável, não era brincadeira. Para instalar do site oficial basta um comando para executar o arquivo executável (ha-há):

Se você utiliza Linux, macOS ou qualquer Unix com shell:

# shell / unix
curl -fsSL https://deno.land/x/install/install.sh | sh

Já se você utiliza Window com powershell (mas, sério, dá uma chance para WSL)

# powershell / windows
iwr https://deno.land/x/install/install.ps1 -useb | iex

E é isso. Mesmo. Um script super leve e pronto. Você deve ter tido um resultado semelhante a este no terminal:


######################################################################## 100,0%##O=#  #         ######################################################################## 100,0%
Archive:  /home/myreli/.deno/bin/deno.zip
  inflating: deno                    
Deno was installed successfully to /home/myreli/.deno/bin/deno
Manually add the directory to your $HOME/.bash_profile (or similar)
  export DENO_INSTALL="/home/myreli/.deno"
  export PATH="$DENO_INSTALL/bin:$PATH"
Run '/home/myreli/.deno/bin/deno --help' to get started

√Č muito importante notar que o deno, por padr√£o, n√£o faz nada que n√£o tenha sido explicitamente solicitado, isso faz parte da sua natureza de seguran√ßa. Ou seja: nada de mexer no seu sistema sem voc√™ saber.

Por isso, é necessário fazer uma configuração de variáveis de ambiente para ter deno na pontinha dos dedos de forma prática:

# salvar vari√°veis de ambiente no shell zsh
echo -n 'export DENO_INSTALL="/home/myreli/.deno"' >> ~/.zshenv 
echo -n 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.zshenv
# recarregar as configura√ß√Ķes
source ~/.zshenv

Se você utiliza Powershell: é algo assim $env:NOME_DA_VAR = 'Valor' Ou bash: basta trocar o caminho do arquivo de configuração ~/.bash_profile

Finalmente, vamos testar a instalação:

deno --version

Isso mostra as vers√Ķes de deno, da engine V8 e do TypeScript instaladas. Para ver os comandos dispon√≠veis e a documenta√ß√£o basta utilizar:

deno --help <comando>

E finalmente, se voc√™ deseja atualizar (futuramente), tamb√©m √© bastante simples e basta executar deno upgrade. Se voc√™ utiliza VSCode, existe essa extens√£o maneira aqui: VS Code Deno. Se voc√™ utiliza outro editor ou IDE, gostaria muito de ler suas raz√Ķes para tal.

Bom… Agora podemos começar a brincar de verdade.

Ol√°, Deno!

Para abrir um console interativo (para quem utiliza Python, é bem semelhante) basta digitar deno e o console vai abrir, dessa forma:

E a√≠ voc√™ pode utilizar todo o poder de JavaScript a√≠, como no Node, mas de forma muito mais r√°pida e com atualiza√ß√Ķes muito mais frequentes =D

Para testar vamos começar com o famoso Hello World e ver o que acontece. Como você faria no console do navegador, abra aspas e coloque sua string de Olá, mais ou menos assim:

Maravilha. Agora você tem todo o poder do JavaScript aí no seu terminal, pode experimentar.

Para encerrar o console interativo, use a combinação de teclas ctrl d e vamos tentar executar um programa de exemplo do site oficial. Para isso, precisamos utilizar a interface de linha de comando deno com o comando run passando a URL do programa que você quer executar.

Isso mesmo, a URL. As refer√™ncias e importa√ß√Ķes funcionam com URLs em Deno, realmente trazendo o poder do browser e uma padroniza√ß√£o j√° completamente enraizada.

Experimenta aí: deno run https://deno.land/std/examples/welcome.ts. Top, né? Então, como disse a mensagem, bem vindo ao Deno :)

Primeiramente Segurança

‚ÄúSegundamente‚ÄĚ primeiramente.

O que fez a web se popularizar? Links. A habilidade de ficar atravessando de uma informação para a outra através dos conhecidos hiperlinks foi o pontapé inicial para toda essa popularidade que temos hoje. Se você não sabia disso eu recomendo muito este artigo aqui.

Ent√£o, vamos ver como podemos recuperar informa√ß√Ķes acessando ‚Äúlinks‚ÄĚ, mas utilizando servi√ßos de dados que n√£o respondem HTML mas, sim, JSON.

Experimente a URL https://www.potterapi.com/v1/sortingHat/ no seu navegador. Vai retornar a qual casa você pertence no universo de Harry Potter, em homenagem a pessoinha que me fez maratonar a saga inteira pela primeira vez em 21 anos de vida.

Então, como faríamos para obter essa mesma informação através de uma aplicação rodando em Deno? Vamos utilizar o exemplo de curl oficial, dessa forma:

deno run https://deno.land/std/examples/curl.ts https://www.potterapi.com/v1/sortingHat/

√Č, n√£o funcionou. Mas por qu√™?! Seguran√ßa, √© claro.

Para que nosso dinossauro acesse a internet e se comunique com o mundo, precisamos permitir que ele faça isso. Experimente chamar passando a correta permissão --allow-net=www.potterapi.com:

Gryffindor! (E eu juro que foi de primeira).

√Č necess√°rio permitir explicitamente todas as opera√ß√Ķes sens√≠veis, como acesso a rede, ao sistema de arquivos, etc‚Ķ A √ļnica exce√ß√£o √© para as importa√ß√Ķes de m√≥dulos a partir da URL, a runtime permite o acesso quando √© necess√°rio depend√™ncias adicionais e fazer o cacheamento delas.

‚ÄúBem s√™nior, n√© meu?‚ÄĚ

Se alguém já viu algum vídeo do Erick Wendel, ele menciona bastante essa frase haha. E pensei bastante nela enquanto navegava pelos fontes de Deno.

Todas as implementa√ß√Ķes s√£o simples e seguem o principio de responsabilidade √ļnica. J√° tentou fazer uma requisi√ß√£o nativamente em Node? √Č beeem feio. E n√£o entendo a necessidade, quando no JavaScript nos browsers j√° tem a fetch. Acho que Deno tamb√©m pensa assim, pois esse √© justamente o exemplo no site.

Lembro que uma vez, quando ainda era estagi√°ria, meu amigo falou ‚ÄúEu vi o c√≥digo do nosso l√≠der‚Ķ n√£o tem nada demais‚ÄĚ. Na √©poca ri, mas depois fiquei pensando: o que teria demais? O que seria o c√≥digo de um s√™nior? Deveria ser super complexo e imposs√≠vel de ler sendo um mero mortal?

Muito pelo contrário, deve ser ainda mais legível e simples. (Mas isso fica para outro post, quem sabe.) E Deno faz justamente isso, combinando simplicidade com legibilidade, segurança e performance.

Por isso existem as Web APIs (que seguem os mesmos contratos das APIs da Web) e as APIs próprias, que são as que não são sólidas ou não existem na Web, e estão disponíveis em deno.

Advinha uma coisa bem sênior, né meu? em Deno? Não existe node_modules! Eu detesto essa parte do Node então fiquei bem feliz hahaha. Deno faz um gerenciamento de cache otimizado, utilizando a configuração de cache do sistema operacional. Yep. Sem node_modules vagando por aí enchendo espaço. Sem mais zips enormes porque alguém esqueceu de deixar de fora. Velocidade e agilidade.

Desenvolvendo

Ok, conseguimos sentir as possibilidades, mas ainda não fizemos nada parecido com o comum. Como a gente inicia um projeto, cadê os arquivos e a estrutura que estamos acostumados? Vamos lá.

Primeiro, crie um arquivo vazio TypeScript (ou JavaScript, se voc√™ prefere) chamado ‚Äúhello‚ÄĚ com a extens√£o desejada.

No shell, é possível fazer isso utilizando o comando touch hello.ts. Agora, dentro do arquivo, escreva um oi para você mesmo:

console.log('Hello ūü¶ē')

Salve o arquivo e execute-o: deno run hello.ts. √Č isso. S√©rio mesmo :)

E por hoje é isso! =D

Inicialmente o artigo era bem maior, mas achei que ficaria mais bacana fragmentar ele em diversas partes para facilitar a leitura. Então gentilmente convido você a ficar atento para a próxima postagem, em que vamos colocar a mão na massa de verdade e construir uma aplicação com Deno.

(spoiler) Isso é o que vamos construir no próximo artigo:

Escopo da aplicação que vamos construir no próximo artigo

Muit√≠ssimo obrigada por ter chego at√© aqui! Espero que tenha curtido essa viagem e que tenha sido √ļtil de alguma forma. De qualquer forma, coment√°rios s√£o muito bem vindos na se√ß√£o de coment√°rios no fim da p√°gina.

Ah! Para receber uma notificação toda vez que um novo artigo é publicado (inclusive o próximo sobre Deno), deixe seu e-mail na caixa abaixo.


Quer mais artigos como este direto na caixa de entrada?