문제
node.js 를 여러가지 버전을 변경해가며 사용하기 위해 NVMNode Version Manager
를 설치했습니다. 그런데 맥북에 설치했을때도 그렇고 리눅스 환경에 설치했을때도 공통적으로 터미널을 실행 했을 때 준비되는 시간이 굉장히 길어졌습니다.
보통 터미널을 켜고 바로 명령어를 입력하곤 했는데, 터미널이 온전히 로딩되기 전에 키입력이 되는 상황이 반복되었습니다.
시간을 측정 해 보면
start=$(gdate +%s.%3N)
## 시간을 측정할 작업
end=$(gdate +%s.%3N)
runtime=$(echo "($end - $start) * 1000" | bc)
echo "Execution time: $runtime milliseconds"
NVM을 로딩하는데만 보통 500ms 정도가 걸립니다. 불편함을 쉽게 체감할만큼 충분히 긴 시간입니다.
원인
기본적으로 nvm을 설치 하면 쉘 설정에 아래와 같은 내용이 추가됩니다.
그 중 [ -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도 바로 실행이 되지 않습니다.
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
'Development > Daily Error' 카테고리의 다른 글
IRODS ) Quota 제한 넘기지 못하도록 강제하기 (0) | 2023.04.11 |
---|---|
Spring Boot 3 에서 MYSQL 의존성 못찾는 경우 (0) | 2023.04.02 |
Safari 에서만 localhost에 쿠키가 저장 안되는 문제 해결 (0) | 2023.02.19 |
[일간에러] Different lower_case_table_names settings for server ('2') and data dictionary ('0'). (0) | 2023.01.07 |
Cannot find a (Map) Key deserializer for type 해결 (0) | 2022.11.17 |