Node.js

Аутор: Никола Харди

node.js технологија

Node.js је најједноставније описати као технологију која се заснива на следећих неколико идеја: event-based програмирање и nonblocking Io API, направљен за брзе, интерактивне апликације које су покренуте на дистрибуираним платформама које се лако скалирају. Овакав увод захтева и мало детаљније објашњење, али прво да видимо мало кôда.

Једноставан TCP сервер

var net = require('net')
var server = net.createServer( function(socket) {
    socket.write("Echo server\n");
    socket.pipe(socket);
});
server.listen(1337, '127.0.0.1');

У овом кôду је најпре учитан уграђени модул net. Затим је креиран сервер за који је везана callback функција и она је одмах и дефинисана. Овај једноставан пример све примљене поруке прослеђује на тај исти socket. Дакле имамо тзв. echo server. Након креирања сервера, он је и активиран тако да „ослушкује” на порту 1337. Овај кôд можемо сачувати у .js датотеци произвољног имена. Код покрећемо командом node ime-datoteke.js.

Event loop и nonblocking API

Чињеница је да су улазно/излазне операције било какве природе спорије него рад остатка система. Проблем се јавља у ситуацијама када цео систем чека на завршетак „споре” операције јер за то време остатак слободних ресурса може бити ефикасније искоришћен, а није.

Прво решење је било увођење вишепроцесних система где су улазно/излазне операције креиране као нови процеси, тако да је извршавање основног процеса програма могло да тече и по покретању „споре” операције. Такве „споре” операције су имале посебан процес и оперативни систем је задужен за опслуживање оба описана процеса. Ово решење ради довољно добро до одређеног броја процеса, након чега се јавља проблем са трошењем ресурса на измену контекста (context switching), што је лоше.

Проблем са именом контекста је донекле решен увођењем концепта вишенитног програмирања (multithreading). Нити се могу описати као квази процеси који деле одређене ресурсе као што је меморија. Тиме је донекле умањен претходни проблем, али овај начин програмирања може да постане врло замршен и напоран јер уводи нове проблеме.

Решење за које су се одлучили node.js програмери је програмирање засновано на догађајима (event-driven) и неблокирајућим улазно/излазним операцијама. Идеја је да за одређене догађаје вежемо функције у којима је дефинисано како резултат догађаја треба да буде обрађен. Готово све је имплементирано у облику callback функција. Концепт неблокирајућих операција је у почетку проблематично схватити, али практично се своди на то да позив функције траје врло кратко, али време када ћемо добити резултат је неодређено, али то не утиче на брзину извршавања различитих делова наше апликације. Дакле, функционише по принципу: када резултат стигне, позови одређену функцију.

HTTP сервер

Следи пример једноставног HTTP сервера који ослушкује на порту 8080 и на захтев клијента одговара са „Здраво свете”

var http = require('http');
var server == http.createServer();
server.on('request', function(req, res) {
    res.writeHead(200, { 'Content-Type':'text/plain' });
    res.write('Zdravo svete');
    res.end();
});
server.listen(8080);

Овај пример кôда је врло сличан претходном и такође се састоји од учитавања модула, креирања сервера, регистровања и дефинисања callback функције и самог покретања сервера на жељеном порту.

Node Package Manager

У претходним примерима кôда може се приметити шема која се понавља.

  • Учитавање модула
  • Дефинисање и везивање callback-ова
  • Покретање сервера

Уз node.js стижу разни прединсталирани модули, као што су: http, net, fs… Осим њих, на располагању су нам и разни други модули који нису саставни део језгра node.js-а. Један node.js модул може да се појави у три облика:

– као датотека, 
– фолдер или 
– уграђени модул.

Занимљива ствар је да модули у облику фолдера садрже посебан JSON фајл (package.json) у којем су наведене информације о називу модула, верзији, датотекама које он садржи…

NPM (Node Package Manager) је помоћни алат који има више улога, као што су: разрешавање и инсталирање зависности за поједине модуле, претрага базе постојећих модула и њихова инсталација. Још једна важна ствар у вези са NPM управником пакета јесте та да може да ради у локалном и глобалном режиму. Када је реч о локалном режиму рада, преузети модули ће бити смештени у тренутни фолдер и они ће бити доступни само у тренутном пројекту. Код глобалног режима модули су након инсталације доступни у свим пројектима на систему, односно у свим node.js апликацијама.

Socket.IO

Као што је речено у уводу, node.js је врло погодан за брзе, realtime апликације. Овде се наравно не мисли на hard realtime апликације већ на интерактивност. Класичне web апликације се ослањају на HTTP протокол који има николико захтева: GET, POST, PUT… Сви ови захтеви се упућују од стране клијента ка серверу. Ово нас доводи у непријатну ситуацију када клијент жели да има најсвежије податке са сервера јер мора стално да шаље захтеве, да „запиткује” (polling). Технологије као што је AJAX омогућавају да крајњи корисници нису свесни овог проблема, али програмери и те како јесу.

Слична ситуација се јавља код мрежног програмирања, међутим тада обе стране везе, и клијент и сервер, имају могућност да шаљу поруке. Наравно, реч је о socket-има. Сличан концепт је недавно уведен и у програмирање модерних web апликација у виду WebSocketa. Node.js подржава рад са WebSocketima али много чешће је у употреби модул Socket.IO чисто из практичних разлога јер је једноставнији за рад. Socket.IO морамо да инстaлирамо помоћу NPM јер он није уграђен у језгро node.js-а.

Другим речима, Socket.IO нам омогућава да сервер обавести све прикључене клијенте када има нове податке чиме је избегнут polling.

npm install socket.io

Express

Једноставно речено, express је web application framework за node. Његова сврха је, најкраће речено, да аутоматизује многе задатке који се често понављају при писању web апликација. Ово обухвата задатке који покривају и други слични framework-ови. Express је заиста минималистички framework и може да сервира и такозвани статички садржај (css, javascript…). Постоји могућност да се користи на два начина, као обичан модул или уз генератор апликација који ће да креира основну хијерархије директоријума и генерише неопходне фајлове који су потребни за почетак рада једне апликације.

Закључак

Није лако зауставити се и закључити причу о Node-у. Једном када га испробате стално ћете добијати нове идеје шта бисте све могли да направите и за шта би све био сјајан. Битно је рећи да је Node сада већ један стабилан пројекат, користе га многа позната имена као што су The New York times, ebay, Yahoo, LinkedIn, МySpace и многи други. Једноставан је за учење, невероватно брз ако се користи на исправан начин и свакако нешто ново на шта треба обратити пажњу.

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *

Time limit is exhausted. Please reload CAPTCHA.