Carregue variáveis de ambiente do jeito moderno no Node

O Node ganhou suporte nativo para carregar arquivos .env sem precisar da biblioteca dotenv. Entenda como funciona e como usar tanto em JavaScript quanto em TypeScript.


No universo JavaScript existe uma cultura forte de resolver tudo com biblioteca. Precisa de alguma coisa, procura uma lib que já faça, instala e segue o jogo. Isso tem um lado bom, mas também traz muito código junto pra resolver, às vezes, uma besteirinha. E o interessante é que em algumas situações já dá pra evitar essa dependência, inclusive de forma mais simples do que usar a biblioteca.

Um exemplo bem prático disso é como a gente carrega variáveis de ambiente no Node.

O que é uma variável de ambiente

Se você não conhece, uma variável de ambiente é um lugar no seu projeto onde você guarda informações sensíveis: chave de acesso de uma API, senha de banco de dados, esse tipo de coisa que não é legal deixar exposta no código.

Geralmente essas informações ficam em um arquivo .env, que fica no .gitignore. Ou seja, se você sobe o projeto num repositório público, esse arquivo não vai junto, porque ele deve existir só na sua máquina ou na máquina que vai rodar o projeto.

Um .env de exemplo:

SENHA_SECRETA=12345

O jeito antigo: biblioteca dotenv

Durante muito tempo, a forma padrão de carregar isso no Node era usando a biblioteca dotenv. Ela ainda é extremamente usada hoje, tanto que soma quase 60 milhões de downloads semanais. Funciona assim:

require("dotenv").config();
 
console.log(process.env.SENHA_SECRETA);

A função config() procura o arquivo .env no projeto, carrega as variáveis dentro de process.env e pronto, você tem acesso a elas. Funciona bem, mas depende de uma dependência externa só pra isso.

O jeito moderno: nativo no Node

A partir da versão 20 (mais especificamente 20.6), o Node passou a suportar isso nativamente, sem precisar de nenhuma biblioteca. Basta passar uma flag na hora de rodar o comando:

node --env-file .env src/test.js

Com isso, o .env é carregado automaticamente antes do script rodar, e o próprio test.js já tem acesso a process.env.SENHA_SECRETA sem precisar dar require em nada.

Se você tirar a flag e rodar só node src/test.js, a variável aparece como undefined, porque o Node não sabe onde procurar o arquivo. Basta devolver a flag pra funcionar de novo.

E com TypeScript?

Funciona do mesmo jeito. Se você estiver rodando os arquivos com tsx, por exemplo, o comando fica assim:

tsx --env-file .env src/test.ts

E no código, o acesso à variável é igual:

const senha: string = process.env.SENHA_SECRETA as string;
 
console.log(senha);

Vale a pena trocar?

Esse recurso já tem mais de dois anos e, mesmo assim, ainda é pouco usado no mercado comparado ao dotenv. Mas é a forma mais moderna e nativa de fazer isso, sem adicionar mais uma dependência ao projeto só pra ler um arquivo .env. Se o seu projeto já está numa versão recente do Node, vale trocar.