spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Ján Gnip 21.8.2012
Hodnoť článok:
8 1

Začínáme s Node.js - 1. díl

Event-driven programování může být pro začátečníky docela velké sousto a proto mohou být začátky s Node.js těžší. Ale nenechte se tím odradit. V tomto článku se naučíme základy s Javascriptem na serveru - Node.js a vysvětlíme si, proč se v poslední době těší takové popularitě.

Úvod

Než začnete používat Node.js, musíte nejprve pochopit rozdíly mezi Node.js a tradičními server-side technologiemi (PHP, Ruby, Python, atd.).

Asynchronní programování

Určitě vám říká něco slovo Ajax, no ne? Právě první písmeno "A" zde reprezentuje ono magické slovo asynchronní. Každá funkce v Node.js je asynchronní. A co to pro nás v praxi znamená? Že vše, co by normálně blokovalo vlákno, se vykonává v pozadí. A to je nesmirná výhoda, na které je založen úspěch Node.js. Pokud chcete tedy například přečíst soubor na disku, musíte určit callback funkci, která se zavolá jakmile čtení souboru skončí.

Děláte všechno!

Node.js je pouze prostředí a to znamená, že vše si musíte udělat sami. Není tu žádný výchozí HTTP server, jak jste zvyklí třeba z ROR (například Shotgun). Pro nové uživatele to může být zklamáním, ale odměnou Vám bude vysoce výkonná webová aplikace. Jediný Node.js skript na serveru dokáže obstarat všechnu komunikaci s klienty. Tohle značně snižuje množství prostředků využívaných aplikací. Vezměme si jednoduchý příklad a porovnejme to s ekvivalentním kódem v jazyce PHP:

var i, a, b, c, max;

max = 1000000000;

var d = Date.now();

for (i = 0; i < max; i++) {
    a = 1234 + 5678 + i;
    b = 1234 * 5678 + i;
    c = 1234 / 2 + i;
}

console.log(Date.now() - d);

PHP verze:

$a = null;
$b = null;
$c = null;
$i = null;
$max = 1000000000;

$start = microtime(true);

for ($i = 0; $i < $max; $i++) {
    $a = 1234 + 5678 + $i;
    $b = 1234 * 5678 + $i;
    $c = 1234 / 2 + $i;
}

var_dump(microtime(true) - $start);

A nyní se podívejme na srovnání výkonu. Následující tabulka obsahuje zprůměrovaný čas provádění skriptu v milisekundách pro obě aplikace.

Počet iterací Node.js PHP
100 2.00 0.14
10 000 3.00 10.53
1 000 000 15.00 1119.24
10 000 000 143.00 10621.46
1 000 000 000 11118.00 1036272.19

Jak můžete vidět, PHP je značně rychlejší při menším počtu iterací, ale tato výhoda rychle mizí s jejich rostoucím počtem. Při posledním průchodu je PHP dokonce 93x pomalejší!
Jak jsme tedy zjistili, Node.js je rychlé. Abyste ho používali správně, musíme si o něm ještě něco říct.

Moduly

Node.js používá modulární architekturu pro zjednodušení tvorby složitých aplikací. Každý modul obsahuje funkce, které se vztahují k danému úkolu, který má modul řešit. Například http modul obsahuje funkce k práci s HTTP protokolem. Node.js samo o sobě obsahuje pár základních a nezbytných modulů pro přístup k souborům na disku, vytváření HTTP/TCP/UDP serverů a další důležité úkoly.
Načíst se dá velice jednoduše pomocí funkce require():

var http = require('http');

Nyní jsme si uložili do proměnné http odkaz na stejnojmenný modul http, který je v Node.js zabudovaný.
Předání názvu modulu funkci require() způsobí, že Node začne hledat node_module adresář ve složce, kde je uložen náš projekt. Pokud ho najde, bude v něm hledat příslušný modul (v tomto případě http). Pokud adresář nebo modul neexistuje, snaží se hledat v globální cache pro moduly.
Můžete však také specifikovat cestu k modulu v relativní nebo absolutní podobě:

var myModule = require('./myModule.js');

