w 24h
samopoczucie?
npm, czyli Node Package Manager, to menedżer pakietów dla środowiska Node.js. Można go porównać do sklepu z aplikacjami, ale dla programistów JavaScript. Ułatwia zarządzanie bibliotekami i narzędziami (pakietami), których potrzebujesz w swoich projektach Node.js i JavaScript.
Najważniejsze elementy i funkcje npm:
npm CLI (Command Line Interface) - Interfejs linii poleceń:
To główny sposób, w jaki Ty, jako programista, komunikujesz się z npmem. Używasz komend npm w terminalu (wierszu poleceń) do wykonywania różnych operacji.
Przykłady komend npm:
npm install
- instaluje pakiet (bibliotekę, narzędzie).
npm uninstall
- odinstalowuje pakiet.
npm update
- aktualizuje pakiet do najnowszej wersji.
npm run
- uruchamia skrypty zdefiniowane w package.json
.
npm init
- inicjalizuje nowy projekt Node.js i tworzy package.json
.
npm start
, npm test
, npm build
- to standardowe skrypty często używane w projektach.
npm publish
- publikuje Twój własny pakiet do rejestru npm (dla innych programistów).
npm audit
- skanuje projekt pod kątem luk bezpieczeństwa w zależnościach.
npm cache clean --force
- czyści cache npm (pamięć podręczną).
Rejestr npm (npm registry):
To ogromna, publiczna baza danych (ogromny "sklep") z pakietami JavaScript. Jest to centrum ekosystemu npm.
Gdy wykonujesz komendę npm install
, npm pobiera pakiet z tego rejestru (domyślnie z registry.npmjs.org
).
W rejestrze znajdziesz ogromną ilość pakietów: biblioteki ułatwiające tworzenie stron internetowych, frameworki (jak React, Vue, Angular, SvelteKit), narzędzia do testowania, buildowania, i wiele, wiele innych.
Oprócz publicznego rejestru, istnieją też prywatne rejestry npm dla firm i organizacji, które chcą hostować pakiety tylko dla swojego wewnętrznego użytku.
package.json
- Plik konfiguracji projektu:
To plik JSON w głównym folderze Twojego projektu Node.js. Jest to serce npm w Twoim projekcie.
Opisuje projekt: Zawiera informacje o Twoim projekcie, takie jak nazwa, wersja, opis, autor.
Listuje zależności: Najważniejsze, wymienia wszystkie pakiety (biblioteki, narzędzia), od których zależy Twój projekt.
dependencies
: Lista pakietów, które są niezbędne do działania Twojej aplikacji w środowisku produkcyjnym. Np. biblioteki UI, frameworki, biblioteki do obsługi bazy danych.
devDependencies
: Lista pakietów, które są potrzebne tylko w trakcie developmentu, ale nie są wymagane w produkcyjnej wersji aplikacji. Np. narzędzia do testowania, buildowania, linting (sprawdzania jakości kodu), formatowania kodu.
Skrypty (scripts): Definiuje skrypty, które możesz uruchamiać za pomocą npm run
. Standardowe skrypty to np. start
, dev
, build
, test
, ale możesz definiować własne. Skrypty te automatyzują typowe zadania w projekcie.
Przykładowy package.json
(uproszczony):
{
"name": "moj-projekt",
"version": "1.0.0",
"description": "Opis mojego projektu",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"build": "webpack",
"test": "jest"
},
"dependencies": {
"express": "^4.18.2",
"lodash": "^4.17.21"
},
"devDependencies": {
"nodemon": "^3.0.3",
"webpack": "^5.90.0",
"jest": "^29.7.0"
},
"author": "Twoje Imię",
"license": "MIT"
}
node_modules
- Folder z zależnościami:
Gdy uruchamiasz npm install
, npm pobiera pakiety wymienione w package.json
i ich zależności (bo pakiety też mogą zależeć od innych pakietów).
Wszystkie te pakiety są instalowane w folderze node_modules
w głównym folderze Twojego projektu.
node_modules
może być bardzo duży, bo pakiety często mają wiele zależności, a te zależności - kolejne zależności. To jest normalne.
Folder node_modules
jest zazwyczaj ignorowany w systemach kontroli wersji (np. Git) i nie jest wgrywany na serwer produkcyjny. W produkcji wystarczy mieć package.json
i uruchomić npm install
na serwerze, żeby odtworzyć node_modules
.
Struktura node_modules
jest zagnieżdżona, pakiety są organizowane w drzewo zależności. Nowsze wersje npm (i inne menedżery pakietów jak Yarn i pnpm) starają się "spłaszczać" tę strukturę, żeby zoptymalizować wykorzystanie miejsca i wydajność.
package-lock.json
(lub pnpm-lock.yaml
, yarn.lock
) - Plik blokady wersji:
Gdy instalujesz pakiety, npm (od wersji 5) automatycznie generuje plik package-lock.json
(lub pnpm-lock.yaml
dla pnpm, yarn.lock
dla Yarn).
Ten plik jest bardzo ważny dla zapewnienia powtarzalności buildów i stabilności projektu.
Blokuje dokładne wersje zależności: package-lock.json
zapisuje dokładne wersje wszystkich zainstalowanych pakietów i ich zależności, włącznie z ich zagnieżdżonymi zależnościami. Dzięki temu, jeśli Ty lub ktoś inny uruchomi npm install
w przyszłości, zostaną zainstalowane DOKŁADNIE TE SAME WERSJE pakietów, jakie były użyte, gdy plik package-lock.json
został wygenerowany.
Zapobiega problemom z aktualizacjami: Bez package-lock.json
, npm install
instalowałby najnowsze wersje pakietów zgodne z zakresami wersji zdefiniowanymi w package.json
(np. "express": "^4.18.2"
oznacza "dowolna wersja 4.18.2 lub nowsza z gałęzi 4.18.x"). To może prowadzić do problemów, jeśli nowsza wersja jakiegoś pakietu wprowadzi zmiany powodujące błędy w Twoim projekcie. package-lock.json
eliminuje to ryzyko, gwarantując spójne środowisko zależności.
Zawsze commituj package-lock.json
(lub odpowiednik) do systemu kontroli wersji. To kluczowe dla pracy zespołowej i stabilnych buildów.
Podstawowy workflow pracy z npm w projekcie:
Inicjalizacja projektu: W nowym folderze projektu uruchom npm init -y
(lub npm init
, jeśli chcesz interaktywnie odpowiadać na pytania). To stworzy plik package.json
z podstawowymi informacjami.
Instalacja pakietów: Użyj npm install
.
npm install
- zainstaluje pakiet i doda go do dependencies
w package.json
.
npm install --save-dev
lub npm install -D
- zainstaluje pakiet jako devDependencies
.
npm install
(bez nazwy pakietu) - zainstaluje wszystkie pakiety wymienione w dependencies
i devDependencies
w package.json
(na podstawie package-lock.json
, jeśli istnieje).
Uruchamianie skryptów: Użyj npm run
, np. npm run dev
, npm run build
, npm run test
, npm run start
.
Aktualizacja pakietów: Użyj npm update
. Zwykle lepiej jest świadomie aktualizować pakiety i testować projekt po aktualizacji, żeby uniknąć niespodziewanych problemów. Możesz też chcieć używać narzędzi do automatycznego aktualizowania zależności, ale z rozwagą.
Odinstalowywanie pakietów: Użyj npm uninstall
.
Alternatywy dla npm:
Yarn: Inny popularny menedżer pakietów dla JavaScript, stworzony przez Facebook, Google, Exponent i Tilde. Yarn był popularny ze względu na szybkość i deterministyczne instalacje (już w pierwszej wersji). Nowsze wersje npm też stały się szybsze i bardziej deterministyczne. Yarn nadal jest używany i ma swoje zalety.
pnpm (performant npm): Menedżer pakietów, który zyskuje popularność ze względu na swoją wydajność i oszczędność miejsca na dysku. pnpm używa sprytnych linków symbolicznych i współdzielenia pakietów, żeby zminimalizować duplikację i przyspieszyć instalację. Jest uważany za bardzo szybki i efektywny.
W skrócie: npm jest kluczowym narzędziem w ekosystemie Node.js i JavaScript. Ułatwia zarządzanie zależnościami, automatyzację zadań i udostępnianie kodu. Zrozumienie, jak działa npm, jest podstawą do efektywnego tworzenia aplikacji Node.js i nowoczesnych aplikacji frontendowych.