Martin Michálek Martin Michálek  – 19. 11. 2018

NPM (Node Package Manager) je správce javascriptových balíčků. Usnadňuje jejich instalaci a následnou údržbu. Jde tedy o obdobu například Composeru ze světa PHP.

Čím se v tomhle článku pro začínající, mírně pokročilé a v NPM plavající pokročilé budeme zabývat?

Historie a konkurence

Původně NPM vymysleli pro správu balíčků k serverovému Javascriptu – Node.js. To se časem přeneslo na spouštění různých užitečných nástrojů na příkazové řádce – například pomocí Gruntu nebo Gulpu.

Nakonec ale NPM spravuje i frontendový Javascript a dnes už (po uzavření Boweru) i jakékoliv frontendové balíčky.

Pokročilejší vývojáři často namísto NPM používají nástroj Yarn, ale o tom napíšu jindy. Základní použití Yarnu je plus minus podobné a používá i totožné balíčky a stejnou konfiguraci.

Samozřejmě je zde i řada alternativ pro ty z vás, kteří se nechcete zabývat příkazovou řádkou. Alespoň pro úkoly spojené s automatizací vývojářské práce. Pro vývojáře nepracující v týmu je zde například Prepros a na Macu populární Codekit.

Instalace a aktualizace

NPM si nainstalujte i s celým Node.js. Jděte na následující adresu a stáhněte si LTS (Long Term Support) verzi: nodejs.org/en/.

Ve zvláštním článku na Vzhůru dolů je o instalaci Node více informací.

Otevřete příkazovou řádku a ověřte, zda je vše v pořádku:

$ npm --version

Mělo by to vrátit:

6.1.0

Vaše verze se může lišit, ale pokud je menší než 5, doporučuji aktualizaci. Když už jednou máte NPM, můžete tenhle nástroj poprosit, aby aktualizoval sám sebe:

npm install npm@latest -g

Přikazujeme tím nástroji npm, aby aktualizoval (install) sebe sama do poslední verze (@latest). A aby se instalovalo globálně pro celý počítač (-g). NPM totiž chceme v příkazové řádce používat z jakékoliv složky.

Nepotřebujete sudo?

Na Macu a Linuxu může být potřeba instalovat s administrátorským oprávněním (sudo):

sudo npm install npm@latest -g

Opět odkážu na článek o instalaci Node, kde se tomu věnuji více.

Struktura souborů a adresářů

Mrkněme se společně na strukturu souborů a adresářů projektu:

node_modules/
package.json
package-lock.json
  • node_modules/ je složka, do které se instalují balíčky. Ta se jako jediná nenahrává do Gitu nebo jiného verzovacího systému, protože by zbytečně zabírala prostor a celkově dělala ohromný nepořádek.
  • package.json v kořenovém adresáři je soubor s konfigurací NPM. Obsahuje informace o projektu a seznam potřebných balíčků. Více ve zvláštním textu.
  • package-lock.json uchovává informace o instalovaných verzích balíčků, aby to bylo jednotné pro všechny, kteří na projektu pracují. I tady píšu více ve zvláštním textu.

Pojďme se teď podívat ale na hlavní část článku – základní příkazy, které se mohou hodit opravdu každému webovému vývojáři a webové vývojářce.

Základní příkazy

Příkaz Co dělá
npm init Vytvoří projekt
npm search Vyhledá balíčky
npm install Instaluje balíčky
npm uninstall Odinstaluje balíčky
npm list Výpis stromu závislostí
npm outdated Seznam balíčků k aktualizaci
npm update Aktualizuje verzi balíčků
npm help Nápověda

npm init: Vytvoří projekt

Projekt může vznikat zkopírováním souboru package.json z jiného a jeho manuální úpravou. Můžete ale odstartovat úplně z nuly:

npm init

Spustí to dotazník, kde budete muset vyplnit název projektu („package name“), jeho verzi, popis, autora a tak dále. Může vám stačit ponechat výchozí hodnoty – použijte npm init --yes a příkaz vás nebude zatěžovat otázkami.

Vytvoříme tak soubor package.json:

