JavaScript na serveru: moduly a npm

V tomto díle se podrobněji seznámíme se správcem balíčků v Node.js. A povíme si také něco málo o práci s moduly a o souboru package.json, který je součástí každého projektu a výrazně vám usnadní práci.
Seriál: Node.js - s JavaScriptem na serveru (13 dílů)
- JavaScript na serveru: Začínáme s Node.js 23. 11. 2010
- JavaScript na serveru: Patří budoucnost Node.js? 21. 9. 2012
- JavaScript na serveru: Architektura a první Hello World 5. 10. 2012
- JavaScript na serveru: moduly a npm 12. 10. 2012
- JavaScript na serveru: začínáme programovat e-shop 19. 10. 2012
- JavaScript na serveru: MongoDB, Mongoose a AngularJS 26. 10. 2012
- JavaScript na serveru: Testování a kontinuální integrace 2. 11. 2012
- JavaScript na serveru: REST API 9. 11. 2012
- JavaScript na serveru: implementace REST API 16. 11. 2012
- JavaScript na serveru: nástroje a dokumentace 23. 11. 2012
- Začínáme s AngularJS 30. 11. 2012
- AngularJS direktivy a testování 7. 12. 2012
- JavaScript na serveru: CoffeeScript a šablonovací systémy 14. 12. 2012
Nálepky:
Co jsou moduly
V tomto seriálu budu považovat pojmy modul či balíček za synonyma. Modul může být jak jednoduchý skript o 5 řádcích kódu, tak kompletní MVC framework či testovací nebo jiný nástroj.
Moduly můžeme rozdělit na dvě kategorie:
- ty, které jsou dodávané jako součást Node.js a
- ty, které jsou komunitní a instalují se podle potřeby.
Ty první instalovat nemusíte a jejich přehled najdete v oficiální API dokumentaci. Na Githubu navíc můžete procházet přímo jejich zdrojové kódy v JavaScriptu.
Ty druhé, komunitní, vytvořili ostatní programátoři a spravují se nejčastěji přes npm. O nich také bude řeč ve zbytku dnešního článku.
npm
npm je balíčkovací systém podobný Ruby gems. V Node.js balíčky (moduly) instalujete podobným způsobem jako např. programy v Linuxu přes nástroj APT. Nástroj npm není jediný správce balíčků pro Node.js, ale je zdaleka nejpoužívanější a je součástí základní instalace Node.js.
Všechny moduly je možné procházet přes webové rozhraní na npmjs.org. Kromě hlavního webu je dobré vědět o Node Toolbox, kde jsou moduly řazeny do mnoha kategorií a také o nástroji Nipster, kde je možné moduly procházet např. podle toho, jak jsou oblíbené na Githubu. Vedle zmíněných nástrojů můžete moduly hledat na wiki projektu (zde však ani zdaleka nejsou všechny moduly).
S npm se pracuje přes klasický příkazový řádek a všechny moduly se instalují jednoduchým příkazem npm install
, takže chceme-li nainstalovat např. balíček moment pro práci s daty a s časem, nainstalujeme ho takto:
npm install moment
Instalace pak může vypadat v prostředí příkazového řádku takto:
Pokud si otevřete adresář projektu, uvidíte, že byl vytvořen nový adresář node_modules. Zde se instalují všechny moduly, pokud je nechceme instalovat globálně do jednoho hlavního adresáře pro všechny projekty. V takovém případě je potřeba provádět instalaci s parametrem -g.
Modul moment je poměrně vzácný v tom, že neobsahuje žádné závislosti na jiné balíčky. Mnohem častěji se skládají moduly z mnoha jiných modulů (proč programovat něco, co za mě udělal již dříve někdo jiný?). Zkusme globálně nainstalovat testovací framework Mocha takto:
Zde vidíte, že se v tomto případě instalovalo mnoho jiných balíčků, na kterých framework Mocha závisí. Nástroj npm toho nabízí samozřejmě mnohem více, jak můžete vidět v dokumentaci projektu.
package.json
Soubor package.json by měl obsahovat každý projekt či modul. Obsahuje základní informace o projektu jako např. verzi Node.js, na které chcete projekt spouštět (např. populární cloud hosting Heroku umožňuje přesně specifikovat, na které verzi má projekt běžet, takže pokud vyvinete nějaký projekt nad konkrétní verzí Node.js, máte jistotu, že na stejné verzi poběží váš projekt i na ostrém serveru a upgrade na vyšší verzi třeba uděláte až po otestování na nové verzi Node.js).
Podívejme se např. na zkrácenou verzi souboru package.json z modulu socket.io:
{ "name": "socket.io", "version": "0.9.10", "description": "Real-time apps made cross-browser & easy with a WebSocket-like API", "homepage": "http://socket.io", "author": { "name": "Guillermo Rauch", "email": "guillermo@learnboost.com" }, "repository": { "type": "git", "url": "https://github.com/LearnBoost/socket.io.git" }, "dependencies": { "socket.io-client": "0.9.10", "policyfile": "0.0.4", "redis": "0.7.2" }, "devDependencies": { "expresso": "0.9.2", "should": "*", "benchmark": "0.2.2", "microtime": "0.1.3-1", "colors": "0.5.1" }, "engines": { "node": ">= 0.4.0" } }
Důležitá je zde především sekce dependencies, která obsahuje seznam balíčků, na kterých tento modul závisí včetně konkrétní verze. Pokud si projekt s tímto souborem stáhnete, pak se všechny moduly automaticky nainstalují, pokud zadáte příkaz npm install
(bez dalších parametrů). V takovém případě Node Package Manager hledá soubor package.json a všechny závislosti hned stáhne.
Sekce devDependences udává moduly, které se používají pro vývoj balíčku. Najdete zde např. testovací nástroje (expresso, should) či nástroje pro testování rychlosti (benchmark, microtime). Všimněte si, že balíček should nemá určenou přesnou verzi. Znamená to, že při instalaci si npm stáhne nejaktuálnější verzi. Kompletní přehled možností zápisu požadované verze v package.json je dostupný v dokumentaci balíčku semver, který npm interně využívá.
Poslední sekce englines udává, že modul musí být spuštěn na verzi Node.js větší než 0.4.
Jak najít správný balíček
V Node.js můžete instalovat přes 16 tisíc balíčků a každý den přibývají desítky nových. V tak velkém množství balíčků může být někdy problém najít ten pravý modul, pokud máme na výběr z mnoha modulů pro řešení konkrétního problému. Jak tedy vybrat ten správný modul?
Nejlepší je orientovat se podle tří ukazatelů na Githubu ke konkrétnímu modulu:
- Počet uživatelů, kteří modul sledují. Ty nejpoužívanější moduly jsou obvykle i nejsledovanější.
- Datum poslední úpravy (poslední commit). Záleží hodně na tom, co má modul řešit. Pokud chcete instalovat framework, který má poslední commit před měsícem, pak je lepší se porozhlédnout jinde. Naopak u modulu, který řeší nějaký jednodušší problém (např. převod řetězce na URL) nemusí být datum poslední aktualizace pro výběr rozhodující.
- Počet otevřených issues. Vypovídá o tom, jak je balíček chybový a jak často jsou chyby opravovány. Také je dobré se podívat na podíl otevřených a zavřených issues.
Co dále?
Od příštího dílu začneme již s vývojem konkrétní aplikace. Nainstalujeme si potřebné nástroje a první verzi naší aplikaci také pošleme do cloudu.
npm install -g LiveScript
Pár doplňujících informací:
npm init
."~1.2.3"
, který je ekvivalentní s">=1.2.3 <1.3.0"
„… pokud je nechceme instalovat globálně do jednoho hlavního adresáře pro všechny projekty. V takovém případě je potřeba provádět instalaci s parametrem -g.“
nejsem si jist, jestli chapu vetu spravne, ale nemelo by byt „pokud je chceme instalovat do hlavniho…. pouzijeme parametr -g“ ?
Jak se na to dívám, změna by měla být spíš v druhé větě a bude to správně: „V *opačném* případě je potřeba provádět instalaci s parametrem -g.“ Soudím dle dokumentace, kde stojí, že globální přepínač *zapne* použití globálního adresáře: https://npmjs.org/doc/install.html
Dekuji za objasneni a za diky za cely serial. Tesim se na dalsi dily. :)