NVM 설치 후 터미널이 느리게 뜨는 문제 해결

작성: 2023.03.18

수정: 2023.03.18

읽는시간: 00 분

Development/Daily Error

반응형

문제

node.js 를 여러가지 버전을 변경해가며 사용하기 위해 NVMNode Version Manager를 설치했습니다. 그런데 맥북에 설치했을때도 그렇고 리눅스 환경에 설치했을때도 공통적으로 터미널을 실행 했을 때 준비되는 시간이 굉장히 길어졌습니다.

보통 터미널을 켜고 바로 명령어를 입력하곤 했는데, 터미널이 온전히 로딩되기 전에 키입력이 되는 상황이 반복되었습니다.

시간을 측정 해 보면

start=$(gdate +%s.%3N)
## 시간을 측정할 작업  
end=$(gdate +%s.%3N)
runtime=$(echo "($end - $start) * 1000" | bc)
echo "Execution time: $runtime milliseconds"

image-20230318093120482

NVM을 로딩하는데만 보통 500ms 정도가 걸립니다. 불편함을 쉽게 체감할만큼 충분히 긴 시간입니다.

원인

기본적으로 nvm을 설치 하면 쉘 설정에 아래와 같은 내용이 추가됩니다.

image-20230318084205819

그 중 [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh 을 실행하는 과정에서 대부분의 시간이 소요됩니다.

항상 터미널을 켤 때마다 NVM을 사용하는것도 아닌데 저 긴 시간을 매번 동기로 기다리는건 심각한 낭비입니다.

해결

필요할 때 NVM을 로딩 하는 LAZY Loading 을 해주면 됩니다.

변경 전

${code:~/.zshrc}

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

변경 후

${code:~/.zshrc}

export NVM_DIR="$HOME/.nvm"
nvm() {
  unset -f nvm
  [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
  nvm $@
  [ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"
}

이렇게 변경 하면 굉장히 빨리 뜨는데요, 대신 nvm이 로딩이되지 않아서 node 명령어도 쓸수가 없습니다. nvm 명령이 한번 실행 된 후에야 node를 불러오기 때문입니다. 마찬가지로 npm도 바로 실행이 되지 않습니다.

image-20230318094210642

node 명령어를 사용하기 위해서는 nvm lazy loading이 먼저 이루어 져야 하는 상황

한번 더 스크립트를 변경 해 줍니다. 이번에는 node 혹은 npm을 실행 할 때도 nvm을 lazy loading 하도록 해 줍니다.

${code:~/.zshrc}

export NVM_DIR="$HOME/.nvm"
lazy_load_nvm() {
  unset lazy_load_nvm
  unset -f node
  unset -f npm
  unset -f nvm
  [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
}
nvm() {
    lazy_load_nvm
    nvm "$@"
}
node() {
    lazy_load_nvm
    node "$@"
}
npm() {
    lazy_load_nvm
    npm "$@"
}
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"

unset 을 할 때 force 옵션을 주지 않으면 무한루프에 빠져서 스턱상태에 되더라고요.. 한참을 이것 저것 바꿔 보니 이렇게 설정했을때 가장 이상적으로 동작 했습니다.

이제 터미널을 켤 때 바로바로 뜨기 때문에 불편함이 해소 되었으며, nvm 이나 node 관련 명령어를 최초 입력 할 때 lazy-loading이 되어 명령어 입력에도 아무런 불편이 없습니다.

이상입니다.

References

반응형