Node.js je vysoce výkonné, událostmi řízené prostředí pro Javascript. Už jsme o něm na Zdrojáku dříve psali, ale i tak jistě dokáže tato první věta rozpoutat v komentářích pod článkem peklo. Nuže – komentujte, my ale pokračujeme dál.
Základem Node.js je javascriptový interpret V8 z Google Chrome. Nad ním je tenká vrstva kódu v C++ poskytující minimální nutné zázemí (event-loop vyhodnocující příchozí události, obsluha I/O bufferů a jiné).
Nic z toho ale není momentálně pro nás důležité – Node se snaží být navržen tak, aby tyto nízkoúrovňové problémy vyřešil správně za vás. Některými detaily/vnitřnostmi se budeme zabývat v dalších článcích. Prozatím postačí vědět, že uživatelské rozhraní pro Node je čistý JavaScript v jediném vlákně – a v 99 % případů vše magicky funguje VELMI rychle a škálovatelně.
Článek je prvním ze série, kterou zde na Zdrojáku chystáme. V navazujících článcích se postupně podíváme na stavbu aplikace z modulů (CommonJS), postavíme si v rychlosti pár web aplikací (pomocí Connect a Express), řešení pro streamování a real-time komunikaci (Socket.IO) a dojde i na deployment na produkční prostředí. Při tom všem ovšem musíme používat instalaci Node včetně podpory pro debugování, balíčkovacího systému a jiných nástrojů. V dnešním článku společně projdeme instalaci, abychom jí porozuměli a měli společnou základnu. Pokud nemáte moc času, můžete pro hraní/experimenty použít už připravenou image virtuálního serveru, viz návod na konci článku. A tady je v kostce to, o co přijdete:
- nainstalujeme Node včetně debug podpory;
- Node má novou nestabilní verzi 0.3, my ale zůstaneme u 0.2.x z důvodu kompatibility;
- poté nainstalujeme balíčkovací systém pro Node – NPM (node package manager);
- na závěr nainstalujeme debugger node-inspector
- a poté si ještě zkusíme odladit jednoduchý program
Níže popisované příklady budou platné pro Linux/UNIX/OS X. Pokud máte Windows, budu od vás očekávat trochu vlastní iniciativy – tedy rozchodit obdobu UNIXových příkladů v Cygwin prostředí. Další dobrá alternativa k experimentování je už je virtuální server od VirtualMasteru, viz konec článku.
Instalace Node
Instalaci provedeme kompilací ze zdrojových kódů, ale nebojte se, Node má málo dependencí a kompiluje se snadno. V nedávné době vyšla nová verze 0.3, nicméně jedná se zatím o nestabilní větev s podstatnými změnami v API. Proto budeme používat poslední stabilní verzi z 0.2 větve. Stáhněte si příslušný zdrojový kód, rozbalte a nainstalujte nějak takto:
$ tar xzf node-v0.2.5.tar.gz
$ cd node-v0.2.5
$ ./configure --debug # důležité, zde je nastavení pro podporu ladění
$ make
$ sudo make install # pokud instalujete do /usr/local, budete (zatím) potřebovat root práva
Instalace NPM
Hned druhý krok bude instalace balíčkovacího systému npm, což je taková Node varianta rubygems
. Umožní vám jednoduše prohlížet a instalovat Node programy a knihovny, včetně závislostí. Je dobré zmínit, že npm
má poněkud agresivní zásady vynucování bezpečnosti a bude vás VELMI otravovat, pokud ho nainstalujete a budete používat pod root uživatelem. Nedoporučuji. Naopak defaultní instalace směřuje do /usr/local
(který obvykle root práva vyžaduje) a autor je toho názoru, že je vhodné /usr/local
prostě změnit vlastníka. S trochou skřípění zubů, ale budiž:
$ whoami
node # not root!
$ sudo chown -R $USER /usr/local
$ curl http://npmjs.org/install.sh | sh
Instalace debuggeru
Jakmile se zanoříte po uši do nového jazyka nebo prostředí, přijdou problémy. Přijdou zaručeně, možná by šlo si podle nich i řídit hodinky, protože vaše kroky v Node krajině budou lemovány zleva i zprava kódem alfa-kvality. Proto je dobré začít od píky tím, že si hned na začátku rozchodíme prostředí pro ladění.
Ačkoliv je Node prostředí mladé, máte překvapivě hned několik možností, např. integrovaný debugger v Eclipse či command-line debugger. Autor článku za vás ale autoritativně vybral interaktivní debugger založený na JS debuggeru ve Webkit Inspectoru (debuggeru v Chrome a Safari). Poprvé si na něm taky v praxi ukážeme, jak nainstalovat npm
modul (nezapomeňte změnit vlastníka /usr/local
a vnořených složek pro aktuálního usera):
$ npm install node-inspector
...
npm ERR! node-inspector@0.1.0 not compatible with your version of node
npm ERR! Requires: node@>=0.3.0
npm ERR! You have: node@v0.2.4
npm not ok
No – to se příliš nepovedlo. Hned v praxi tedy vidíte, jaké problémy může přinášet dynamicky se vyvíjející platforma. Nejnovější verze node-inspector pracuje pouze s Node >= 0.3 – s níž ovšem zase nefunguje spousta jiných knihoven, které budeme používat, a proto jsme nainstalovali z důvodů kompatibility nejnovější stable branch 0.2.4. (Samozřejmě jsem si to mohl odpustit, nicméně na podobné problémy asi narazíte za chvíli sami, je dobré si s nimi umět poradit. – pozn.aut.) Inu, nezbývá než vyzkoušet předchozí verzi:
$ npm ls | grep node-inspector
node-inspector@0.0.1 =dannycoates remote
node-inspector@0.0.2 =dannycoates remote
node-inspector@0.0.3 =dannycoates remote
node-inspector@0.0.4 =dannycoates remote
node-inspector@0.1.0 =dannycoates latest remote
$ npm install node-inspector@0.0.4
...
npm info build Success: node-inspector@0.0.4
npm ok
To už je lepší. Pokud všechno půjde dobře, měl by vám nyní v příkazové řádce fungovat příkaz node-inspector
(zatím ale neudělá nic).
Jen v rychlosti si načrtneme, jak řešení funguje: protože jsme Node společnými silami na začátku nakonfigurovali před kompilací pro podporu ladění, akceptuje nyní node
příkaz parametr —debug. Pokud se takto pustí, Node předává informace na lokálním portu. node-inspector
potom nad tímto základním rozhraním provozuje výše zmíněný debugger WebKitu a informace mezi ním a Node procesem překládá.
Výsledek je sympatický – můžete debugovat ve stejném prostředí jak svůj serverový kód, tak svůj klientský kód. Navíc můžete debugovat kód přes internet na jiném počítači, dokonce můžete debugovat z víc míst najednou. Je to tedy takový MMODBG – Massively Multiplayer Online Debugger.
Pozdrav slušně!
Nastal onen klíčový moment, kdy zkusíme pozdravit svět! Abych vám to usnadnil, připravil jsem ukázkový program už s chybou, takže si trochu zaladíme. Pokud jste tak ještě neučinili, pusťte node-inspector na pozadí (ukončit ho později můžete příkazem killall node-inspector
):
$ node-inspector &
A dále si zkopírujte/uložte do souboru hello-world.js
následující kód:
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); req.end('Hello Worldn'); }).listen(8124); console.log('Server running at http://localhost:8124/');
Tohle je základní a mnohokrát omílaný příklad HTTP serveru, který na každý požadavek vrací “Hello World”. Ale tenhle je drobně pozměněn, takže nefunguje. Spusťte příklad debug příkazem:
$ node --debug hello-world.js
debugger listening on port 5858
Server running at http://localhost:8124/
Nejprve Node zahlásí, že debugovací informace jsou dostupné na portu 5858, a poté hello-world.js
(řádka 6) zahlásí že byl spuštěn HTTP server na portu 8124. Zkuste se nyní tedy připojit na http://localhost:8124/
/Users/jakub/Sites/node/hello-world.js:4
req.end('Hello Worldn');
^
TypeError: Object #<an IncomingMessage> has no method 'end'
at Server.<anonymous> (/Users/jakub/Sites/node/hello-world.js:4:7)
at Server.emit (events:27:15)
at HTTPParser.onIncoming (http:831:10)
at HTTPParser.onHeadersComplete (http:87:31)
at Stream.ondata (http:763:22)
at IOWatcher.callback (net:494:29)
at node.js:773:9
$
Ouha. Jak vidíte, aplikace zahlásila výjimku a spadla. Ze stacktrace je vidět, že na řádce 4 tvrdí, že objekt req nemá metodu end. Pusťte tedy pokusný skript ještě jednou ( node --debug hello-world.js
) a pojďme se podívat, co se na místě děje. Otevřete v prohlížeči tentokrát node-inspector
na http://localhost:8080/. Po připojení bude potřeba přepnout se do správného souboru (Node jich naimportuje na základně závislostí více – ale o tom si povíme v příštím díle) – viz obrázek:
Kliknutím vlevo od řádky 3 umístěte breakpoint. Nyní se běh programu přeruší automaticky na této řádce. Aby program do tohoto callbacku vstoupil, otevřete si v druhém okně prohlížeče znovu na aplikaci, kterou ladíme – na portu 8124. Tentokrát, jak vidíte, prohlížeč odpověď nedostane a jen se točí – aplikace totiž v druhém okně čeká na našem breakpointu:
Nebudeme tedy v tomto jednoduchém a trochu umělém příkladu dále chodit kolem horké kaše – překlep je na další řádce, ukončit je samozřejmě potřeba výstupní proud v proměnné res
(response), nikoliv vstup req
(request). Stačí dvakrát poklepat na zmíněnou řádku a můžete kód přímo naživo upravovat – přepište tedy q
na s
a kliknutím na jinou řádku změny uložíte. Nyní můžete program dál pustit (v pravém horním rohu).
To by bylo pro dnešek všechno. Pokud se v průběhu návodu někde zaseknete, neváhejte napsat do komentářů pod článkem o pomoc. V příštím díle seriálu se podíváme na způsob, jakým do své aplikace naimportujeme knihovny a cizí kód (CommonJS Modules) a představíme si několik jednoduchých knihoven pro rychlou tvorbu web aplikací (Connect a Express).
Hrajeme si v oblacích
Pokud nemáte čas či energii celou instalací projít, ale přesto byste chtěli zkusit začít experimentovat s Node, mám tu pro vás speciální nabídku. Připravil jsem pro vás virtuální obraz disku, se založeným non-root uživatelem, s nainstalovaným node a npm a node-inspector. Pokud se opravdu chcete připravit o potěšení vše nainstalovat sami, zde je rychlý způsob jak do experimentování naskočit. A bude vás to stát bratru zhruba korunu na den!
Upozornění: přes veškerou snahu se autorovi zatím nedaří obejít chybu v implementaci debuggeru pod Ubuntu. Kapitoly o ladění pomocí debuggeru bude potřeba zatím přeskočit. Pokud problém bude vyřešen, upravím šablonu a upozorním na ni v dalším článku.
- založte si účet u VirtualMaster.cz
- otevřete si Zdroják node.js šablonu serveru a vytvořte nový server
- přihlaste se
ssh node@<ip-adresa>
(ip adresa přijde mailem), heslo k tomuto uživateli jechangeit
- po přihlášení toto heslo změňte (příkazem
passwd
) na něco více osobního - pokud chcete, přidejte svůj veřejný klíč do
~/.ssh/authorized_keys
Přehled komentářů