Šta je node.js?

JavaScript je programski jezik koji ne može da se samostalno koristi već je za njegovo izvršavanje potrebno specijalno okruženje tzv. “JavaScript runtime environment”. Najpoznatiji “JavaScript runtime environment” je browser, ali ukoliko želimo da izvršavamo JavaScript i van browser-a tu na scenu nastupa node.js kao drugi “JavaScript runtime environment”. Node.js je open-source, cross-platform JavaScript runtime environment koji se bazira na Chrome-ovom V8 JavaScript engine-u.
Pošto je Node.js tzv. “low-level” platforma za jednostavniju upotrebu je pametno koristiti neki od mnogobrojnih framework-a kao što su: Express, Koa, Total.js, Sails….

Node.js je JavaScript runtime environment i omogućava rad sa JavaScript-om i van browser-a!

Node.js teži neblokirajućem i asinhronom načinu programiranja i u isto vreme može da obavlja više stvari odjednom, za razliku od kombinacije PHP/Apache koja funkcioniše putem zahteva i odgovora. PHP/Apache server obrađuje zahtev za datotekom tako što šalje task u file system računara, tu sačeka dok se sistem datoteka otvori i pročita datoteku, a zatim kao rezultat vraća traženi sadržaj klijentu. Tek nakon ovoga je spreman da odgovori na sledeći zahtev.

Kada Node.js obrađuje zahtev za nekom datotekom, on šalje task u file system računara i odmah nakon toga je spreman da prihvati na sledeći zahtev. U medjuvremenu file system otvori i pročita datoteku, nakon čega server vraća sadržaj klijentu. Upravo ovo je najveća prednost Node.js servera, jer eliminiše čekanje i jednostavno nastavlja sa sledećim zahtevom. UI vođen-događajima ga čini savršenim za aplikacije koje rade u realnom vremenu i iziskuju veće količine prenosa podataka. Node.js je baziran na tome da uglavnom veći deo koda samo sedi u pozadini i čeka da se desi neki I/O (Ulaz/Izlaz), kao što su čekanje da se fajl upiše na disk ili da MySql upit vrati podatke. Kada zahtevamo da se otvori fajl, ne čekamo na rezulat nego kažemo kojoj funkciji da prosledimo podatke kad je citanje gotovo ili koji događaj da pozove, a izvršavanje drugog koda se nastavlja. Više o “JavaScript runtime environment” možete pogledati u članku “Simbioza JavaScripta i njegovog okruženja”.

Razlike izmedju Node.js i Browser-a

Pored to toga što obe platforme omogućavaju izvršavanje JavaScript-a takodje postoje i razlike medju njima:

  • Node.js može da kreira server – Node.js ima ugrađene biblioteke za HTTP i socketkomunikaciju sa kojima može da kreira web server i tako bude zamena za druge tipove servera kao npr. Apache, Nginx…
  • Node.js koristi CommonJS sintaksu sa kojom omogućava modularno programiranje – Iako u okviru ES6 postoji sitaksa za rad sa modulima tzv. import/export sintaksa, ona je u node.js-u tek odnedavno ubačena i to kao eksperimantalna opcija. Za rad sa modulima Node.js koristi CommonJS sintaksu (više o ovome možete pročitati u članku Modularno programiranje – eksterna sintaksa).
  • Node.js nema DOM, window objekat, document objekat, cookies… – Node.js nema API-je pretraživača vezane za DOM, CSS, performansame, document, kao i sve API-je povezane za “window” objekat. Upravo zbog nedostatka window objekta koji predstavlja globalni objekat dostupan svima, u Node.js-u takodje postoji novi globalni objekat koji je dostupan su u svim modulima i ne moramo da ga uključujemo specijalno u našu aplikaciju, već ga možemo direktno koristiti svuda. Ovaj globalni objekat sadrži mnoštvo korisnih svojstava okruženja kao: setImmediate(), setInterval(), clearTimeout(), console i process. Ovaj objekat možemo da pregledamo jednostavnim izlistavanjem u konzoli sa:

  • Napomena:
    Sledeće promenljive (__dirname, __filename, exports, require(), module) izgledaju kao da su deo globalne promenjive, ali nisu, one postoje kao deo modula.

  • Global namespace object – U Browseru, opseg najvišeg nivoa je globalni opseg, što znači da će ključna reč “var” unutar browser-a definisati novu globalnu promenljivu. U Node.js-u je ovo drugačije, jer opseg najvišeg nivoa nije globalni opseg, pa će ključna reč “var” unutar nekog modula Node.js-a biti dostupna samo za taj modul.
  • Node.js ima pristup fajlovima sistema u kome se nalazi – Node.js ima puni pristup sistemu kao i bilo koja druga izvorna aplikacija. To znači da može čitati i pisati direktno u ili iz sistema datoteka, takodje može imati neograničen pristup mreži, i može izvršavati softver…
  • Moderan JS u okviru Node.js – Budući da se razvoj JavaScript-a kreće veoma brzo, pregledači često kaskaju sa implementacijuom novih mogućnosti JavaScript-a tako da u Browser-u morate da koristite stariju verziju JavaScript-a, ali to ne važi za Node.js u njemu možete koristiti sav moderni ES6-7-8-9 JavaScript koji vaša verzija Node.js podržava.