{
  "name": "npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Zatím na něm není nic moc zajímavého. Pojďme si přidat nějaké balíčky, které budeme na projektu používat.

npm search <název-balíčku>

Řekněme, že bychom na projektu chtěli mít knihovnu Bootstrap. Její přesný název si můžeme najít dvěma cestami:

Druhý uvedený nám do příkazové řádky vrátí seznam možností:

NAME                       | DESCRIPTION          | AUTHOR           | DATE       | VERSION  | KEYWORDS
bootstrap                  | The most popular…    | =mdo =twbs       | 2018-07-24 | 4.1.3    | css sass mobile-first res
react-bootstrap            | Bootstrap 3…         | =monastic.panic… | 2018-09-06 | 0.32.4   | react ecosystem-react re
@ng-bootstrap/ng-bootstrap | Angular powered…     | =ng-bootstrap    | 2018-10-26 | 4.0.0    | angular bootstrap compone

Vybereme hned tu první. Pojďme teď Bootstrap nainstalovat.

npm install: Instaluje balíček

npm install (<název-balíčku>)

Instalovat Bootstrap můžeme tedy následovně:

npm install bootstrap

Načež se nám vrátí něco podobného:

npm WARN [email protected] No description
npm WARN [email protected] No repository field.
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] requires a peer of [email protected] - 3 but none is installed. You must install peer dependencies yourself.
npm WARN [email protected] requires a peer of popper.js@^1.14.3 but none is installed. You must install peer dependencies yourself.

+ [email protected]
added 1 package from 2 contributors and audited 1 package in 2.949s
found 0 vulnerabilities

Pojďme si to rozebrat:

NPM upozorňuje („WARN“), že nám v souboru package.json chybí obsah v polích „description“ a „repository“. Na soukromém uzavřeném projektu nám to nemusí vadit, ale obecně je lepší si tyto políčka vyplnit.

Dále je zde informace, že NPM vytvořilo soubor package-lock.json („created a lockfile as package-lock.json“), což je v pořádku. Když si ten soubor prohlédnete, asi budete souhlasit, že jej mají spravovat stroje, nikoliv lidé.

Nakonec nám NPM poskytuje laskavé upozornění („WARN“): Aby Bootstrap správně fungoval, potřebuje následující balíčky: jQuery a Popper.

Odbočka: „Peer“ závislosti

Jelikož jde o takzvané „peer dependencies“, tedy závislost balíčků na stejné úrovni, neinstaluje je balíčkovací systém sám, ale musíme o udělat my. Více o závislostech píšu v textu o package.json.

Takže vzhůru do toho:

npm install jquery popper.js

Dostaneme pak něco takového:

+ [email protected]
+ [email protected]
added 1 package from 2 contributors, updated 1 package and audited 7615 packages in 6.813s
found 0 vulnerabilities

Kromě informace o nainstalovaných balíčcích (např. „jquery“) a jejich verzích („3.3.1“) je zde také zpráva, že NPM v balíčcích nenalezlo žádné bezpečnostní zranitelnosti („found 0 vulnerabilities“), takže můžeme být klidní.

Důležité je vědět, že existuje možnost použít příkaz bez názvu balíčku:

npm install

V takovém případě se stáhnou a uloží nové verze balíčků podle předpisu z definičního souboru package.json.

npm uninstall: Odstraní balíček

Samozřejmě je zde i možnost odstraňovat balíčky z projektu:

npm uninstall popper.js

NPM pak provede následující:

  1. Odstraní adresář popper.js z node_modules.
  2. Odmaže jeho výskyt z package.json a package-lock.json

Na tom nic složitého není, takže pojďme na další příklad.

npm list: Výpis stromu závislostí

Funguje to asi takhle:

npm list --depth=<číslo>

<číslo> udává hloubku výpisu. To je dost zásadní, protože npm list by nám vypsal ohromnou strukturu všech závislostí. Spokojíme se s prvními dvěma úrovněmi:

npm list --depth=0

Dostaneme:

├── [email protected]
├── [email protected]
└── [email protected]

