Přejít k navigační liště

Zdroják » JavaScript » Node.js – s JavaScriptem na server

Node.js – s JavaScriptem na server

Články JavaScript, Různé

Node.js je, když se podíváte na zahraniční vývojářské servery, pravděpodobně nejpopulárnějším tématem poslední doby. Přitom myšlenka použít JavaScript na straně serveru není nijak nová a Node.js není ani první, ani jediné řešení. Pojďme se stručně podívat na to, co je vlastně Node.js zač a jak se s ním pracuje.

JavaScript na serveru? Lidé, kteří mají s JS zkušenosti pouze zběžné a z klientů teď možná obrací oči v sloup a chystají se odplivnout: „Tyhlety novinky… prasárna největší! Vždyť JavaScript je synonymum pro memory leaks…“ Přitom JavaScript na serveru je takříkajíc obnošená vesta – už v roce 1996 bylo skriptování na straně serveru v JavaScriptu součástí produktu LiveWire od Netscape. Kdo pamatuje první verze ASP, jistě si vzpomene, že i v tomto serverovém řešení od Microsoftu šlo psát skripty nejen ve VBScriptu, ale i v JScriptu, což je MS „dialekt“ JavaScriptu (přesněji ECMAScriptu).

Poznámka na okraj: Zůstaneme u pochopitelného, zaběhnutého a – jak už to u takových termínů chodí – nepřesného označení JavaScript, i když bychom v dalším textu měli spíš hovořit o ECMAScriptu.

V8

JavaScript je interpretovaný jazyk a potřebuje tedy nějaký interpret, nějaké běhové prostředí, které se postará o provedení uživatelského skriptu. K nejznámějším patří SpiderMonkey (a další opičí mutace) či SquirrelFish. Téměř raketový vzestup popularity zažil ale engine V8, vytvořený Googlem pro prohlížeč Chrome.

Engine V8 totálně obrátil do té doby poměrně vyrovnané žebříčky rychlosti jednotlivých JS interpretů a svou rychlostí nechal veškerou konkurenci daleko za sebou. Navíc je jeho kód otevřený a poměrně snadno jej lze zabudovat do jiných aplikací, takže není divu, že právě nad tímto enginem vznikla řada aplikací, a mezi jinými i serverové engine. (Jedna z implementací JavaScriptu na serveru, v8cgi, pochází od Ondřeje Žáry a autor ji před časem představil v článku na Zdrojáku.)

CommonJS

Pokud se začnete rozhlížet ve světě serverových implementací JavaScriptu, dříve nebo později narazíte na CommonJS, což je neformální skupina, sdružující autory serverových JS implementací, a jejím cílem je sjednotit některé základní postupy a standardizovat je dřív, než se situace se server-side JS začne podobat situaci s JavaScriptem na klientech. Od této skupiny pochází např. návrh systému modulů či jednotkového testování, které implementuje právě Node.js.

Node.js

Node.js je „evented I/O framework for V8“, což si můžeme volně představit jako engine V8, rozšířený o funkce, které umožňují prováděným skriptům přistupovat k souborům či síťovým funkcím. Což v praxi znamená, že můžeme vytvořit server, který „naslouchá“ na určeném portu téměř stejným způsobem, jakým vytváříme například obslužné metody pro události v prohlížeči. Tedy:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
}).listen(8080, "127.0.0.1");
console.log('Server bezi na http://127.0.0.1:8080/');

Na prvním řádku vás může překvapit funkce require()  – slouží k zavedení modulu a je právě součástí výše zmíněné specifikace CommonJS (Modules 1.0). Require zavede modul a zpřístupní funkce, které modul exportuje.

Modul http exportuje funkci createServer, jejímž jediným parametrem je callback funkce, která je zavolána při příchodu požadavku (listener funkce). Vrácen je objekt HTTPServer (kurziva je použita kvůli terminologickým puristům – autor si uvědomuje, že to není přesné vyjádření, ale předpokládá, že je srozumitelnější, a zájemce o neplodné debaty o objektové terminologii odkazuje na již proběhlou diskusi.) Tento objekt implementuje, mimo jiných, metodu listen() , jejímž povinným parametrem je číslo TCP portu, a dvěma nepovinnými jsou IP adresa, na níž server naslouchá, a callback funkce, která je zavolána v okamžiku navázání serveru na daný port.

