Što je Node.js? Objašnjeno vrijeme izvođenja JavaScripta

Skalabilnost, latencija i protok ključni su pokazatelji učinkovitosti web poslužitelja. Održavanje niske latencije i velike propusnosti tijekom povećavanja i smanjivanja nije lako. Node.js je JavaScript runtime okruženje koje postiže nisku latenciju i veliku propusnost primjenom "neblokirajućeg" pristupa posluživanju zahtjeva. Drugim riječima, Node.js ne troši vrijeme ni resurse na čekanje povratka I / O zahtjeva.

U tradicionalnom pristupu stvaranju web poslužitelja, za svaki dolazni zahtjev ili vezu poslužitelj generira novu nit izvršenja ili čak oblikuje novi postupak za obradu zahtjeva i slanje odgovora. Konceptualno, ovo ima savršenog smisla, ali u praksi za to ima puno troškova.

Iako mrijesti niti rezultiraju manje memorije i CPU-a od forking procesa , to i dalje može biti neučinkovito. Prisutnost velikog broja niti može uzrokovati da jako opterećeni sustav troši dragocjene cikluse na raspoređivanje niti i prebacivanje konteksta, što dodaje kašnjenje i nameće ograničenja skalabilnosti i propusnosti.

Node.js ima drugačiji pristup. Pokreće jednonitnu petlju događaja registriranu u sustavu za rukovanje vezama, a svaka nova veza pokreće JavaScript funkciju povratnog poziva . Funkcija povratnog poziva može obrađivati ​​zahtjeve s neblokirajućim I / O pozivima, a ako je potrebno može izvoditi niti iz spremišta za izvršavanje blokadnih ili CPU intenzivnih operacija i za uravnoteženje opterećenja na CPU jezgrama. Nodeov pristup skaliranju s funkcijama povratnog poziva zahtijeva manje memorije za obradu više veza od većine konkurentnih arhitektura koje se skaliraju nitima, uključujući Apache HTTP poslužitelj, različite Java aplikacijske poslužitelje, IIS i ASP.NET i Ruby on Rails.

Pokazalo se da je Node.js vrlo koristan za stolne programe uz poslužitelje. Također imajte na umu da Node aplikacije nisu ograničene na čisti JavaScript. Možete koristiti bilo koji jezik koji se prevodi na JavaScript, na primjer TypeScript i CoffeeScript. Node.js uključuje JavaScript mehanizam Google Chrome V8, koji podržava sintaksu ECMAScript 2015 (ES6) bez potrebe za transpilerom ES6 u ES5, kao što je Babel.

Većina uslužnih programa Node dolazi iz velike biblioteke paketa kojoj je dostupna iz npmnaredbe. NPM, upravitelj paketa Node, dio je standardne instalacije Node.js, iako ima svoje web mjesto.

Povijest JavaScript-a

1995. godine Brendan Eich, tada dobavljač Netscapea, stvorio je JavaScript jezik za pokretanje u web preglednicima - kako priča kaže, za 10 dana. JavaScript je u početku trebao omogućiti animacije i druge manipulacije objektnim modelom dokumenata preglednika (DOM). Nedugo zatim predstavljena je verzija JavaScript-a za Netscape Enterprise Server.

Ime JavaScript odabrano je u marketinške svrhe, jer je u to vrijeme Sunov Java jezik bio široko rasprostranjen. U stvari, jezik JavaScript zapravo se temeljio prvenstveno na jezicima Scheme i Self, s površnom semantikom sličnom Javi.

U početku su mnogi programeri JavaScript odbacivali kao beskoristan za "stvarni posao", jer je njegov tumač redoslijed radio sporije od kompajliranih jezika. To se promijenilo jer je nekoliko istraživačkih napora usmjerenih na ubrzavanje JavaScript-a počelo uroditi plodom. Najistaknutije je da JavaScript mehanizam otvorenog koda Google Chrome V8, koji vrši pravodobnu kompilaciju, ugrađivanje i dinamičku optimizaciju koda, zapravo može nadmašiti C ++ kôd za neka opterećenja i u većini slučajeva nadmašuje Python.

