Posted on

Dzisiaj wpisów będzie kilka (chyba że zmienię zdanie w połowie pisania kolejnego), bo lubię porządeczek i separację.

Wbrew swojej woli zostałem zmuszony do pracy z okropną technologią, jaką są technologie webowe. Naprawdę wolałbym nie wiedzieć, co to jest node, yarn, i te wszystkie rzeczy, no ale potrzebuje pieniądze, bo ludzie nie chcą mi dawać jedzenia za nic innego. Ponieważ projektów, nad którymi pracuję, jest kilka, a każdy z nich używa dokładnie różnej wersji Node'a od każdej innej, koniecznym stało się użycie kolejnego narzędzia o nazwie nvm - Node Version Manager. Narzędzie bardzo przyjemne w użytku - pisze sobie nvm instal 24 i nvm instaluje Node'a w wersji 24; piszesz nvm use 24 - i wiadomo co.

Jednak to narzędzie ma jeden kluczowy problem. Żeby działało, do pliku ~/.zshrc musiałem dopisać wywołanie skryptu nvm.sh, dostarczonego podczas instalacji. I ten skrypt jest uruchamiany przy każdym otwarciu nowego okna Terminala. I to uruchomienie trwa co najmniej 0,2 sekundy, co po sto pięćdziesiątym razem jest naprawdę irytujące.

Ale od czego są kąkutery? Wiadomo - od hakowania. Oto hakowanie. Taki skrypt wrzucam sobie w sam środek wspomnianego wcześniej pliku .rc:

_lazy_load_nvm() {
  echo -n "Lazy loading NVM... "
  unset -f node npm nvm yarn
  if [ -s "/opt/homebrew/opt/nvm/nvm.sh" ]; then
    . "/opt/homebrew/opt/nvm/nvm.sh"
  fi
  if [ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ]; then
    . "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"
  fi
  echo "done!"
  "$@"
}

node() { _lazy_load_nvm node "$@"; }
npm() { _lazy_load_nvm npm "$@"; }
nvm() { _lazy_load_nvm nvm "$@"; }
yarn() { _lazy_load_nvm yarn "$@"; }

Co tu się dzieje? Cztery funkcje na dole "zasłaniają" na chwilę odpowiednie programy, by najpierw wymusić załadowanie nvm w funkcji _lazy_load_nvm. Nasza leniwie ładująca funkcja pierwsze co robi, to "odsłania" na powrót wspomniane programy, następnie robi co do niej należy, i zwraca sterowanie. Kolejne uruchomienie programu już będzie działać normalnie, ponieważ programy są już odsłonięte, wszystko jest załadowane.

A czas jest zaoszczędzony.