Školení

Pracujete s HTML a chtěli byste své weby dostat na vyšší úroveň? Přijďte na školení JavaScript a AJAX, pořádané Akademií Root a naučte se používat moderní funkce dnešních prohlížečů. Naučíme vás používat JavaSctipt a AJAX, tvořit základní skripty a ovládnout web pomocí nových vlastností.

Obslužná funkce pro příchozí spojení, předaná jako parametr funkci createServer, dostane dva objekty – request a response. Tato dvojice obsahuje metody pro získání předaných parametrů dotazu, resp. metody pro předání výsledku.

Pokud si výše uvedený příklad uložíte do souboru hello.js, můžete jej spustit – nepřekvapivě – příkazem

node hello.js

Ale aby se něco stalo, musí být nejdřív Node.js nainstalován.

Instalace

Instalace Node.js je možná na POSIX systém – tedy máte-li na počítači třeba Linux nebo některý klon BSD, můžete si Node..js stáhnout, přeložit a používat. Na Windows pomůže buď virtuální stroj, nebo Cygwin. Pokud je vše bez problémů, vystačíte si se svatou trojicí configure; make; make install – zdrojové kódy obsahují i samotný V8 engine. Binární distribuce pro systémy existují, ale nejsou oficiálně dostupné v repozitářích; pokud dáte přednost instalaci z balíčků, bez hledání informací po nejrůznějších webech se neobejdete.

Poznámka: Při pokusech s Ubuntu 10.04 jsem využil node.js .deb balíčku, který spravuje Jerome Etienne. Chcete-li si přeložit vlastní Node.js ze zdrojových kódů, možná oceníte tento návod.

K čemu to vlastně…

Node.js je stále populárnější, i když jej nelze rozhodně považovat za nějakou mature technologii vhodnou pro enterprise nasazení. Jeho výhodou je, že je malý, snadno použitelný, využívá jazyk, který je webařům známý, aplikace v něm napsané lze snadno škálovat a poměrně rychle v něm napíšete např. obslužný server pro WebSockets. Ostatně můžete se podívat na pěkné shrnutí Why You Should Pay Attention to Node.js.

Node.js nabízí, na rozdíl od modelu „co spojení, to vlákno“, model založený na událostech a jejich asynchronním zpracování. Je v něm tedy mnohem jednodušší psát vlastní (neblokující) servery než např. se o totéž pokoušet v PHP. Svým zaměřením se řadí někam k frameworkům jako jsou Twisted pro Python či EventMachine v Ruby. Existují pro něj i nadstavby, které umožní soustředit se na vlastní obsluhu požadavků, jako je například Sinatrou inspirovaný ExpressJS.

Už z počtu zpráv o Node.js, které se objevují, lze usuzovat, že vzbudil poměrně velký zájem. Je implementován ve WebOS. Je dostupný pro .NET. Vznikají pro něj nové moduly v C++. Jsou o něm psány knihy. Používá jej stále víc firem. Vyplatí se se s ním seznámit…

Líbí se vám Node.js?

Kde se s Node.js seznámit?

Svou cestu za poznáním tohoto zajímavého nástroje můžete začít třeba u Understanding Node.js – to pokud stále ještě váháte, proč a nač Node.js použít. Pokračovat můžete na Node.js wiki, v tutoriálu zjistíte, jak napsat jednoduchý HTTP server a streamer zpráv z Twitteru, můžete se podívat na pokusy s Node.js. A budete potřebovat dvě zásadní adresy – tady jsou:

Hodně štěstí při používání Node.js. Pokud bude zájem, přineseme vám o tomto nástroji další informace pro praktické použití…

Komentáře

Subscribe
Upozornit na
guest
34 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
honzzz

„Pokud bude zájem, přineseme vám o tomto nástroji další informace“ – ano prosím, já mám zájem.
Dík za zajímavý článek.

xx

Rychlost V8 se často přeceňuje. Existují jiné dynamicky typované jazyky, jejichž kompilátory generují rychlejší kód.
Myšlenka Node.js je hezká, ale vybral bych si jiný programovací jazyk.

Jiří Bažant