Platformu Node.js zasnovanu na JavaScriptu predstavio je 2009. godine Ryan Dahl za Linux i MacOS kao skalabilniju alternativu Apache HTTP poslužitelju. NPM, napisao Isaac Schlueter, pokrenut 2010. Izvorna Windows verzija Node.js debitirala je 2011. godine.

Joyent je dugi niz godina posjedovao, upravljao i podržavao razvojne napore Node.js-a. U 2015. godini projekt Node.js predan je Zakladi Node.js i njime je upravljao tehnički upravni odbor zaklade. Node.js je također prihvaćen kao Linux Foundation Collaborative Project. U 2019. godini Zaklada Node.js i Zaklada JS spojile su se i formirale OpenJS Foundation.

Osnovna arhitektura Node.js

Na visokoj razini, Node.js kombinira Google V8 JavaScript mehanizam, jednonitnu neblokirajuću petlju događaja i I / O API niske razine. Skraćeni primjer koda prikazan u nastavku ilustrira osnovni obrazac HTTP poslužitelja, koristeći funkcije strelica ES6 (anonimne Lambda funkcije deklarirane pomoću operatora masne strelice, =>) za povratne pozive.

Početak koda učitava HTTP modul, postavlja hostnamevarijablu poslužitelja na localhost(127.0.0.1) i postavlja portvarijablu na 3000. Zatim stvara poslužitelj i funkciju povratnog poziva, u ovom slučaju masnu strelicu koja uvijek vraća istu odgovor na bilo koji zahtjev: statusCode200 (uspjeh), običan tekst vrste sadržaja i tekstualni odgovor od ”Hello World\n”. Konačno, govori poslužitelju da sluša na localhostpriključku 3000 (putem utičnice) i definira povratni poziv za ispis poruke dnevnika na konzoli kada poslužitelj počne slušati. Ako pokrenete ovaj kod u terminalu ili konzoli pomoću nodenaredbe, a zatim pregledavate localhost: 3000 pomoću bilo kojeg web preglednika na istom stroju, u vašem ćete pregledniku vidjeti "Hello World". Da biste zaustavili poslužitelj, pritisnite Control-C u prozoru terminala.

Imajte na umu da je svaki poziv upućen u ovom primjeru asinkroni i neblokirajući. Funkcije povratnog poziva pozivaju se kao odgovor na događaje. createServerPovratni poziv obrađuje zahtjev klijenta događaj i vraća odgovor. listenPovratni poziv obrađuje listeningdogađaj.

Biblioteka Node.js

Kao što možete vidjeti na lijevoj strani donju sliku, Node.js ima širok raspon funkcionalnosti u svojoj knjižnici. HTTP modul koji smo ranije koristili u uzorku koda sadrži i klase klijenta i poslužitelja, kao što možete vidjeti na desnoj strani slike. Funkcija HTTPS poslužitelja koja koristi TLS ili SSL živi u zasebnom modulu.

Jedan svojstveni problem kod jednonitne petlje događaja je nedostatak vertikalnog skaliranja, jer će nit niti petlje događaja koristiti samo jednu CPU jezgru. U međuvremenu, moderni CPU čipovi često izlažu osam ili više jezgri, a moderni serveri često imaju više CPU čipova. Aplikacija s jednim navojem neće u potpunosti iskoristiti 24-jezgre u robusnom poslužiteljskom stalku.

To možete popraviti, iako je potrebno neko dodatno programiranje. Za početak Node.js može stvoriti podređene procese i održavati cijevi između roditelja i djece, slično načinu na koji popen(3)funkcionira sistemski poziv, koristeći child_process.spawn() i srodne metode.

Klaster modul je čak zanimljiviji od podređenog procesnog modula za stvaranje skalabilnih poslužitelja. The cluster.fork()metoda mrijesti radnik procesi koji dijele poslužitelja luka roditelja, korištenjem child_process.spawn()ispod pokrivača. Master klastera distribuira dolazne veze među svojim radnicima koristeći, prema zadanim postavkama, algoritam s kružnim robinom koji je osjetljiv na opterećenja procesa radnika.

Imajte na umu da Node.js ne pruža logiku usmjeravanja. Ako želite održavati stanje na vezama u klasteru, morat ćete zadržati svoje sesije i objekte za prijavu negdje drugdje, osim radničke RAM-a.

Ekosustav paketa Node.js

