Mi az a Node.js?
A Node.js egy nyílt forráskódú, platformfüggetlen futtatási
környezet, amely lehetővé teszi, hogy a JavaScript nyelvet ne csak a
böngészőben, hanem szerveroldalon is használjuk. Ez azt jelenti, hogy a
JavaScript segítségével nemcsak interaktív weboldalakat készíthetünk, hanem
teljes szerveroldali alkalmazásokat is fejleszthetünk.
NodeJs egy olyan futtató környezet, ami lehetőséget nyújt
JavaScriptben írt programok futtatására szervereken. JavaScriptet leginkább a
kliens oldalon szokták használni, a böngészőn keresztül. Ahhoz, hogy, megértsük
miképp futtathatunk JavaScript kódot szerveren, először nézzük meg, miképp
valósul meg ugyanez a böngészőn keresztül. A böngésző applikáció fejlesztők
számára olyan motorokat kell biztosítani (a Google Chrome esetén a v8 engine),
amik a JavaScript kódot gépi nyelvként interpretálják és le is futtatják.
Alapvetően a NodeJs is ugyanazt a v8 engine-t használja, némi módosítással.
Most felmerülhet bennünk az a kérdés, hogy miben jobb, mint a PHP, asp.net, stb.
? Annyi könnyebbséget nyújt, ha már dolgoztunk frontend oldalon, nem kell egy
teljesen új nyelvet megtanulni ahhoz, hogy a backend-et is implementáljuk. Tehát
ha valaki megtanulta a javascriptet, akkor nem kell új programnyelvet tanulnia
ahhoz, hogy a szerver oldalon is tudjon programozni. Lényegében ugyanazokkal az
eljárásokkal, függvényekkel, szintaxissal tudsz szerver oldali alkalmazást is
írni. Tehát nagyon leegyszerűsítve ez a lényege.
A másik előnye az, hogy a non-blocking természetéből adódóan
alkalmas egyszerre több ezer bejövő 'egyszerű' kérés kezelésére. A Node.js-t
úgy írták meg, hogy (szinte) minden esemény aszinkron legyen, ezért az program
sosem blokkolódik, azaz nem kell várni, hogy egy művelet befejeződjön, vele
párhuzamosan futtathatunk további műveleteket. Ez pontosan ugyan úgy működik,
mint a böngészőben levő XHR kérések, vagy más események, mint például a click,
mouseover. Ez az alkalmazás folyamatosabb futását, több alkalmazás
párhuzamosítását, valamint az egész rendszer optimálisabb működését teszi
lehetővé. Tehát ebből is látszik, hogy másik nagy előnye az, hogy kezeli az
eseményeket is más szerver oldali alkalmazásokkal szemben.
A hétköznapi életben az egyik legelterjedtebb variáció, az
Apache és php kombinációja. Ez úgy néz ki, hogy kap egy kérést az Apache
szerver valahonnan, egy böngészőből a netről, 80-as porton. Amikor megkapja a
kérést akkor megnézni, hogy hol van az erőforrás amit kértek, hol van az a
honlap, és ha megtalálja, az „index.php” a kezdő fájl, akkor meghívja a php-t
elindítja, a php legenerálja az oldal tartalmát neki, amikor végzett akkor
vissza adja a vezérlést az Apache szervernek. Az Apache szerver lelövi a php-t
kész vége a folyamatnak, leáll, és utána vissza küldi a tartalmat a kliens
felé, és bontja a kapcsolatot. Tehát így néz ki egy http kérés.
Érdekesség képpen, vizsgáljuk meg a „nodejs-org” oldalt,
nyomjunk neki egy f12-t, kattintsunk a Network fülre, és itt ha egy f5-öt, ha
nyomunk újra frissíti az oldalt, és itt látható hogy egy csomó kérést elküld a
szerver felé az oldalunk, és látható, hogy mi az amit legelőször lekér, az a
document, tehát mindig a legelső az a html váza az oldalnak, ami lejön a
szerverről. ugye a html dokumentunk ezzel még sokat fogunk foglalkozni, az egy
xml-ben htmlxml-ben írt dokumentum, rákattintva látható is a nyers váza az
oldalnak, itt vannak leírva az alapvető scriptek stb. illetve egy csomó
hivatkozást tartalmaz. A böngésző úgy dolgozik, hogy föntről lefelé elindul,
teljesen egyszerűen, mint ahogyan az ember olvassa soronként elolvassa ezt a
kódot, és amit ott talál azt végre hajtja. Először megnézi, hogy dokumentum
típusa html, majd látja, hogy elindul a html-ünk, html nyitó tag, beállítja a
nyelvet angolul, aztán jön fejrész, beállítja a karakterkódolást, majd a címet,
beállítja a linkeket megy tovább. Utána talál egy scriptet lefutatja a
scirptet, és amíg a scirpt nem futott le addig nem megy tovább, majd jön az
oldalnak a body része amit mindenki lát, abban is van egy header, container,
talál egy ilyet img src, az srcből tudja hogy ez egy külső erőforrás be kell
olvasnunk, meghívja újra küld egy kérést a szerver felé, letölti a logo.svg
fájlt, ha kész van megy tovább. Utána megkeresi a következő ilyen hivatkozást,
és még sok minden más huncutság van itt sorról sorra és a végén van egy css
fájl, ami gyakorlatilag az oldal megjelenését írja le, azt is lekéri, aztán
látható benne webfont.js fáj, javascript fájl, aztán még jónéhány javascriptet
lefuttat, és a végén kiszáll. Ez egy tipikus weboldal ebből a szempontból és ha
a network fül alatt megnézzük, látható hány kérést küldött pl 14-et a szerver
felé a böngészőnk, és azt is láthatjuk ezen kérések során, milyen mennyiségű
fájlt mozgatott meg. Nem túl sok ha már be van cash-elve.
Ezt azért néztük meg, mert a nodejs egy tipikusan szerver
alkalmazás, kiszolgáló alkalmazás. Tehát ha mi nodejs-ben szeretnénk egy
weblapot elkészíteni, akkor az összes kérést ami itt fel van sorolva mindet a
nodejs-nek kell kiszolgálni. Elküldi a tartalmat a html-t kiszolgálja a
fájlokat, vissza küldi a felhasználónak a kért fájlokat, összeállítja a tartalamat
templatekből, minden egyes kérésnél beállítja a fejlécket, stb ezt mind mind a
nodejs fogja kiszolgálni.
Nincs külön szerveroldali nyelv mint a php, nincs külön
szerver mint IS vagy apache, hanem a kettő egyben van. Tulajdonképpen mind a
kettő a nodejs. A nodejs egy személyben ő szerver is és ő generálja a tartalmat
is. A klasszikus megközelítés az volt, hogy mindig külön volt a szerver program
és külön a kódgenerátor. Típustól függően microsoftos kódgenerátor php vagy
bármi más, ami generálta a kódot, itt a kettő egyben van!
Hátránya, hogy
mivel összetetetettebb kódot kell írni, könnyebb elrontani. Ugyanaz végzi a
fájlkiszolgálást is meg a tartalom generálást is.
Előnye, hogy
lényegesen kisebb a processzor és a memória felhasználása. Miért, mert mindegy
egyes folyamat amit fut a szerveren, ugyanúgy mint a windowson ha megnyitjuk a
folyamat kezelőt, minden egyes folyamat foglal memóriát, processzor időt stb.
Itt ebben az esetben nem kell két folyamatot futtatnia, külön a szervert külön
a generátort, hanem egy folyamat fut csak, jellemzően olyan ötöde tizede a
memória felhasználása, egy ugyanakkora oldanál egy nodejsnek mint pl az apache
php kombónak. Ez egy nagyon nagy előny. Nem blokkolja az I/O modelt,
Az oldalon láthatjuk le van írva angolul, hogy a nodejs egy
eseményvezérelt rendszert használ, az input output modell tulajdonképpen a
kapcsolódás és lekapcsolódás, amikor egy hagyományos szerver végez bontja a kapcsolatot a felhasználóval. Viszont a
nodejs-el meg tudjuk azt csinálni, hogy amikor kiszolgálta a felhasználó
kérését utána kapcsolatban marad egy socketen keresztül a felhasználó gépével,
és nem kell mindig minden kérésnél újra felépíteni a kapcsolatot, hanem a
meglévő csatornán socketen keresztül tudnak kommunikálni egymással. (socket –
konnektort jelent) tehát be van csatlakoztatva a konektorba a felhasználó és
folyamatos a kapcsolat a két fél között.
A Node.JS és a böngésző jelentősen különböznek egymástól,
annak ellenére, hogy mindkettő a JavaScript nyelven alapszik. A node.js veszi
az alap nyelvet, akárcsak bármelyik böngésző motor, és különböző API-kkal
bővíti azt, ezzel lehetőséget nyújtva szerveroldali műveletekre, hálózati
feladatok ellátására.
Először is nézzük meg, hogy a node.js milyen futtatási
környezetben működik, és hogyan illeszkedik abba a rendszerbe, amivel már
kliens oldali fejlesztőként találkoztatok. Ehhez nyugodtan elővehetjük azt a
kis ábrát, amit a javascripttel való ismerkedés elején néztünk meg, ami
bemutatja a http protkoll alapvető működését.
A böngészőben működik
egy beépülő program, egy ún js engine vagy js motor, ez egy interpreter, amibe
a bemenet a js nyelven írott kód, és amit ez csinál, az az, hogy vezérli a
böngészőt. Ezt több módon is teszi, többek között az enginet a motort tudja
vezérelni, tehát a html dokumentumot, tulajdonképpen megvan a motornak a
hatalma arra, hogy elementeket hozzon létre, vagy bármely element bármely
attribútumát módosítsa. Emellett hozzáférése van az ún console-hoz, ami egy
interfész arra, hogy mi közvetlenül kommandokat tudjunk beküldeni az enginenek,
és meg is tudjuk nézni azt, amit az engine vissza küld válaszként. A console-t
sokat fogjuk használni. Emellett az enginenek megvan a hatalma arra, hogy ő
maga küldjön ilyen http kéréseket, és a beérkező válaszokat feldolgozza, ezek
az ún ajax kérések, és nagyon nagy szerepük van a kliens oldali
alkalmazásokban. Emellett az enginen keresztül adatot is tudunk tárolni,
létezik a böngészőnek egy local storage nevű szekciója, ahol elhelyezhetünk
adatot és később akár újabb oldalletöltéssel kiolvashatunk minden adatot.
Manapság már nemcsak a kliens oldalon működik javascript engine, hanem már
megannyi futtatási környezetben használható ez a motor, többek között szerver
oldalon is futtatható. Node.js programon keresztül is használható az engine, de
ebben a kontextusban merőben eltérő feladatai vannak az enginennek, hiszen ő a
kéréseket fogadja és ezekre válaszokat küld. Tehát célját és feladatait
tekintve abszolút eltér a kliens oldalon használt engine-től.
A kliens oldalon két
fő feladata van a js—nek, egyrészt a html elementek módosítása révén elérhető
egyfajta interakció fokozás, másrészről meg ajax kérések küldése révén tudunk
oldal letöltés nélkül kis mennyiségű adatért folyamodni a szerver oldalra.
Amennyiben maxra járatjuk a js kódot, a kliens oldalon létrehozhatunk olyan
user interface-ket, amik oldal letöltés nélkül kommunikálnak folyamatosan a
szerver oldalra és ilyen olyan interaktív hatásokat is hoznak létre tehát akár
egy telefonos applikáció hatását is keltik, egy klasszikus értelemben vett
weboldal hatását, ahol kattintgatunk és frissülnek az oldalak, tehát egy
folyamatos smooth élményt egy megszakítás nélküli felhasználói élményt
nyújtanak.
Nézzük tovább, ha van egy szervered, akkor a nodejs program
milyen feladatokat hivatott ott ellátni. Ha pl nodejs szervert üzemeltetsz a
szerver elsődleges célja a http kéréseknek a fogadása, majd a kérés alapján egy
http válasz megküldése. Most átülünk a rendszer másik oldalára, ahol a
kéréseket fogadjuk, és a válaszokat küldjük. A szerverednek hozzáférése van a
lokális gépednek a fájl rendszeréhez. Az előző képet egy kis dobozkával lehet
kiegészíteni file system, ebbe a fájl rendszerbe a node js program tud írni, és
tud belőle olvasni. Emellett a nodejs applikáció tipikusan kapcsolatba lép
adatbázissal, ez által a rendszer alkalmassá válik klienstől kapott adat
eltárolására, majd akár egy újabb beérkező request kapcsán az adat kiolvasására
majd a válaszként való megküldésére. A két rendszer működése a való életben úgy
néz ki, hogy teszem azt le akarod tölteni a portfolio.hu oldalát, ezért beírod
url-nek, hogy portfolio.hu, és rányomsz az enterre. Ekkor a böngésző kiküld egy
http kérést, a portfolio.hu szerverének, ezt a kérést a szerver egy adott
portján keresztül fogadja, majd a fájl rendszeréből egy html sablont olvas be.
Emellett az adatbázissal is kapcsolatba lép, és kiolvassa a napi legfrissebb
híreket. A beolvasott html sablonból, valamint az adatbázisból származó
információból össze állít, specifikus, arra az adott napra aktuálisan érvényes
html dokumentumot. Ezt a dokumentumot megküldi válaszként a kliensnek. A
böngésző ezután kirendereli a tartalmat, valamint hogyha a html tartalomban
vannak hivatkozások, további erőforrásra, azokat a kéréseket kiküldi szintén
szerver oldalra. Az adott esetben ilyen módon kiszolgált szerver oldali
scriptek lefutnak a böngészőben. Amennyiben a html tartalomban vannak
interaktív komponenesek, teszem azt megnézzük a tőzsdei információkat valós
időben (itt 15 perces késéssel látjuk, valós időhoz előfizetés szükséges)
szolgáltató interaktív komponenst, akkor az interaktivitást a szerverről
megkapott kliens oldali script biztosítja, és ez a js kód folyamodhat friss
tőzsdei adatokhoz, időként a szerverhez, tehát ő maga kiküldhet http kérést,
miután az oldalt letöltöttük. Ebben az esetben ez a kérés szerver oldalon
szintén beérkezik egy bizonyos portra. A nodjs a kérésnek megfelelő adatokat
kiolvassa, majd ezt json formátumban küldi meg válaszként. A beérkező json
tartalmat a js app kirendereli kliens oldalon, így egy folyamatosan frissülő
tartalmat láthatunk.
Amit fontos látnunk, hogy a szerver, amikor először
letöltöttük az oldalt, még csak egy html tartalommal válaszolt, és ez volt az
első dolog amit a kliens megkapott. Utána a kliens kért tőle képeket,
scripteket, css fájlokat, majd amikor a script elkezdett futni, és ajax kérést
küldött ki, akkor a szerver json tartalmat is szolgáltatott. Tehát a szerver
sokfajta tartalom típus szolgáltatásért felelős. Ezeket fogjuk megnézni, hogy a
különböző tartalom típusokra irányuló kéréseket, hogyan tudjuk teljesíteni,
kiszolgálni, illetve hogyan tudjuk őket szerver oldalon kezelni.
A Node.js Története
A Node.js-t Ryan Dahl alkotta meg 2009-ben. Az ötlet abból
származott, hogy Dahl szerette volna megoldani a webszervereknél gyakori
problémát: a lassú I/O műveleteket, amelyek a felhasználói élményt jelentősen
ronthatják. Az Apache webszerver, amely abban az időben a legelterjedtebb volt,
minden egyes kliens számára új szálat nyitott, ami nagy terhelés esetén jelentős
erőforrás-felhasználást eredményezett. Dahl felismerte, hogy egy nem blokkoló,
eseményvezérelt modellt használó környezet sokkal hatékonyabb lehet.
A Node.js hamar elterjedt a fejlesztők körében, különösen azok körében, akik
nagy terhelésű, skálázható alkalmazásokat szerettek volna készíteni, mint
például a valós idejű chat alkalmazások vagy a streaming szolgáltatások. A
Node.js népszerűségét az is növelte, hogy ugyanazt a nyelvet használhatják a
fejlesztők a kliens és a szerver oldalon is, ami egységesíti és egyszerűsíti a
fejlesztést.
Főbb Jellemzők
1.
Aszinkron és eseményvezérelt:
A Node.js nem blokkoló I/O modellt használ. Ez azt jelenti, hogy amikor a
szerver egy műveletet, például egy adatbázis-lekérdezést hajt végre, nem várja
meg a művelet befejezését, mielőtt továbblépne a következő műveletre. Ehelyett
események alapján működik: ha egy művelet befejeződik, egy esemény jön létre,
amely elindítja a megfelelő visszahívó (callback) függvényt. Ez a megközelítés
lehetővé teszi, hogy a Node.js egyszerre nagy mennyiségű párhuzamos kérést
kezeljen, anélkül hogy várakoznia kellene egy-egy művelet befejezésére.
2.
Egyszálú, de nem korlátozott:
A Node.js alapvetően egyszálú, ami azt jelenti, hogy minden művelet ugyanazon a
szálon fut. Azonban a háttérben, a Node.js belső működésében több szál is
dolgozik a nehéz, számításigényes feladatok kezelésére (például fájlok
olvasása/írása, hálózati kapcsolatok kezelése). Ez az egyszálú, de
eseményvezérelt megközelítés lehetővé teszi a magas párhuzamosságot, miközben a
fejlesztőnek nem kell aggódnia a szálkezelés miatt.
3.
Modularitás:
A Node.js moduláris felépítésű, ami azt jelenti, hogy különböző funkciókat
elkülönítve, modulokba szervezhetünk. Ezáltal könnyebb újrahasznosítani a
kódot, és a projekt különböző részein ugyanazokat a modulokat használhatjuk. A
Node.js közössége által létrehozott modulok és csomagok hatalmas tárháza
található a npm (Node Package Manager) segítségével, amely egy
olyan eszköz, amely lehetővé teszi ezen modulok könnyű kezelését és
telepítését.
Miért Használjuk a
Node.js-t?
A Node.js-t széles körben használják különféle típusú alkalmazások
fejlesztésére:
- Webszerverek: Kiválóan
alkalmas webszerverek fejlesztésére, mivel hatékonyan kezeli a nagy
mennyiségű kérést.
- Valós idejű alkalmazások:
Például chat alkalmazások, ahol a szervernek nagyon gyorsan kell
válaszolnia a felhasználói eseményekre.
- REST API-k: A Node.js
egyszerűsíti a RESTful API-k fejlesztését, amelyek az adatbázisokkal való
kommunikációra használhatók.
- Streaming alkalmazások: A
nem blokkoló modell különösen jól használható streaming szolgáltatások
fejlesztésére.
A Node.js
Elterjedtsége és Verziói
A Node.js nagyon elterjedt a fejlesztők körében, különösen a modern webes
alkalmazások fejlesztése során. A nagy tech cégek, mint a Netflix, Uber, PayPal
és LinkedIn is használják a Node.js-t különféle szolgáltatásaikhoz. Az egyik
legnagyobb előnye a nagy közösség és a rengeteg elérhető modul, amely lehetővé
teszi a gyors fejlesztést és innovációt.
A Node.js-nek több hivatalos verziója van, és ezek rendszeresen frissülnek.
Az LTS (Long-Term Support) verziók azok, amelyeket hosszabb
ideig támogatnak, és ezek a verziók a stabilitást és a hosszú távú támogatást
kereső fejlesztők számára ajánlottak. Az aktuális verziók
azok, amelyekben az új funkciók és fejlesztések először jelennek meg, és ezek
gyorsabban frissülnek, de kevésbé stabilak.
Node.js Licenc és
Közösség
A Node.js nyílt forráskódú, ami azt jelenti, hogy ingyenesen használható,
módosítható és terjeszthető. A projektet a Node.js Foundation
kezeli, amely a Linux Foundation része. Ez a szervezet
felügyeli a Node.js fejlesztését és biztosítja annak folyamatos fejlődését és
támogatását.
A nyílt forráskódú természet és a nagy, aktív közösség miatt a Node.js
folyamatosan fejlődik, és új funkciókkal, optimalizációkkal bővül. A fejlesztők
világszerte hozzájárulnak a Node.js kódjához, modulokat fejlesztenek, és
megosztják tudásukat a közösség többi tagjával.
Összefoglalás
A Node.js egy rendkívül népszerű és erőteljes eszköz a modern webes és szerveroldali
alkalmazások fejlesztéséhez. Kiváló teljesítményt nyújt az aszinkron, nem
blokkoló modelljének köszönhetően, és lehetővé teszi a fejlesztők számára, hogy
JavaScriptet használjanak mind a szerver, mind a kliens oldalon. A nagy
közösség és az ingyenesség pedig még vonzóbbá teszi a Node.js-t, különösen a
skálázható, nagy terhelésű alkalmazások fejlesztésében.
1.2. Node.js Telepítése
A Node.js telepítése rendkívül egyszerű és gyorsan
elvégezhető. A következő lépéseken keresztül telepíthetjük a Node.js-t
különböző operációs rendszereken.
Telepítés Windows-on:
- Látogassunk
el a Node.js hivatalos
weboldalára.
- Töltsük
le a legfrissebb stabil verziót.
- Futtassuk
a telepítőt, kövessük az utasításokat, és zárjuk le a telepítési
folyamatot.
Telepítés MacOS-on:
- Nyissuk
meg a terminált.
- Telepítsük
a Homebrew csomagkezelőt, ha még nincs telepítve:
/bin/bash -c
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- A Homebrew segítségével telepítsük a Node.js-t:
brew install node
Telepítés Linux-on
(Ubuntu):
- Nyissuk
meg a terminált.
- Frissítsük
a csomagkezelő listákat:
sudo apt update
- Telepítsük
a Node.js-t:
sudo apt install nodejs
- Telepítsük
a Node Package Manager-t (npm):
sudo apt install npm
1.3. Környezet Beállítása
A telepítés után ellenőrizzük, hogy a Node.js és az npm helyesen települt-e.
Ehhez a következő parancsokat használjuk a terminálban vagy parancssorban:
node -v
npm -v
Ezek a parancsok a telepített Node.js és npm verziószámát adják vissza.
Például:
8.3.1
Példák
1.4. "Hello, World!" Példa
A Node.js használatának megismeréséhez készítsünk el egy egyszerű
"Hello, World!" alkalmazást.
- Hozzunk
létre egy új fájlt, például
app.js
néven. - Írjuk
be a következő kódot a fájlba:
// app.js
console.
log(
'Hello, World!');
- Mentsük
el a fájlt, majd futtassuk a következő parancsot a terminálban:
node app.js
- A
terminálban a következő üzenetet kell látnunk:
Ez egy egyszerű példa arra, hogyan futtathatunk JavaScript kódot szerver
oldalon a Node.js segítségével.
Feladat
1.5. Feladat: Készítsünk egy egyszerű szervert
A feladatod az, hogy készíts egy egyszerű HTTP szervert, amely a böngészőben
megjeleníti a "Hello, Node.js!" üzenetet.
Megoldás
- Hozz
létre egy új fájlt
server.js
néven. - Másold be
a kódot:
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, Node.js!\n');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server is running at http://127.0.0.1:3000/');
});
- Futtasd
a szervert a következő parancs kiadásával:
node server.js
- Nyiss
meg egy böngészőt, és írd be a következő URL-t:
http://127.0.0.1:3000/
. Ha minden jól működik, a következő üzenetet kell látnod:
Ezzel készen is van az első egyszerű Node.js szervered!
Szerver leállítása: ctrl + C
https://www.w3schools.com/nodejs/nodejs_get_started.asp
Házi feladat: telepítsd otthon a nodejs-t, és próbáld ki az 1.5 példakódot futtasd otthon a saját gépeden.
1 és 2 csop 2024.09.03
Nincsenek megjegyzések:
Megjegyzés küldése