Deno. Você vai sentir falta do node_modules/

Deno é um novo runtime js/ts e eu tenho visto tanta gente feliz que não precisa utilizar NPM e aquela pasta gigantesca chamada node_modules/ na raiz do projeto. Como isso foi possível? Primeiro ele abandona a ideia de repositório de pacotes central e permite importação de código direto de uma URL (bem similar ao Go).

# Exemplo em Deno. Importando o assertEquals de uma URL
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

assertEquals("hello", "hello");
assertEquals("world", "world");

console.log("Asserted! ✓");
// Exemplo em Go. Importando toda a API publica do pacote uuid da URL do github
package main

import (
	"fmt"	
	"github.com/google/uuid"
)

func main() {
	fmt.Println(uuid.New())
}

Agora já existe algumas questões:

  • Se a API na URL mudar, meu código pode quebrar?
  • Onde foi parar o arquivo/pacote durante a compilação?
  • Como faço o vendoring para deploy em produção?

Se a API na URL mudar, meu código pode quebrar?

Se você já realizou algum deploy em produção de um projeto real de forma “correta” sabe que diversas linguagens possuem algum tipo de arquivo que contem as dependências e suas versões.

  • PHP/composer: temos o composer.json e composer.lock
  • NodeJS/npm: package.json e package-lock.json
  • Go: go.mod e go.sum

E no Deno? Assim como no Go a ferramenta que gerencia é o próprio binário principal. Certo, e qual o arquivo lista e o lock ? Não tem. Você vai precisar definir o nome/local. Beleza, como fazemos isso? Pela documentação oficial é assim:

deno cache --lock=lock.json --lock-write src/deps.ts

lock.json é o nosso arquivo lock e o src/deps.ts é o nosso arquivo que exporta todas as nossas dependências (não irei entrar no mérito de recomendar um deps gigante). A documentação não deixa claro se ocorre a busca automática da versão da API publica correta. O exemplo do arquivo src/deps.ts inclui a versão na URL, lembrando que muitos repositórios usam a branch master como desenvolvimento e recomendam apenas o uso em uma tag especifica.

# src/deps.ts
export { xyz } from "https://unpkg.com/xyz-lib@v0.9.0/lib.ts";

Então resolvemos o problema da mudança da API publica na URL especificando a versão e criando o arquivo lock.json.

Onde foi parar o arquivo/pacote durante a compilação?

Vamos fazer uma citação dos possíveis locais:

  • On Linux/Redox: $XDG_CACHE_HOME/deno or $HOME/.cache/deno
  • On Windows: %LOCALAPPDATA%/deno (%LOCALAPPDATA% = FOLDERID_LocalAppData)
  • On macOS: $HOME/Library/Caches/deno
  • If something fails, it falls back to $HOME/.deno

Você também pode alterar a variável ambiente $DENO_DIR para mudar o comportamento padrão acima. Então o nosso node_modules/ foi parar fora da pasta do projeto (semelhante ao comportamento do Go).

Como faço o vendoring para deploy em produção?

Aqui você deve precisar fazer alguns passos. Vamos começar baixando as dependências:

# Download the dependencies.
DENO_DIR=./deno_dir deno cache src/deps.ts

Execução + checagem de integridade das dependências:

DENO_DIR=./deno_dir deno run --lock=lock.json --cached-only main.ts

Conclusão

Parece que o deploy em produção não vai ser uma área que o Deno vai simplificar, mas vamos ter esperança. Na linguagem Go por exemplo começou com serias restrições no local do projeto e o vendoring não existia (apenas com ferramentas não oficiais). Hoje o Go tem suporte a todos esses pontos e o Deno apesar de ser um pouco chato nesse ponto, já começou anos luz a frente do Go.

A evolução do ecossistema do js é apontado como negativa pela velocidade que tecnologias surgem e morrem, mas isso também acelera a “morte” do que não funciona tão bem. Se você desenvolve apenas usando React e ainda não deu uma olhada no Svelte você vai ficar bem impressionado…

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s