Myslím, že jednou z hlavních motivací je to, že to je JavaScript. Tedy ten jazyk který se používá na straně klienta.
V dnešní době je to asi (bohužel/naštěstí?) jediná rozumná volba, když chcete nějakou RIA aplikaci (pokud pomineme kontroverzní flash).
S volbou jiného programovacího jazyka už by tento projekt nebyl tak zajímavý…

xx

Existují nástroje, které umí jiný jazyk přeložit do JavaScriptu (např. GWT, ocamljs).

Jiří Bažant

To nepopírám, ale jsme opět u javascriptu a u myšlenky „proč nepsat v js vše…“

xx

Protože to je velmi primitivní jazyk.
Pokud to navíc budu psát ve staticky typovaném jazyce, je nemalá šance, že to poběží rychleji.

KLoK

Jak postupne scrolujete, v levem sloupci se automaticky zvyraznuji nadpisy k aktualnimu odstavci.
Jinak to vypada docela zajimave. Proceduralne ci objektove premyslejiciho clovek asi prekvapi, ze nemusi dumat nad mainloop. A vetsina systemovych veci tam je resena fakt pekne.

Ladislav Thon

Souhlas, API Node je hodně pěkně navržené. Když se člověk přenese přes to, že komentář v následujícím kusu kódu (převzato z mailing listu) neplatí :-)

promise = stat("somefile");
promise.addCallback(function(){
   ...might not get called if stat is an extremely fast function...
});

a pochopí proč, může být Node opravdu paráda. JavaScript all the way down :-)

fos4

Také jsem pro další články. Koukám a už to umí i databáze jako mysql a mongodb. S tím to začíná být pro mne hodně zajímavé :-)

mamlasek

odstavec o tom, k cemu to vlastne cele je, mi prijde jako nedostatecny. stale tomu nerozumim, proc bych mel psat aplikace na serverove casti v javascriptu, kdyz tu uz ted mame desitky ruznych jazyku, ktere jsou nepochybne vyspelejsi, nez ecmascript.

pk

Tady bych doporučil projít si slajdy Ryana Dahla na http://nodejs.org/jsconf2010.pdf nebo zkouknout video jeho prezentace http://www.yuiblog.com/blog/2010/05/20/video-dahl/

xx

Škoda, že se nestane módní nějaký framework/jazyk, který dbá i na korektnost.

pk

jakou korektnost mate na mysli?

xx

Korektnost té webové aplikace. Například, že generované HTML je v pořádku, v SQL dotazech nejsou nesmysly, odkazy v rámci té aplikace nevedou na neexistující stránky apod.

Aleš Roubíček

Na to vám přeci stačí filtry a robot.

xx

To mi stačí v případě, kdy mám stránky pevně dané. Pokud mám program, co generuje HTML, tak mi robot/filtry težko ověří, že v každé stránce, kterou vygeneruji, budou odkazy/HTML v pořádku.

Aleš Roubíček

To je ale nesmysl. Pokud dokážete všechny stránky vygenerovat, dokážete je i projet robotem. V tom přeci není žádný problém.

pk

čili myslíte framework/jazyk, pro které existují snadno použitelné testovací frameworky?
podle Davea Walkera, „there are two main routes to become a famous blogger“ http://is.gd/f0DCX
a podobne jsou dvě hlavní cesty, jak může vzniknout módní framework s dobrou podporou testů:
1, vznikne framework s dobrou podporou testů a stane se módním
2, vznikne módní framework

pk

… a někdo k němu doděla podporu testů

a nakonec jsem tohle rádoby moudro vlastně ani nechtěl odeslat, ale uklikl jsem se, sorry.

xx

Například pro HTML myslím něco jako CDuce http://en.wikipedia.org/wiki/CDuce
Akorát by to mělo být jednodušší a v nějakém jazyce, co se více používá.

Jan Kodera

To vám s radostí odpovím. Čistě kvůli produktivitě. Totiž ono přepínat mezi JS a nějakým server side jazykem nemusí být zrovna ideální. Takhle programátor je v jednom jazyce a čím více toho napíše tím bude lepší. My to takhle praktikujeme v Abakowiki (byť u nás je hlavní jazyk Java. Klient je v Google WebToolkit) a opravdu ta změna je znát.

xx

Proto mi přijde logické nepoužívat JavaScript vůbec.