U NPM registru smješteno je više od 1,2 milijuna paketa besplatnog koda Node.js koji se može ponovno koristiti, što ga čini najvećim softverskim registrom na svijetu. Imajte na umu da većina NPM paketa (u osnovi mape ili NPM stavke registra koji sadrže program opisan datotekom package.json) sadrži više modula (programa koje učitavate requireizjavama). Lako je pomiješati ta dva pojma, ali u ovom kontekstu oni imaju specifična značenja i ne bi ih trebalo mijenjati.

NPM može upravljati paketima koji su lokalne ovisnosti određenog projekta, kao i globalno instaliranim JavaScript alatima. Kada se koristi kao upravitelj ovisnosti za lokalni projekt, NPM može u jednoj naredbi instalirati sve ovisnosti projekta putem datoteke package.json. Kada se koristi za globalne instalacije, NPM često zahtijeva sistemske (sudo) privilegije.

Ne morate koristiti naredbeni redak NPM za pristup javnom registru NPM. Ostali upravitelji paketa, poput Facebookove pređe, nude alternativna iskustva na strani klijenta. Pakete možete pretraživati ​​i pretraživati ​​i putem web stranice NPM.

Zašto biste željeli koristiti NPM paket? U mnogim je slučajevima instaliranje paketa putem naredbenog retka NPM najbrže i najprikladnije za dobivanje najnovije stabilne verzije modula koji se izvodi u vašem okruženju, a obično je manje posla od kloniranja izvornog spremišta i izgradnje instalacije iz spremišta. Ako ne želite najnoviju verziju, možete navesti broj verzije za NPM, što je posebno korisno kada jedan paket ovisi o drugom paketu i može prekinuti s novijom verzijom ovisnosti.

Na primjer, Express framework, minimalni i fleksibilni okvir web aplikacija Node.js, pruža robustan skup značajki za izgradnju pojedinačnih i hibridnih web stranica s više stranica i hibridnih web aplikacija. Dok se Expresscode spremište s lakoćom klonira nalazi na //github.com/expressjs/express, a Express dokumentacija je na //expressjs.com/, brzi način da počnete koristiti Express je njegova instalacija u već inicijalizirani lokalni radni razvoj direktorij s npmnaredbom, na primjer:

$ npm install express —save

—saveOpcija, koja je zapravo prema zadanim postavkama u NPM 5.0 i kasnije, kaže upravitelj paketa dodati Express modul na popis ovisnosti u package.json datoteke nakon instalacije.

Još jedan brzi način da počnete koristiti Express je globalna instalacija izvršnog generatora,express(1) a zatim ga koristite za lokalno stvaranje aplikacije u novoj radnoj mapi:

$ npm install -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

Nakon što ste to postigli, možete koristiti NPM za instaliranje svih potrebnih ovisnosti i pokretanje poslužitelja, na temelju sadržaja datoteke package.json koju je stvorio generator:

$ npm instalacija

$ npm početak

Teško je odabrati najvažnije od milijun paketa u NPM-u, ali nekoliko se kategorija ističe. Express je najstariji i najistaknutiji primjer Node.js okvira. Sljedeća velika kategorija u NPM spremištu su uslužni programi za razvoj JavaScript-a, uključujući browserify, paket za module; bower, upravitelj paketa preglednika; grunt, pokretač JavaScript zadataka; i gutljaj, sustav za izgradnju streaminga. Konačno, važna kategorija za programere za poduzeće Node.js su klijenti baze podataka, kojih ima više od 8000, uključujući popularne module kao što su redis, mongoose, firebase i pg, PostgreSQL klijent.

Da rezimiramo, Node.js je JavaScript okruženje za izvršavanje na različitim platformama za poslužitelje i aplikacije. Izgrađen je na jednonitnoj neblokirajućoj petlji događaja, JavaScript mehanizmu Google Chrome V8 i I / O API-ju niske razine. Razne tehnike, uključujući modul klastera, omogućuju Node.js aplikacijama skaliranje izvan jedne procesorske jezgre. Osim svoje osnovne funkcije, Node.js nadahnuo je ekosustav od više od milijun paketa koji su registrirani i postavljeni u verziju NPM spremišta, a mogu se instalirati pomoću naredbenog retka NPM ili alternative kao što je Yarn.