Runtimes JavaScript [pt-br]
Tags: braziliandevs, javascript, beginners
Published: 2023-01-17 15:11:00


Para desenvolver e/ou rodar uma aplicação local JavaScript você precisa instalar um _Runtime_ localmente.

## Mas o que é um _runtime_?

A palavra em si pode significar muitas coisas na área da computação. Porém um significado em específico será utilizado aqui, que é o de ambiente de _runtime_.

Este ambiente de _runtime_ é a base, a interface que lida entre seu programa e a máquina, que pode ser local, virtual, na nuvem...

Um famoso runtime é o Ambiente de _Runtime_ do Java, do inglês Java Runtime Environment, também conhecido por sua sigla <abbr title="Java Runtime Environment">JRE</abbr>. Simplificando, este é responsável por rodar uma aplicação Java na Máquina Virtual do Java.

Então pro JavaScript teria algo como um ambiente de _Runtime_ JavaScript, certo? SIM! Mas sendo este artigo sobre ferramentas, listarei apenas as que rodam direto numa máquina e não num navegador.

Infelizmente nenhuma ferramenta tem um nome sugestivo sendo sigla do que ele faz. Mesmo porquê teria as mesmas iniciais da _Runtime_ do Java. Mas os desenvolvedores das runtimes foram até que criativos.

## Node.js

Este é o mais famoso _runtime_ JavaScript e um dos primeiros a existir fora do navegador.

Ele foi desenvolvido em cima do [interpretador V8](https://v8.dev/), criado pelo Google, o mesmo interpretador de código JavaScript embutido nos motores de renderização **Blink**, presente em navegadores **Chrome** e outros navegadores baseados na versão de código aberto **Chromium**.

Confuso né?

<figure>
![Abaixo uma caixa com o V8, acima dele uma linha separando verticalmente. De um lado, denominado máquina, tem uma caixa escrito Node.js, do outro lado, denominado navegador, tem duas caixas. Acima, escrito Chrome/Chromium e no meio, Blink](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bifri8ogju87vqawy2p9.png)
<figcaption>Diagrama comparando o navegador com o Node.js</figcaption>
</figure>

Assim tornou-se possível rodar aplicações escritas em JavaScript fora do navegador. E aplicações de diversas naturezas. Aqui abordo ferramentas, porém devido ao seu suporte para diversos sistemas operacionais, o Node também pode ser usado para criar aplicações web para servidores e até mesmo ser utilizado em controle de dispositivos <abbr title="Internet of Things">IoT</abbr>.

Infelizmente este artigo não é focado em desenvolvimento utilizando Node.js. Existem diversos artigos e cursos espalhados pela Internet. Irei focar nos executáveis em si.

## Existem outros _runtimes_ para ambientes JavaScript?

Sim, e citarei duas que estão dominando as discussões ultimamente (no momento de escrita deste artigo).

### Deno

> DENO LOGO

Desenvolvido pelo mesmo criador do Node.js, [Ryan Dahl](https://en.wikipedia.org/wiki/Ryan_Dahl). Escrito em [Rust](https://www.rust-lang.org/) e também tendo como base o motor JavaScript [V8](https://v8.dev/).

A motivação da criação desta nova runtime foram alguns arrependimentos do criador em relação a decisões tomadas quando o Node foi criado. O Deno foi anunciado em 2018, quase 10 anos após o lançamento do Node.

Abaixo o vídeo, em inglês somente, da _talk_ do **Ryan Dahl** com o título de "10 Coisas que me arrependo sobre o Node.js".

{% embed https://youtu.be/M3BM9TB-8yA %}

Dentre estas melhorias:
- Rodar TypeScript e usar <abbr title="EcmaScript">ES</abbr>6 por padrão;
- Não requer um gerenciador de pacote, a resolução de módulos é feita por URLs;
- Melhor controle de permissões...

Em 2020 foi lançada sua primeira versão estável.

### Bun

> BUN LOGO

Já o [Bun](https://bun.sh/), criado em 2021 pelo [Jarred Sumner](https://twitter.com/jarredsumner), tenta ir por outro caminho diferente do Node/Deno.

Ao invés de ter como base o **V8**, o Bun utiliza como base de seu interpretador o [Webkit](https://webkit.org/), presente no navegador **Safari**. E foi programado em [Zig](https://ziglang.org/), outra linguagem de programação _low-code_ voltada a performance, como o **Rust**.

Suporta **TypeScript** e **JSX** por padrão e possui um instalador eficiente compatível com **npm**.

Porém como toda novidade, este _runtime_ ainda está em fase experimental, sem lançamento de uma versão estável.

## Diferenciais

Uma premissa de ambos desde sua concepção foi serem criados com suporte ao TypeScript. Muito do que a linguagem evolui sobre padrões [**EcmaScript** da **TC39**](https://tc39.es/) é também atrelado a este suporte ao **TS**, já que o próprio TypeScript acaba adotando como padrão as evoluções das propostas da **ES**. Logo também é padrão a utilização de **ESModules**.

O **Bun** está em estágio experimental e é o caçula dos runtimes. Podem ter funcionalidades, bibliotecas e ferramentais que ainda não possuam suporte.

Um diferencial que considero legal de se citar do **Deno** é que desde sua criação teve-se uma preocupação maior sobre permissões. Ou seja, ao rodar uma aplicação feita em Deno, é preciso prover explicitamente permissões ao rodar a aplicação. Pode até ser algo que parece irritante durante o desenvolvimento esquecer de dar alguma permissão, porém evita que alguma dependência execute certos scripts, maliciosos ou não.

## Conclusão

Como tanto o **Deno** quanto o **Bun** são runtimes um tanto recentes e não cheguei a estudar profundamente.

Se deseja testá-los, é possível instalá-los utilizando o [asdf](https://asdf-vm.com/). Ambos possuem plugins já criados:

- [asdf-bun](https://github.com/cometkim/asdf-bun)
- [asdf-deno](https://github.com/asdf-community/asdf-deno)

## Links

- [Tudo o que você precisa saber sobre Runtimes JavaScript, em inglês](https://levelup.gitconnected.com/dev-explainer-javascript-runtimes-8e4d1e3af405)
- [Site oficial do Node.js](https://nodejs.org/pt-br/)
- [Página do V8, em inglês](https://v8.dev/)
- [Site oficial do Deno, em inglês](https://deno.land/)
- [Site oficial do Bun, em inglês](https://bun.sh/)

<!--
## Changelog
-->