Moduly jsou zapouzdřené kusy kódu. Většina kódu v rámci modulu je nepřístupná z vnějšku. Pokud ale chcete funkce nebo proměnné zpřístupnit, můžete použít objekt exports a odkrýt tím přesně ty proměnné nebo funkce, které chcete.
Dáme si malý příklad:

var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

Tento kód vytvoří proměnnou PI, se kterou můžeme pracovat pouze uvnitř modulu. Pokud bychom tento modul použili ve své aplikaci, k proměnné bychom se nedostali. K čemu bychom se ale díky objektu exports dostali jsou funkce area a circumference. Jak by tedy vypadalo použití takového modulu v praxi:

var myModule = require('./myModule.js');
console.log(myModule.area(20));

Globální prostor

Node je Javascriptové prostředí běžící na V8 JS enginu od firmy Google. I na serverové části bychom se měli řídit doporučenými postupy, které se používají při vývoji klientské části aplikace. Například bychom se měli vyhnout manipulaci s globálním prostorem. Je jasné, že to ale někdy není možné. Globální prostor v Node je opravdu globální, na rozdíl od toho v klientské části. Globální proměnná nebo funkce se dá vytvořit snadno, když vynecháme klíčové slovo var před deklarací.

globalVariable = 1;
globalFunction = function () { ... };

Jak už jsme si ale řekli, globální proměnné a funkce jsou zlo a v aplikaci by se neměly vůbec vyskytovat. Nezapomínejte tedy při deklaraci uvádět slovo var.

Instalace

Instalace Node je poměrně jednoduchá. Pro Windows a Mac OS jsou k dispozici instalační balíčky na oficiálních stránkách Node.js.
Instrukce pro různé linuxové distribuce jsou dostupné na wiki githubu.

Závěr

To by bylo pro tento (spíše teoretický) díl vše. Příště se už konečně dostaneme spíš k programování a vytvoříme si nějaké základní servery.

Autorem originálního článku je Maciej Sopyło
Článek byl publikován na webu Net.tutsplus.com
Volný překlad - Ján Gnip

Ján Gnip Ján Gnip

Student FIT ČVUT a nadšenec do nových technologií.


Hodnoť článok:
8 1

14 komentárov k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

0 0 - 23.8.2012 12:18:59
off topic, ale k tomu "kompilovanému" vs. interpretovanému PHP je zaujímavé si prezrieť http://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/ (ak ste to ešte náhodou nevideli)
0 0 Michal Obeda 23.8.2012 12:06:29
@Peter Širka - ja len vravím, že stránka, kde môžeš využiť PHP/node.js je rovnako dobrá aj pre použitie asp.net. Samozrejme, že ho nebudem používať na jednu stránku, ktorú môžem urobiť v html (ale tam nepoužijem ani php). A ja mám tiež rád php (to je dôvod, prečo som neprešiel na asp.net, ale zostal u php), len si nemyslím, že programovanie v ňom je rozdielne napríklad od vytvárania stránky v asp.net (áno, .NET je celý framework, s php sa nedá porovnávať, ale teraz hovoríme iba z pohľadu webov).

A nehanbím sa za výsledky svojej práce, ani za svoj skill, ani za firmu. Nemám portfólio (okrem jedného veľmi starého a neaktualizovaného, ktoré tu radi vyťahujú) a nemám potrebu ho niekde uvádzať (ani nejaké podrobnosti o mne). Veľa ľudí ma pozná (väčšina ma nemá rada) a aj to je dôvod, prečo také veci nezverejňujem. Pod tým menom vystupujem na všetkých diskusiách, takže si ma určite ľahko nájdeš (skús pozrieť jednu veľkú, českú diskusiu).
1 0 Peter Širka 23.8.2012 11:07:03
@Michal Obeda v .NETe môžeš komunikovať s viacerými nižšie vymenovanými možnosťami na rôznych úrovniach a v rôznych vláknach. Nepoznám Nette - uviedol som ho ako príklad zbytočného použitia dosť veľkého frameworku na jednu malú stránku (myslel som si, že to pochopíš). Ja PHP neodsudzujem, je to skvelý scriptovací jazyk.

