Przewodnik po npm: Menedżer pakietów Node.js
Opublikowany: 2022-03-11JavaScript jest z pewnością najczęściej używanym językiem, jeśli chodzi o tworzenie stron internetowych i aplikacji internetowych. Mnogość zasobów jest zdumiewająca, a tym bardziej liczba dostępnych bibliotek.
Na początku tych bibliotek jest niewiele i są one łatwe w utrzymaniu; jednak wkrótce zaczyna się piekło zależności i potrzebne jest bardziej dojrzałe rozwiązanie.
Wpisz Node Package Manager (npm) – menedżer pakietów JavaScript używany najczęściej w połączeniu z Node.js, chociaż może być używany również niezależnie. Daje ci wyjątkową kontrolę nad zależnościami twojego projektu i zapewnia świetny sposób na przyczynienie się do świata open-source.
Aby rozpocząć, wystarczy uruchomić npm install <package name>
i wstrzyknąć go do pliku JavaScript.
Chcesz zainstalować konkretną wersję? Nie ma problemu. Uruchom npm install <package name>@1.2.3
.
Chcesz zainstalować pakiet globalnie (np. Mocha lub Angular-CLI)? Wystarczy dodać -g
w ten sposób: npm install -g angular-cli mocha
.
Trzeba przyznać, że większość przypadków użycia kończy się na instalacji npm i nie ma potrzeby niczego innego. Jednak npm ma mnóstwo dodatkowych funkcji, przez które przeprowadzę Cię, podkreślając te, które uważam za niezbędne, naprawdę przydatne lub po prostu niesamowite.
Polecenia CLI
Interfejs CLI to miejsce, w którym użytkownicy spędzają większość czasu na interakcji z npm, a jego interfejs pomocy jest rzeczywiście pomocny.
Zapytanie o pomoc ( npm help
) wyrzuca całą tablicę opcji, a uruchomienie npm help-search <searchText>
daje listę wyników wyszukiwania bezpośrednio ze znacznika npm.
Oto najważniejsze polecenia, które się wyróżniają.
install
: Jest tu wspomniany ze względu na jego czystą konieczność podczas pracy z npm. Służy do instalowania nowego pakietu lokalnie lub globalnie (podczas dodawania-g
) lub do instalowania zależności wymienionych w plikupackage.json
(więcej na ten temat później).uninstall
: To również jest niezbędne. Służy do usuwania określonego pakietu z katalogunode_modules
lokalnie lub globalnie (podczas dodawania-g
).access
: jest to plac zabaw administratorów uprawnień użytkownika npm w kontekście pakietów npm-organisations i objętych zakresem (prywatnych). Poważnie potężny materiał. Używany w połączeniu zadduser
,owner
,team
, itp. daje precyzyjną kontrolę nad tym, kto ma dostęp do czego.bin
: Gdzie na ziemi są zainstalowane pakiety? Uruchom to polecenie, aby zobaczyć bezwzględną ścieżkę do pliku.cache
: Jeśli zaczniesz instalować pakiety od npm lewego, prawego i środkowego, to polecenie jest całkiem przydatne. Wywołaj go za pomocą podkomendyls
, aby zobaczyć listę lokalnie buforowanych pakietów, lub za pomocą podkomendyclean
, aby wyczyścić wszystkie pakiety znajdujące się w pamięci podręcznej. Kiedy rejestr npm był wciąż nieco niestabilny, było to niezbędne, aby wrócić do stabilnego środowiska lub zresetować rzeczy, gdy nie skonfigurowałeś poprawnie uprawnień npm.config
: Później przejdziemy do różnych opcji konfiguracyjnych, ale to polecenie zajmuje się przede wszystkim utrwalaniem właściwości konfiguracyjnych w lokalnym lub globalnym pliku konfiguracyjnym za pomocą podkomendset
,get
lubdelete
.dedupe
lubddp
: podczas pracy nad projektem przez dłuższy czas i instalowania pakietów bezpośrednio z npm, to polecenie przejdzie do lokalnego drzewa pakietów i spróbuje uprościć zależności.link
: podczas tworzenia własnego pakietu npm umożliwia to utworzenie dowiązania symbolicznego do kontekstu globalnego, dzięki czemu można go przetestować tak, jakby był zainstalowany globalnie z rejestru npm. Na przykład, jeśli piszesz narzędzie do montażu w węźle, który ma globalnie zainstalowany interfejs wiersza polecenia, możesz uruchomić to polecenie i przetestować zachowanie interfejsu wiersza polecenia bez konieczności jego uprzedniego wdrażania.ls
: Służy do wizualizacji zależności pakietów i ich zależności w strukturze drzewa. Fajnie to zobaczyć i przydaje się również do porównań z innymi projektami.outdated
: służy do oceny bieżącego stanu zainstalowanych zależności oraz tego, czy są one nieaktualne. W projektach, w których główna lista zależności ma setki wierszy, ręczne sprawdzenie pakietów jest prawie niemożliwe. Dodanie-g --depth=0
do tego polecenia umożliwia również sprawdzenie globalnie zainstalowanych pakietów.publish
: To polecenie jest niezbędne podczas tworzenia własnego pakietu dla npm. Robi dokładnie tak, jak sugeruje nazwa; publikuje pakiet w rejestrze npm.search
: Użyj tego, aby wyszukać w rejestrze wszystkie pakiety zawierające tekst podany w trzecim argumencie.shrinkwrap
: Krótko mówiąc, to polecenie pozwala zablokować określone wersje zależności w pakiecie w kolejności, tak aby zrelaksowany numer semver (wersjonowanie semantyczne) nie złamał kodu produkcyjnego.star
: Czy naprawdę podoba ci się pakiet, którego używasz? Użyj tego polecenia, aby pokazać swoje uznanie bezpośrednio z terminala, co zostanie odzwierciedlone na stronie pakietu w rejestrze npm.update
: zwykle następuje pooutdated
poleceniu aktualizacji wszelkich nieaktualnych pakietów.version
: daje to skrót do podbicia właściwości wersjipackage.json
i wykonania tagu git w jednym.
Zauważ, że większość z tych poleceń może przyjmować podkomendy i/lub konfiguracje, a ta lista w żadnym wypadku nie jest ostateczną dyskusją na temat CLI.
npm-config
Konfiguracja jest główną częścią npm i istnieje wiele sposobów ustawiania zmiennych konfiguracyjnych.
Konfiguracja przez CLI i zmienne środowiskowe
Po pierwsze, konfigurację można ustawić za pomocą CLI z terminala.
Zazwyczaj wyglądałoby to mniej więcej tak: npm <command> --<configuration option> [<optional value>]
.
Jeśli wartość nie zostanie określona, opcja zostanie domyślnie ustawiona na true.
Załóżmy na przykład, że pracujesz z ograniczonym (prywatnym) pakietem npm i decydujesz się opublikować go jako pakiet publiczny.
Można to łatwo zrobić, dołączając --access=public
do polecenia publish
. Gdybyśmy nie określili, że właściwość ma być publiczna, wartość domyślna byłaby ograniczona (prywatna).
Konfiguracja dołączona do innych poleceń, takich jak ta, nie jest zachowywana wszędzie, więc ustawianie szeregu konfiguracji za pomocą CLI może być męczące.
W takich przypadkach może być lepiej ustawić konfigurację przy użyciu zmiennych środowiskowych.
Każda zmienna środowiskowa ustawiona z prefiksem npm_config_
zostanie użyta do skonfigurowania npm.
Na przykład: export npm_config_registry=localhost:4321
ustawi opcję konfiguracji rejestru globalnie, a po wykonaniu npm użyje rejestru npm znajdującego się na localhost na porcie 4321.
Konfiguracja za pomocą pliku npmrc
Możesz także ustawić opcje konfiguracyjne za pomocą specjalnego pliku .npmrc
, który można ustawić na różnych poziomach w zależności od wymagań:
- Poziom projektu: w katalogu głównym kodu projektu wraz z jego plikiem
package.json
, zazwyczajpath/to/project/.npmrc
- Poziom użytkownika: katalog, który konfiguruje konto konkretnego użytkownika, zwykle
~/.npmrc
- Poziom globalny: katalog, w którym npm szuka konfiguracji globalnych, zazwyczaj
$PREFIX/etc/npmrc
- Wbudowany poziom: bądź ostrożny. Ta konfiguracja jest nie tylko globalna, ale jest również częścią kodu źródłowego npm, a najlepsze praktyki zalecają (w rzeczywistości wymagają), abyśmy nie zmieniali kodu, za którego utrzymanie nie jesteśmy odpowiedzialni. Zazwyczaj można go znaleźć w
/path/to/npm/npmrc
.
Ustawienia konfiguracji w pliku .npmrc
można modyfikować i utrwalać za pomocą interfejsu wiersza polecenia, uruchamiając polecenie w tym formacie: npm config set <key> <value>
.
Na przykład można uruchomić npm config set access public
, aby trwale upublicznić konfigurację publikowania pakietu objętego zakresem (prywatnego).
Domyślnie to polecenie utrwali konfigurację lokalnie (konfigurację na poziomie użytkownika, jak opisano powyżej), ale możesz dodać -g
, aby zachować ją globalnie.
Gdy konfiguracja utrwalona musi nastąpić na poziomie projektu lub na poziomie wbudowanym, plik .npmrc
należy zmodyfikować za pomocą edytora tekstu.
Konfiguracja przez package.json
Na koniec konfigurację można ustawić z pliku package.json
. Jest to jednak rzadko używane (i powinno być używane tylko wtedy, gdy jest to jawnie wymagane), ponieważ plik .npmrc
na poziomie projektu jest konwencjonalnie preferowanym miejscem do ustawiania konfiguracji pakietu.
Wybitne ustawienia konfiguracyjne
access
: Jak omówiono powyżej, służy do ustawiania uprawnień.always-auth
: Ważne jest, aby pamiętać, że to ustawienie ma domyślną wartość false. Gdy jest ustawiony na true, npm zawsze będzie wymagał uwierzytelniania podczas kontaktowania się z rejestrem.ca
: Domyślnie jest to urząd certyfikacji npm (CA). Można go zmienić na null, aby umożliwić dostęp tylko znanym rejestratorom, lub do określonego certyfikatu CA, aby przyznać dostęp tylko do tego konkretnego. To ustawienie, wraz zcafile
,cert
istrict-ssl
, jest rzadko używane, ale mówi o aspekcie bezpieczeństwa i niezawodności npm, zapewniając spokój ducha, wiedząc, że instalowany pakiet pochodzi ze źródła, którego oczekujesz.color
: domyślnie ustawiona na true, dająca przerwę od standardowej ponurości terminala przez pokolorowaniestdout
, które jest dozwolone przez deskryptory plików tty. Jeśli ustawione na false terminal pozostaje nudny. Gdy jest ustawiony naalways
, zawsze wyświetla w kolorze.depth
: to ustawienie pozwala na szczegółową kontrolę nad tym, co widzisz za pomocą poleceń rekurencyjnych, takich jakls
ioutdated
, poprzez przypisanie, jak głęboko są wykonywane. Wartość 0 oceni tylko pierwszy poziom zależności, podczas gdy nieskończoność (wartość domyślna) spowoduje, że zostaną ocenione wszystkie poziomy zależności. Wyjątkiem od tej reguły jest używanie go zoutdated
; w takim przypadku nieskończoność jest interpretowana jako 0, aby zapewnić bardziej odpowiednie dane wyjściowe.dev
: domyślnie jest to ustawione na false, ale gdy jest ustawione na true (podczas wykonywanianpm install
), wszystkie zależności programistyczne w plikupackage.json
zostaną zainstalowane wraz z normalnymi zależnościami.dry-run
: Gdy to ustawienie jest ustawione na true, npm nie dokona żadnych zmian w twoim pakiecie, ale zamiast tego powie ci, co by zrobił. Może to być bardzo przydatne podczas uruchamiania niektórych poleceń, takich jakdedupe
lubupdate
.git-tag-version
: domyślnie jest ustawiona na true. To ustawienie oznacza wersję w git podczas uruchamiania polecenianpm version
. Jeśli używasz npm jako menedżera pakietów dla dużego projektu, który ma otagowane wersje w git, możesz zaoszczędzić czas i pamiętać o aktualizacji plikupackage.json
za Ciebie.loglevel
: domyślnie jest to ustawione nawarn
, które wyświetla dane wyjściowe błędu i ostrzeżenia podczas uruchamiania poleceń npm. Inne ustawienia obejmująsilent
, który nie zapewnia żadnych danych wyjściowych;error
, który tylko rejestruje błędy na wyjściu;http
, który informuje tylko o błędach żądań http;info
, aby uzyskać informacje wyjściowe);verbose
, który rejestruje prawie wszystko; isilly
, co, jak sama nazwa wskazuje, daje głupią ilość wyjścia, a potem trochę.production
: Gdy ta wartość jest ustawiona na true, npm działa odpowiednio i uruchamia wszystkie polecenia w trybie produkcyjnym. Oznacza to, że programowanie lub opcjonalne zależności nie zostaną zainstalowane, ani żadne zadania związane z programowaniem nie zostaną wykonane.rollback
: Po ustawieniu na true wszystkie nieudane instalacje są usuwane. Jest to przydatne, gdy instalacja zależności nie powiedzie się. W zależności od poziomu rejestrowania powinieneś być w stanie zobaczyć, które instalacje nie powiodły się, zanotować je i uruchomić polecenienpm install
z opcją wycofania ustawioną na true. Następnie za pomocą notatek i instalacji na sucho (jak opisano powyżej) możesz debugować problem.save
: When installing a package directly from the registry, you can append
–saveto the command which will add the installed package to the dependencies option in the
file. For example,
file. For example,
npm install lodash` doda lodash do twoich zależności.save-dev
: Podobnie jak w przypadku opcji zapisywania konfiguracji, dodaj--save-dev
podczas instalowania pakietu, a następnie zostanie on dodany do opcji devDependencies w plikupackage.json
.save-optional
: Podobnie jak w przypadku opcji zapisywania konfiguracji, dodaj--save-optional
podczas instalowania pakietu, a następnie zostanie dodany do opcji OptionalDependencies w plikupackage.json
.save-exact
: podczas instalowania pakietów opcjesave
,save-dev
isave-optional
modyfikują plikpackage.json
, wstawiając zainstalowany pakiet do odpowiedniej właściwości za pomocą operatora zakresu semver. Podczas wywoływania ustawienia konfiguracji „save-exact” z wartością true, w połączeniu z jednym z powyższych ustawień, używany jest określony numer wersji, ignorując zakres semver.save-prefix
: Ustawia operator zakresu semver podczas używaniasave
,save-dev
lubsave-optional
. Wartość domyślna to^
, co pozwala na drobne uaktualnienia pakietów podczas instalacji. Można to ustawić na dowolny poprawny operator zakresu semver z przedrostkiem.tag-version-prefix
: konwencjonalną wartością domyślną jestv
, określająca, co jest dodawane do wersji tagu git podczas uruchamianianpm version
.
Aktualizowanie npm Korzystanie z npm
Możesz również użyć npm do aktualizacji.
Po prostu uruchom npm install -g npm@latest
, a npm zostanie zaktualizowany do najnowszej stabilnej wersji. Należy zauważyć, że każda wersja Node.js jest dostarczana z konkretną wersją npm iz mojego doświadczenia wynika, że nie powinieneś zbytnio zawracać sobie głowy tym parowaniem.
Pod koniec dnia radzę trzymać się parowania zgodnie z przeznaczeniem.
Używając npm jako samodzielnego narzędzia, upewnij się, że rozumiesz konsekwencje korzystania z dowolnej wybranej wersji. Istnieje świetne narzędzie do zarządzania różnymi wersjami Node.js (i co za tym idzie wersjami npm) w tym samym systemie o nazwie nvm.
Plik package.json
Plik package.json
jest kluczowym elementem łączącym wszystko razem.
Jest to wymagane do opublikowania pakietu w rejestrze npm i to tam ożywa część zarządzania zależnościami.
Ma dwa wymagane pola, a mianowicie „nazwa” i „wersja”, a razem te właściwości powinny być unikalnym identyfikatorem.
Pole nazwy powinno być zgodne z pewnymi regułami określonymi w dokumentacji npm dotyczącej nazewnictwa, a pole wersji podlega specyfikacjom semver.
Poza tym możesz mieć listę zależności o długości mili i zdefiniować konkretną wersję, która będzie używana dla każdej z nich, używając wersji semver i operatorów zakresu. Oto lista innych godnych uwagi właściwości.
"Główny"
„main” definiuje punkt wejścia do aplikacji, domyślnie ustawiony na index.js
. W zależności od konwencji lub twojego frameworka może to być app.js
lub main.js
. Możesz oczywiście zrobić to, co chcesz.
„skrypty”
To niedoceniana nieruchomość.
Po pierwsze, może służyć do wykonywania czynności przed publikacją.
Po drugie, zapewnia miejsce, w którym można aliasować szereg często używanych poleceń, począwszy od zadań budowania (zdefiniowanych w gulp lub grunt), wyzwalania instalacji innych zależności (np. Bower), uruchamiania serwera programistycznego z pakietem webpack lub uruchamianie zestawu poleceń bash.
„zależności”
Ta właściwość to lista pakietów potrzebnych aplikacji wraz z kompatybilnym numerem serwera. Jest to godna uwagi właściwość, ponieważ można ją modyfikować z terminala podczas instalowania lokalnych pakietów.
Odbywa się to poprzez dodanie --save
(lub skrótu -S
) na końcu polecenia npm install
.
Gdy to zrobisz, nowo zainstalowane pakiety zostaną dodane do listy zależności w pliku package.json
.
Podobnie zależność można również usunąć, dodając --save
podczas uruchamiania polecenia npm uninstall
.
Ważne jest, aby być świadomym wzorców wersjonowania semver każdej z zależności i ich znaczenia.
Jeśli reguła semver jest zbyt surowa, tracisz nowe funkcje i ulepszenia, natomiast jeśli reguła semver jest zbyt luźna, można zainstalować łamaną wersję pakietu.
Uszkodzona instalacja pakietu może okazać się dość trudna do naprawienia, zwłaszcza gdy używana jest zminimalizowana wersja pakietu.
„Zależności deweloperskie”
Oddzielna od właściwości dependencies właściwość „devDependencies” umożliwia definiowanie zależności, które są używane tylko w fazie rozwoju i nie są wymagane w przypadku kompilacji produkcyjnej (takich jak ESLint, pakiety grunt-contrib i Protractor). Podobnie jak w przypadku zależności, tę właściwość można zmodyfikować z poziomu terminala, dodając --save-dev
(lub skrót -D
) na końcu polecenia npm install
lub npm uninstall
. Ta sama ostrożność dotyczy wersjonowania, jak wspomniano w zależnościach.
"kosz"
Tutaj możesz określić pliki wykonywalne swojego pakietu, takie jak ścieżka do narzędzia CLI. Ta właściwość mówi npm, aby tworzył lokalne lub globalne dowiązania symboliczne do plików wykonywalnych, gdy pakiet jest instalowany.
„konfiguracja”
Jak omówiono wcześniej, tutaj definiujesz ustawienia konfiguracji za pomocą pliku package.json
.
"prywatny"
Po ustawieniu na true, npm odmówi opublikowania pakietu.
Nie należy tego mylić z ustawieniem konfiguracji dostępu.
Jest to przydatne ustawienie, gdy masz projekt, który wykorzystuje npm wraz z package.json
, ale nie jest przeznaczony do publikowania w rejestrze npm, ani w zakresie, ani w publicznym.
Jeśli twoja intencja się zmieni, po prostu zmień ustawienie na false, a będziesz mógł opublikować swój pakiet.
Właściwości niestandardowe
Plik package.json
akceptuje również właściwości niestandardowe, o ile nazwa nie jest już zdefiniowana lub zarezerwowana.
Tworzenie własnego pakietu npm
Ekosystem npm jest wypełniony pakietami pisanymi przez tysiące różnych programistów na całym świecie. Każda rozwiązuje jakiś problem, dostarczając abstrakcji lub przedstawiając implementację czegoś.
Są szanse, że w pewnym momencie Ty też będziesz chciał stworzyć swój własny pakiet do udostępniania.
Najpierw musisz napisać plik package.json
z minimalnymi wymaganymi właściwościami „name” i „version”, a następnie właściwość „main”, aby określić punkt wejścia, na przykład index.js.
Napisz swój kod w tym pliku index.js, zaloguj się przy użyciu konta użytkownika npm lub utwórz nowego użytkownika z terminala i możesz opublikować go w rejestrze npm.
Pakiety mogą być publiczne lub prywatne.
Publiczne pakiety można publikować za darmo i każdy może z nich korzystać.
Pakiety prywatne, zwane pakietami z zakresem, mogą być publikowane tylko wtedy, gdy zapłaciłeś użytkownikowi modułów prywatnych i mogą być identyfikowane przez odrębny @username/
, który jest dodany do nazwy pakietu.
Pakiety objęte zakresem można również publikować publicznie, wywołując polecenie publish
z --access=public
.
Co więcej, jeśli poświęcisz trochę więcej czasu na rozbudowę i ulepszenie bazy kodu swojego pakietu i nadszedł czas na opublikowanie nowej wersji, po prostu zmieniasz wersję (zgodnie z zasadami i konwencją semver) pakietu w package.json
plik i wpisz npm publish
.
Możesz również użyć interfejsu wiersza polecenia i wywołać npm version <update_type>
, gdzie update_type to patch
, minor
lub major
, zgodnie z opisem w semver, a to automatycznie zwiększy numer wersji w pliku package.json
.
NPM Organizacje
Ponownie, dokumentacja npm jest doskonała i nie ma sensu po prostu powtarzać ich słów.
To, co można powiedzieć o organizacjach w kontekście npm, to to, że jest to bardzo drobiazgowe, a przy prawidłowym zarządzaniu dużymi zespołami i osobami, pracującymi na pakietach objętych zakresem lub publicznymi pod jedną nazwą, można bardzo dobrze zarządzać i ograniczać.
Choć jest to trudne do opanowania, jest to bardzo satysfakcjonujące.
Potęga npm
Ostatecznie dokumentacja dostarczana przez npm jest obszerna i należy się z nią zapoznać w celu uzyskania szczegółowych informacji, ale ten artykuł zawiera przydatny przegląd zarówno podstawowych, jak i bardziej zaawansowanych, zaangażowanych funkcji, ukazując wspaniałość npm.
Jak ze wszystkimi rzeczami, istnieją silne opinie i można znaleźć wiele wad. Ale jeśli nigdy nie próbowałeś npm (lub węzła, jeśli o to chodzi), zanurkuj i zbadaj to dla siebie. Są szanse, że spodoba ci się bardziej niż myślisz.
Aby uzyskać więcej interesujących artykułów na temat npm, rozważ przeczytanie Używanie Scala.js z npm i Browserify.