NVM x FNM: Comparando gerenciadores de versão Node.js.


Há alguns dias, encontrei uma postagem no meu feed do LinkedIn falando sobre fnm, uma ferramenta desenvolvida com Rust para gerenciamento de versão de Node.js que prometia desempenho mais rápido do que nvm, a ferramenta que uso há anos.

Infelizmente, não consegui encontrar a URL original da postagem para linkar aqui, mas vou resumir seus pontos e compartilhar minhas ideias depois de usar o fnm por alguns dias em vez do nvm.

Normalmente não caio no hype em torno das novas tecnologias, mas esta foi a primeira vez que realmente vi o poder do Rust. A postagem mencionava algo como “seu terminal pode estar lento por causa do NVM” e isso me fez pensar. Durante a maior parte da minha carreira, não tive um computador super poderoso, mas recentemente comprei um MacBook Pro M1 Max com 32 GB de RAM – uma super máquina! Apesar das especificações, ainda percebi que meu terminal demorava para carregar na primeira vez, embora após o carregamento inicial funcionasse rápido.

Com isso em mente, decidi dar uma chance ao fnm.

Desinstalando o NVM

Primeiramente, tive que desinstalar o nvm. Sinceramente, foi um pouco complicado, mas o seguinte comando resolveu o problema:

rm -rf $NVM_DIR ~/.npm ~/.bower

Então removi qualquer menção ao nvm em meu arquivo .zshrc e executei:

source ~/.zshrc

Isso garantiu que o nvm fosse completamente removido da minha máquina e que o terminal pudesse carregar a nova configuração.

Instalando o FNM

Instalar o fnm foi muito simples. Basta executar o seguinte comando em seu terminal:

curl -fsSL https://fnm.vercel.app/install | bash

Configurando o Shell

Após a instalação, tive que terminar a configuração do meu shell. Como uso Oh My Zsh, adicionei esta linha:

eval "$(fnm env --use-on-cd --shell zsh)"

Agora que o fnm está configurado, tudo estava pronto para instalar a versão do Node.js que queria e começar a usá-lo:

fnm install --lts

Pela minha experiência, os comandos do fnm são muito semelhantes aos do nvm, mas o fnm é feito com Rust por debaixo dos panos, o que o torna mais rápido e eficiente, especialmente durante a inicialização do terminal.

Você pode conferir a lista completa de comandos na documentação oficial.

Antes de mudar para fnm, o tempo de inicialização do meu terminal com nvm era de cerca de 2 ou 3 segundos. Depois de mudar para o fnm, o terminal carrega quase instantaneamente, como você pode ver abaixo:

NVM x FNM: a tecnologia por trás de cada ferramenta

NVM (Node Version Manager)

O NVM tem sido uma ferramenta essencial para gerenciar versões do Node.js há muito tempo. Ela é escrita em Bash, uma linguagem de script de shell e opera manipulando as variáveis ​​de ambiente do seu shell sempre que você alterna entre as versões do Node.js. Embora funcione muito bem, o fato de ser escrito em Bash pode introduzir latência, especialmente em cenários com muitas versões ou ambientes de shell lentos.

FNM (Fast Node Manager)

Por outro lado, o FNM é construído com Rust, uma linguagem de programação de sistemas conhecida por sua velocidade e eficiência de memória. Os benefícios de desempenho do Rust são imediatamente perceptíveis: o fnm não apenas lida com o gerenciamento de versões mais rapidamente, mas também executa comandos com menor sobrecarga em comparação com o nvm baseado em Bash. Isso torna o fnm uma escolha atraente para quem precisa de um gerenciador de versões do Node.js mais rápido e responsivo, especialmente para máquinas modernas com várias versões do Node.js instaladas.

Conclusão

Depois de usar o fnm por alguns dias, posso dizer com segurança que é uma alternativa mais rápida e eficiente ao nvm, especialmente se você priorizar o desempenho durante a inicialização do terminal. O fato de ser escrito em Rust traz um aumento significativo de desempenho, e a sintaxe do comando é familiar para quem já está acostumado com nvm. Se você ainda não experimentou, recomendo fortemente que experimente.