npm logoCo to jest npm już swojego czasu pisałem. Teraz pora jednak zagłębić się w sposób optymalizacji dość prozaicznego zapytania – npm install. Które jak wiadomo, jest odpowiedzialne za zainstalowanie wszystkich możliwych paczek zdefiniowanych w package.json we wszystkich jego sekcjach – depedencies, devDepedencies, peerDepedencies, optionalDependencies (takie które nie są wymagane by paczka działała).

Widać tego jest trochę, a jeżeli pomyślimy, że to także tyczy się wszystkich zależnych paczek, to nasza lista paczek, które zostaną zainstalowane rośnie niebywale. Taka operacja może trwać bardzo krótko, jak i do kilkunastu minut. Jeżeli do tego dodamy kroki które czasami są wykonywane po ściągnięciu paczki (jak na przykład jej optymalizacja pod określony system), to po niektórym npm install możemy sobie pójść na całkiem długi spacer.

Teraz, wykonywanie tego na projekcie lokalnym, raz, na wielkie święto może być akceptowalne, i nawet jest – trzeba to tylko dobrze z automatyzować byśmy nie musieli nic klikać po pobraniu repo i tyle. Jeżeli jednak coś takiego musi być wykonywane co push na build serverze to zaczynamy mieć chyba problem. Rozsądnie robimy push raz na 30min do 1h jak mamy jakieś pomniejsze taski. To teraz, push co 30 min i jeden krok buildu trwa 30min, to ile pushów potrzeba by zatkać kolejkę? :)

W tej jak i następnych częściach postaramy się więc to z optymalizować by czas wykonania tego nie był aż taki zabójczy dla nas.

–no-optional

Pierwsza opcja umożliwia nam instalowanie paczek z pominięciem sekcji optionalDependencies – jest to dość ważne i pomocne. Dla prostego przykładu, niektóre paczki by zoptymalizować swoje działanie pod dany system mogą chcieć się przekompilować. W tym celu nagle ni-stąd ni-zowąd dostaniemy błąd instalacji gdyż brakuje nam kompilatora VC++ na Windows… albo go mamy w złej wersji (czasami flaga --msvs_version=VS20XX może pomóc).

Jak się okażę, że już mamy kompilator śmigający, to natrafiamy na standardowy problem Windowsy – path is too long. Serio nie potrzebujemy tego. Wystarczy więc że odpalimy

npm install --no-optional

a już, będzie mniej paczek ściąganych, do tego nie będą one wykonywać jakiś kolejnych beznadziejnych operacji jak kompilowania (czas instalacji jeszcze bardziej przyspiesza).

–skip-installed

Ta opcja jest opcją… ukrytą i działa do wersji < 3. To co ona robi, to pomija odpytywanie i ściąganie i robienie czegokolwiek z paczkami które są już zainstalowane i znajdują się w folderze node_modules.

Czyli jeżeli wykonujemy npm install dość często, to jest to idealna opcja dla nas :) Ale warto pamiętać, jest to opcja ukryta, do tego niedostępna w npm >=3

–cache PATH

Opcja cache umożliwia określenie miejsca w których wszystkie ściągnięte paczki będą cachowane. Normalnie wszystko nam trafia do cache w lokalizacji:

npm config get cache

Teraz, opcję tę możemy zmieniać globalnie za pomocą komendy cache – jednak będzie ona tyczyła się wszystkich projektów. Jeżeli chcemy by tyczyła się ta opcja tylko jednego projektu, albo per instalacja, to należy podać parametr --cache do komendy instalującej paczki z lokalizacją gdzie te paczki mają być zapisane:

npm install --cache "D:\npm_cache"

Teraz niby możemy sądzić, iż mając cache lokalnie, npm nie będzie próbował się połączyć z serwerem paczek npm. Nic bardziej mylnego, dlatego też mamy ostatnią komendę.

–cache-min VALUE

Minimalna wartość cache oznacza tutaj, że nic młodszego niż VALUE sekund nie będzie pobrane z sieci. Czyli prawie opcja offline, która normalnie działała pod --no-registry ale teraz nie śmiga.

Więc by spowodować by został wykorzystany nasz cache przy instalacji należy wykonać następującą komendę:

npm install --cache "D:\npm_cache" --cache-min 999999

Podsumowanie

Czyli łącząc teraz wszystkie komendy uzyskujemy:

npm install --no-optional --skip-installed --cache "D:\npm_cache" --cache-min 999999

Dzięki temu już zaczynamy mieć całkiem porządnie (szybko) działający npm install. Ale jednak to nie wszystko. W następnej części zoptymalizujemy to jeszcze bardziej, ale nasza główna komenda nie ulegnie zmianie, więc warto ją zapamiętać :)

3 KOMENTARZE

Comments are closed.