Nedostaci Node.js-a

Node.js izvršava kod na jednom thread-u (niti), i to je ustvari jedna od najvećih prednosti u odnosu na druge opcije koje podržavaju multi-threading, jer upravo jedno-nitna priroda čini njegove programe izuzetno skalabilnim.

Šta znači da je aplikacija skalabilna?

Skalabilana aplikacija je ona koja sa istim kodom može obraditi mnogo veći broja nekih zahteva nego što je prvobitno planirano a bez trošenja dodatnih resursa, što nije slučaj kod multi-thread tipa aplikacije jer pri povećavanju obima posla dolazi do povećavanja potrošnje sistemskih resursa (RAM…). Više o radu Event loop-a možete pročitati u članku “Princip rada asinhronog JavaScript-a”

Upravo pomenuta prednost je i najveći nedostatak Node.js-a jer zbog takve prirode node.js-a, on nema mogućnost da neblokirajući obrađuje zadatke vezane za CPU. Objasnićemo ovaj problem kroz primer:
Kad Node.js primi zadatak vezan za CPU, on sav CPU resurs isporučuje tom zadatku i uzima da ga odmah obradi, a tek po završetku odgovara na druge zahteve u loop-u što dovodi do spore obrade i kašnjenja u “event loop-u”.

Da li postoji rešenje za ovaj problem?

U novijim Node.js verzijama (>10.5.0) se pojavio novi modul pod nazivom “Worker threads” koji omogućava postojanje više paralelnih niti za izvršavaje JS-a, što pomaže u izvođenju CPU intenzivnih JS operacija. Međutim i dalje postoje odredjeni uslovi jer se “Worker threads” mogu izvoditi samo na mašinama sa više jezgara (jer Node.js omogućava upotrebu samo jedne niti po jezgru), a ne može se preskočiti ni činjenica da je ova funkcija i dalje eksperimentalna u trenutno aktivnim Node.js verzijama.


Instalacija node.js

Da bi instalirali node.js na lokalnoj mašini neophodno da se imamo instaliran Python 2.7, pa tek onda možemo download-ovati node.js (npr. odgovarajuću windows installer verziju “.msi”) sa https://nodejs.org/download stranice.
Instalacija je standardna a po završetku se dobijaju sledeće stvari:

  • node.js
  • dokumentacija za node.js
  • node.js command prompt
  • npm package manager

Provera instaliranih verzija node.js i njegovog package manager-a npm može da se izvrši u command promptu sa naredbama:

node -v

npm -v

Pored instalacije na lokalnoj mašini koja se koristi za razvoj aplikacje, po završetku aplikacije je potrebno prebaciti aplikaciju na neki hosting koji ima podršku za node.js. Ovaj postupak zavisi od same konfiguracije hosting-a i opcionog sofrvera koji je instaliran na njemu (C-panel, Plesk…). Ukoliko imate na hosting mašini instaliran Plesk ovde možete pročitati kako se obezbedjuje rad node.js na takvom serveru.

Podelite:

Ostavite komentar