Keď sa bojíš alebo hanbíš za svoje meno, vek, poprípade robotu a výsledky tak to nezverejňuj. Chcel som len vidieť nejaký výsledok tvojej práce, skill, firmu - však sme z rovnakej profesie a prakticky zajtra.sk je odborný server, žiadna zoznamka, tak preto je to také divné, že si hidden.
0 0 Michal Obeda 23.8.2012 10:43:22
@Peter Širka - hovoríme tu o programovaní z pohľadu web stránok, je nezmysel spomínať, čo všetko .NET dokáže (poznám ho, programoval som v ňom). Ale aby som to upresnil, budem hovoriť o ASP.NET. A neviem, či si si nevšimol, ale ja ho obhajujem a nemyslím si, že jeho použitie na malé stránky je "kanón na vrabce". Rovnako dobre sa na malé weby hodí nette: http://phpfashion.com/tohle-kurva-ani-omylem

A opäť ďalší, ktorý potrebuje moje osobné údaje. Načo? Pozri si staršie komentáre, moje meno sa tu preberalo x krát. Ale nezistíš z toho poriadne kde robím a čo ovládam. Tak v čom by ti to pomohlo?
Ja ti môžem rovno napísať, že okrem front-endu programujem v php a viac ako dva roky som robil v jednej čisto .NET firme a ešte sa k tomu občas dostanem, ale primárne robím v php. Stačí?
0 0 Peter Širka 23.8.2012 08:41:00
@Michal Obeda
@Andrej Badin

V .NET môžeš využiť viacej jazykov. Cez .NET môžeš napísať aj aplikáciu, webovú stránku, webovú službu, Windows službu, WCF, mobilnú aplikáciu pre Windows Phone (dokonca aj iPhone, Android cez monotouch), hru, cloudovú aplikáciu, DLL, aplikáciu pre Linux a OSX. Toto sa v PHP nedá. Áno aj v PHP sa dajú písať veľké stránky, ale zober si nejakého začiatočníka a ukáž mu .NET/Javu a potom PHP, budem zvedavý čo ti povie. Kanón na vrabce .... To je to isté ako použiť v PHP napr. Nette framework na Single web page bez formulárov, no načo?

Napísal som svoj OFFTOPIC názor. Node.js ma zaujíma a keď bude nejaký seriál o ASP.NET môžeme si popísať k téme viacej.

@Michal Obeda prečo si nezverejníš osobné údaje? Aby som vedel s kým komunikujem a v akom skille. O @Andrej Badin som sa dozvedel informácie, ale o tebe nie.
0 1 Michal Obeda 22.8.2012 22:41:52
@Peter Širka - síce o sebe tvrdíš, že programuješ v ASP.NET, ale miestami sa veľmi mýliš. Programovanie v PHP je rovnaké ako programovanie v .NETe, nenazval by som to skriptovaním a iným programovaním len preto, že je to iný jazyk (hovoríme teraz o stránkach, nie o aplikáciách).

A že je ASP.NET na malé stránky ako kanón na vrabce? Mohol by si túto myšlienku rozvinúť? ASP.NET je na malé stránky rovnako vhodné, ako akýkoľvek iný jazyk.
1 0 Andrej Badin 22.8.2012 22:18:34
@Peter Širka to, že písanie skriptov nie je programovanie by som netvrdil! Ak je PHP programátor naozaj programátor, vie to aj s .NET, Java...
Asi si to mýliš so scenáristom. On píše skripty, ale programátor nie je
1 1 Peter Širka 22.8.2012 15:33:48
@Miloš nemôžeš porovnávať scriptovanie (PHP, Node.js) vs programovanie (.NET). ASP.NET bude určite rýchlejšie (za normálnych okolností) v 95% prípadoch ako PHP. ASP.NET je na malé stránky ako kanón na vrabce.

Performance závisí predovšetkým od kódera, ale ako všetci vieme - zlý kód sa dá písať všade. Node.js je hlavne o JavaScripte, jednoduchosti a ohybnosti.
1 0 Miloš 22.8.2012 14:56:26
Při posledním průchodu je PHP dokonce o 93% pomalejší!