To je vlastně totéž co aktuálně obsahuje adresář node_modules/. A totéž co sekce závislostí v našem milém souboru package.json:

"dependencies": {
  "bootstrap": "^4.1.3",
  "jquery": "^3.3.1",
  "popper.js": "^1.14.4"
}

Co znamenají ty stříšky? Možnost aktualizovat minor a patch verze, tedy druhé a třetí číslo. Více o způsobu verzování a nastavování závislostí v package.json najdete v článku o SemVer, sémantickém verzování.

npm outdated: Seznam balíčků k aktualizaci

Představme si, že máme v souboru package.json následující:

"dependencies": {
  "bootstrap": "~3.3.6",
}

A položíme dotaz na zastaralé verze balíčků:

npm outdated

Výstup:

Package                     Current  Wanted   Latest  Location
bootstrap                     3.3.6   3.3.7    4.1.3

Říká nám to, že aktuálně máme nainstalovánu verzi 3.3.6 („Current“), přičemž podle předpisu z package.json můžeme pomocí příkazu npm install aktualizovat na verzi 3.3.6 („Wanted“).

Zároveň ale je dobré vědět, že nejnovější verze Bootstrapu je 4.1.3 („Latest“). Ta se ale v našem případě nestáhne, dokud to doslovně nepovolíme v package.json - například takto:

"dependencies": {
  "bootstrap": "^4.1.3",
}

Vidíte, že jsem zápis změnil na stříšku, což obecně doporučuji. Více je v textu o SemVer.

npm update: Aktualizace verzí balíčků

npm update (<název-balíčku>)

Tenhle příkaz slouží k aktualizaci instalované verze jednoho nebo úplně všech balíčků na nejnovější verzi vyhovující předpisu ze souboru package.json. To je věc, kterou už u nainstalovaných balíčků nedělá npm install.

Jen pro pořádek dodávám, že:

  • npm update nahraje nové verze všech lokálních balíčků.
  • npm update -g aktualizuje všechny globální balíčky.

Tenhle příkaz záměrně uvádím až na konci textu, protože pro začátečníky bude matoucí koexistence s npm install. Velmi často se bez npm update můžete obejít.

Příklad použití

V předchozím textu jsme bez tohoto příkazu mohli žít, protože jsme si vystačili s následujícím procesem:

  • npm install nainstaluje balíčky.
  • npm outdated hlídá nové verze.
  • Aktualizaci verzí děláme úpravou package.json a novým spuštěním npm install.

Tohle nám ale nemusí vyhovovat. Prostě to můžeme chtít udělat příkazem. Vezměme, že se v našem příkladu změnila verze balíčku Popper.js:

npm outdated

Vrací:

Package    Current  Wanted  Latest  Location
popper.js   1.14.4  1.14.5  1.14.5  npm

Když bychom chtěli aktualizovat a dali npm install, ten se spokojí s instalovanou verzí, protože vyhovuje předpisu v package.json.

Proto pojďme aktualizovat balíčky:

npm update

Vrátí:

+ [email protected]
updated 1 package and audited 4 packages in 1.366s
found 0 vulnerabilities

Stáhne tedy novou verzi, uloží ji do adresáře node_modules/ a co je důležité – změní soubor package-lock.json. Ten, jak už víme, obsahuje informace o reálně instalovaných verzích balíčků. Změny v něm pak commitneme do repozitáře a máme aktualizováno.

Jak už název příkazů napovídá, npm install používejte pro instalaci nových balíčků, npm update pak pro aktualizaci na poslední dostupné verze podle předpisu zápisem SemVer v package.json.

npm help: Nápověda

Nápovědu můžete získat různými způsoby:

  • npm help – nápověda k nápovědě.
  • npm <příkaz> --help (např. npm install --help) – stručná nápověda k příkazu.
  • npm help <příkaz> (např. npm help install) – detailní nápověda k příkazu.)

Jo – a je dobré vědět, že z nápovědy na příkazové řádce se dá vylézt pomocí klávesy q.

To je prozatím vše. Ať se vám s NPM pracuje dobře.

Více informací: