desenvolvimento

Acelerando o ZSH com lazy loading para o NVM

V1PERFX 2 min de leitura

O terminal (zsh) que uso no macOS estava demorando muito para iniciar. Um shell não deveria levar vários segundos para abrir. Pode parecer pouco tempo isoladamente, mas quando você abre novas abas de terminal o tempo todo, acessa servidores via SSH e até abre o VS Code, isso fica extremamente perceptível, e olha que eu uso pouco o Mac.

Tentando decifrar o motivo, busquei na internet alguma coisa para medir quanto tempo o zsh leva para iniciar, até que achei esse comando:

time zsh -i -c echo

No meu caso, eu estava vendo algo assim no macOS:

zsh -i -c echo 8,06s user 2,70s system 115% cpu 9,314 total

Quase 10 segundos só para abrir o shell.

Achei que poderia ser algo com o terminal do macOS e, ao trocar o meu .zshrc, o tempo de inicialização caiu para algo próximo de 0,10 segundos. Isso deixou claro que o problema não era o shell em si, mas sim algo na minha configuração.

Comecei a verificar as linhas uma a uma, achando que poderia ser alguma configuração do Oh My Zsh, e consegui achar o culpado: o NVM.

Isso acontece porque eu estava usando o NVM instalado pelo script padrão install.sh. Buscando mais alguém que estivesse com esse mesmo problema, achei algumas pessoas falando que isso funciona bem no bash, mas detona o tempo de inicialização no zsh.

Corrigindo isso

Para resolver o problema, utilizei o projeto zsh-nvm, que possui a funcionalidade de lazy loading, ou seja, o NVM só é inicializado quando eu executo algum comando relacionado ao Node pela primeira vez.

Eu poderia usar o plugin do nvm para Oh My Zsh, mas para esse caso queria algo mais próximo do original. Então segui o caminho mais simples: baixei o script zsh-nvm.plugin.zsh diretamente para a minha pasta home.

Renomeei o arquivo para .zsh-nvm.zsh.

Em seguida, comentei as linhas de inicialização automática do NVM no meu .zshrc:

# export NVM_DIR="$HOME/.nvm"
# [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
# [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

E adicionei estas linhas:

export NVM_LAZY_LOAD=true
export NVM_AUTO_USE=false
export NVM_COMPLETION=true
source "$HOME/.zsh-nvm.zsh"

Antes

time zsh -i -c echo
zsh -i -c echo 8,06s user 2,70s system 115% cpu 9,314 total

Depois

time zsh -i -c echo
zsh -i -c echo 2,13s user 0,69s system 111% cpu 2,531 total

O resultado foi uma redução drástica no tempo de inicialização do shell, tornando o terminal muito mais responsivo no uso.

← voltar aos logs