Jan Kodera

Ano nemusíte, v tom souhlasím. Ale netvrdím, že cesta třeba čistě Java není nakonec ta nesprávná a neprosadí se pouze JS. To je holt riziko, JS má poměrně dobrou pověst oproti Javě, byť i pro mě osobně psát v JS je utrpení a nedělám to rád.

blizzboz

O.o JavaScript má dobrú povesť oproti Jave? Nechceli ste to napísať naopak?

keff

Třeba proto, že js jako málokterý jazyk dobře reprezentuje typový systém reálného světa? :) Viz výborný článek Universal Design Pattern Steva Yeggeho.

keff

A proč je Properties Pattern důležitý?

„Fellow Googler Joe Beda mentioned that IE4 originally supported arbitrary attributes on HTML elements, which dramatically extended the flexibility for web developers. Today, no browsers support it, though John Resig claims HTML 5 will fix this. In the meantime, developers use fake css classes and hidden elements; it’s a mess. I actually deleted a pretty large rant about this problem from the article. But yeah. It’s a problem. <b>When you don’t provide the Properties Pattern to people, they find horrible workarounds, which is much worse than anything that can go wrong if you simply support it directly.</b>“

„Let me summarize what I think are the key takeaways.

First: this is a critically important pattern. I call it the „Universal“ design pattern because it is (by far) the best known solution to the problem of designing open-ended systems, which in turn translates to long-lived systems.

You might not think you’re building that kind of system. But if you want your system to grow, and have lots of users, and spread like wildfire, then you are building exactly that kind of system. You just haven’t realized it yet.

Second: even though people rarely talk much about this pattern, it’s astoundingly widespread. It appears in strongly-typed systems like Eclipse, in programming and data-declarative languages, in end-user applications, in operating systems, and even in strongly typed network protocols, although I didn’t talk about that use case today. (Nutshell: a team I know using CORBA got fed up and added an XML parameter to every CORBA API call, defeating the type system but permitting them to upgrade their interface without horking every existing client. Bravo!)

Third: it can perform well! Or at least, „well enough“. The playing field for potential optimizations is nearly unbounded, and with enough effort you can reduce just about everything to constant time.

Finally, it’s surprisingly versatile. You can use it on a very small scale to augment one teeny component of an existing system, or you can go the whole hog and use it for everything, or just about anything in between. You can start small and grow into it as you become more comfortable with the pattern.

The Properties Pattern is not „just“ name/value pairs, although the name/value pair certainly lives at the heart of the pattern.“

Petr Bravenec

Používání ECMA skriptu na serveru může být výborný nápad. Svou jednoduchostí se tomuto jazyku máloco vyrovná.

Mně se podařilo implementovat ECMA skript úspěšně i do aplikace napsané v Qt – podpora je zde přímo vestavěná. Sice je to pomalejší, než nativní C++, na druhou stranu je to ideální způsob, jak donutit aplikaci dělat něco, s čím autor předem nepočítal nebo s čím počítat vůbec nemohl.

http://brave-equity.com/cs/dokumentace/uzivatelska-prirucka/skripty/

BS-Harou

Také bych poprosil o další články věnované tomuto tématu.

HuB

Také se přimlouvám za další díl. Jestli je to menší moloch jak Apache+PHP tak to vypadá jako ideální prostředí nejen pro malé projekty.

optik

moc, moc tomu fandím. JS na serveru a klientu zároveň může být ta pravá budoucnost web app. Podobně se o to snaží MS se silverlightem a C#, ale JS to válcuje přímou podporou v browserech, a jak napsal někdo přede mnou, Nokia poslední dobou také tlačí deklativní gui a JS kde může (QT Quick se to myslím jmenuje), no a když bude potřeba rychlost, prostě si dopíšeme modul v C++ a tradá.

blizzboz

ja nie.

zzen

Přijďte se podívat příští sobotu na WebExpo na mojí předášku o node.js: http://bit.ly/9AuTr7

cerw

Doporucuji podivast se na nodeknockout.com/te­ams pak clovek pochopi.

zzen

Hlavně doporučuji http://nodeknockout.com/teams/prague-js :))
Trochu neskromě se pyšním, že náš český tým vyhrál první cenu v oblasti užitečnosti.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.