To by znamenalo, že PHP dosiahlo čas 21457,74. Zrejme chcel autor napísať 93x.

No a k tým iteráciám by som chcel dodať asi to, že určite záleží na tom, čo script spracováva a podľa toho môže byť lepšie PHP alebo node.js, ale určite sa nedá hovoriť o tom, že node.js je rýchlejší a hotovo.

Sú prípady, kde ASP.NET, ktorý je kompilovaný je pomalší než PHP, ktorý je "interpretovaný". Interpretovaný píšem zámerne v úvodzovkách, lebo PHP v skutočnosti nie je čistý interpreter.
2 0 YaD 21.8.2012 12:56:06
Oprava, synchrónne ide programovať v akomkoľvek asynchrónnom serveri. Moja chyba.
4 0 YaD 21.8.2012 12:02:00
Node.js využíva asynchrónne IO, ktoré drtí v "Hello world" benchmarkoch synchrónne IO o niekoľko radov. Pokiaľ robíte serióznu aplikáciu, ktorá má mať vysokú dostupnosť, tak je asynchrónne IO tenký ľad (vertikálne škálovanie kódu, latencia servera).

Asynchrónne IO funguje na jednoduchom princípe, otvorí sa deskriptor na úrovni socketov, ten predá serveru (Node.js, Tornado, Twisted). Server niečo spraví, deskriptor uspí, zavolá synchrónne IO na DB alebo disk (bottleneck!) a keď dostane odpoveď, tak sa vráti do kódu (callback), zobudí deskriptor a zapíše odpoveď, zatvorí socket.

Záver? Nepomohli ste si nijako. DB alebo disk je zo svojej podstaty synchrónne IO, čo bude vyrábať hromadu sieťových deskriptorov (a čoraz viac ich bude spať), na ktoré treba odpovedať. Ale odpovedať ide naraz len na určitý počet (v GNU/Linux je by default dovolených 128 sieťových deskriptorov). Tiež každá odpoveď potrebuje jadro v CPU na odpoveď, pri dobrom kóde, dokážete spracovať cca. 2x toľko odpovedí naraz ako máte jadier (platí u synchrónnom IO a aj asynchrónnom IO - bottleneck!). Platí to pretože synchrónne IO zápasí s konkurenciou procesmi/vláknami, ktoré pridáva overhead, ale je zanedbateľný. Preto PHP tu prehralo, lebo si robilo procesy/vlákna, čo je v "Hello, world!" benchmarku bottleneck a to v reálnej aplikácií nie.

Jediné reálne využite je v Comet programovaní, ale tam by som použil radšej Tornado (s tým sa trochu hral), kde môžem miešať synchrónne IO a asynchrónne IO.

Btw DB môžte mať aj na druhom stroji, ale to vám nebráni si ju zahltiť, bez cachu ste jednoducho skončili a aj keby ste ho mali, tak pre plný potenciál ho je treba implementovať asynchrónne a... sme tam kde sme začali.
0 0 Ján Gnip 21.8.2012 10:54:04
@Peter Širka Další díly už by neměly být jenom překlad. Později se bude v seriálu psát blog za pomocí Express a mongoose, takže se tam určitě objeví nějaké moje zkušenosti - jak píšu aplikace.

@Andrej Badin Pokusím se s frekvencí vydávání neotálet. Taky mě docela štve, když každý díl vychází třeba jednou za měsíc. @Andre
1 0 Andrej Badin 21.8.2012 10:07:42
Tak ja dúfam, že to bude super seriál! A nech nové časti pribúdajú veľmi rýchlo!
Nech sa darí
1 0 Peter Širka 21.8.2012 10:04:58
V node.js programujem sem tam vo voľnom čase. Píšem si vlastný server framework a čakal som, že niekto bude písať zo svojich skúseností. Škoda :-(

Node.js je super, ale ako každý free framework prináša mnoho problémov.
Zajtra.sk > Programovanie > JS/jQuery > Začínáme s Node.js - 1. díl


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama