Programovanie

Čo je Node.js? Vysvetlenie modulu runtime jazyka JavaScript

Škálovateľnosť, latencia a priepustnosť sú kľúčové ukazovatele výkonu webových serverov. Udržiavanie nízkej latencie a vysokej priepustnosti pri škálovaní a odďaľovaní nie je ľahké. Node.js je behové prostredie JavaScriptu, ktoré dosahuje nízku latenciu a vysokú priepustnosť prijatím prístupu „neblokujúceho“ k poskytovaniu požiadaviek. Inými slovami, Node.js nestráca čas a prostriedky na čakanie na návrat vstupno-výstupných požiadaviek.

V tradičnom prístupe k vytváraniu webových serverov je pre každú prichádzajúcu požiadavku alebo pripojenie server založí nový vlákno exekúcie alebo dokonca vidličky nový procesu vybaviť žiadosť a poslať odpoveď. Z koncepčného hľadiska to dáva zmysel, ale v praxi to vyžaduje veľkú réžiu.

Počas neresenia nite zaberá menej pamäte a réžie procesora ako rozdvojenie procesy, môže to byť stále neúčinné. Prítomnosť veľkého počtu vlákien môže spôsobiť, že silne zaťažený systém strávi drahocenné cykly plánovaním vlákien a prepínaním kontextu, čo zvyšuje latenciu a obmedzuje škálovateľnosť a priepustnosť.

Node.js má iný prístup. Spustí slučku udalostí s jedným vláknom zaregistrovanú v systéme na spracovanie pripojení a každé nové pripojenie spôsobí výskyt JavaScriptu funkcia spätného volania prepustit zo zamestnania. Funkcia spätného volania dokáže spracovať požiadavky s neblokujúcimi I / O hovormi, a ak je to potrebné, môže vytvoriť vlákna z fondu na vykonanie blokujúcich alebo na CPU náročných operácií a na vyváženie zaťaženia medzi jadrami CPU. Prístup spoločnosti Node k škálovaniu pomocou funkcií spätného volania vyžaduje menej pamäte na zvládnutie väčšieho počtu pripojení ako väčšina konkurenčných architektúr škálovaných pomocou vlákien vrátane servera Apache HTTP Server, rôznych aplikačných serverov Java, IIS a ASP.NET a Ruby on Rails.

Ukázalo sa, že súbor Node.js je okrem serverov aj celkom vhodný pre desktopové aplikácie. Upozorňujeme, že aplikácie uzlov nie sú obmedzené iba na čistý JavaScript. Môžete použiť akýkoľvek jazyk, ktorý sa prekladá do JavaScriptu, napríklad TypeScript a CoffeeScript. Node.js obsahuje JavaScriptový engine Google Chrome V8, ktorý podporuje syntax ECMAScript 2015 (ES6) bez potreby prekladača ES6-to-ES5, ako je Babel.

Veľa nástrojov Node pochádza z jeho veľkej knižnice balíkov, ktorá je prístupná z npm príkaz. NPM, správca balíkov uzlov, je súčasťou štandardnej inštalácie Node.js, hoci má svoju vlastnú webovú stránku.

Niekoľko histórie JavaScriptu

V roku 1995 Brendan Eich, ktorý bol dodávateľom spoločnosti Netscape, vytvoril jazyk JavaScript, ktorý sa bude dať spustiť vo webových prehliadačoch - za 10 dní, ako to bude pokračovať. JavaScript bol pôvodne určený na umožnenie animácií a iných manipulácií s objektovým modelom dokumentu prehliadača (DOM). Krátko nato bola predstavená verzia JavaScriptu pre server Netscape Enterprise Server.

Názov JavaScript bol zvolený na marketingové účely, pretože jazyk Sun’s Java bol v tom čase veľmi rozšírený. Jazyk JavaScript bol v skutočnosti založený predovšetkým na jazykoch Scheme a Self s povrchnou sémantikou podobnou jazyku Java.

Mnoho programátorov spočiatku odmietalo JavaScript ako zbytočný pre „skutočnú prácu“, pretože jeho tlmočník bežal rádovo pomalšie ako kompilované jazyky. To sa zmenilo, pretože niekoľko výskumných snáh zameraných na zrýchlenie JavaScriptu začalo prinášať ovocie. Najvýznamnejšie je, že open-source JavaScriptový engine Google Chrome V8, ktorý vykonáva kompiláciu, inlinovanie a dynamickú optimalizáciu kódu, dokáže skutočne prekonať C ++ kód v prípade niektorých načítaní a prekonáva Python vo väčšine prípadov použitia.

Platformu Node.js založenú na JavaScripte predstavil v roku 2009 Ryan Dahl pre systémy Linux a MacOS ako škálovateľnejšiu alternatívu k serveru Apache HTTP. NPM, napísaný Isaacom Schlueterom, bol uvedený na trh v roku 2010. V roku 2011 debutovala natívna verzia Node.js pre Windows.

Joyent mnoho rokov vlastnil, riadil a podporoval vývojové úsilie Node.js. V roku 2015 bol projekt Node.js prevedený na nadáciu Node.js a stal sa riadeným technickým riadiacim výborom nadácie. Node.js bol tiež prijatý ako Linux Foundation Collaborative Project. V roku 2019 sa Node.js Foundation a JS Foundation spojili a vytvorili OpenJS Foundation.

Základná architektúra Node.js

Na vysokej úrovni Node.js kombinuje JavaScriptový engine Google V8, jednovláknovú slučku neblokujúcich udalostí a nízkoúrovňové I / O API. Nižšie uvedený ukážkový kód ilustruje základný vzor servera HTTP pomocou funkcií šípky ES6 (anonymné funkcie Lambda deklarované pomocou operátora šípky fat, =>) pre spätné volania.

Začiatok kódu načíta modul HTTP, nastaví server meno hosťa premenná na localhost (127.0.0.1) a nastaví prístav premenná na 3000. Potom vytvorí server a funkciu spätného volania, v tomto prípade funkciu šípky tuku, ktorá vždy vráti rovnakú odpoveď na každú požiadavku: statusCode 200 (úspech), typ obsahu obyčajný text a textová odpoveď z „Ahoj svet \ n“. Nakoniec povie serveru, aby počúval ďalej localhost port 3000 (cez soket) a definuje spätné volanie na vytlačenie správy s protokolom na konzolu, keď server začne počúvať. Ak tento kód spustíte v termináli alebo konzole pomocou uzol príkazom a potom prejdite na localhost: 3000 pomocou ľubovoľného webového prehliadača na rovnakom počítači, v prehliadači sa zobrazí „Hello World“. Server zastavíte stlačením klávesovej skratky Control-C v okne terminálu.

Upozorňujeme, že každý hovor uskutočnený v tomto príklade je asynchrónny a neblokujúci. Funkcie spätného volania sa vyvolávajú ako reakcia na udalosti. The createServer spätné volanie spracuje udalosť žiadosti klienta a vráti odpoveď. The počúvaj spätné volanie spracováva počúvanie udalosť.

Knižnica Node.js

Ako vidíte na ľavej strane na obrázku nižšie, súbor Node.js má vo svojej knižnici širokú škálu funkcií. Modul HTTP, ktorý sme predtým použili v ukážkovom kóde, obsahuje triedy klientov aj serverov, ako vidíte na pravej strane obrázku. Funkcia servera HTTPS používajúca TLS alebo SSL žije v samostatnom module.

Jeden inherentný problém so slučkou udalostí s jedným vláknom je nedostatok vertikálneho škálovania, pretože vlákno so slučkou udalostí bude používať iba jedno jadro CPU. Medzitým moderné čipy CPU často vystavujú osem a viac jadier a moderné serverové stojany majú často viac čipov CPU. Aplikácia s jedným vláknom nevyužije všetky výhody jadier 24 a viac v robustnom serverovom stojane.

Môžete to opraviť, hoci to vyžaduje nejaké ďalšie programovanie. Na začiatok môže Node.js plodiť podradené procesy a udržiavať rúry medzi rodičom a deťmi, podobne ako v systéme popen (3) volanie funguje pomocou child_process.spawn () a súvisiace metódy.

Klastrový modul je pre vytváranie škálovateľných serverov ešte zaujímavejší ako podradený modul procesu. The cluster.fork () metóda založí pracovné procesy, ktoré zdieľajú porty servera rodiča pomocou child_process.spawn () pod krytmi. Hlavný server klastra distribuuje prichádzajúce spojenia medzi svojich pracovníkov pomocou predvoleného nastavenia algoritmu round-robin, ktorý je citlivý na zaťaženie pracovného procesu.

Upozorňujeme, že Node.js neposkytuje smerovaciu logiku. Ak chcete zachovať stav medzi spojeniami v klastri, budete musieť ponechať svoje objekty relácie a prihlásenia niekde inde ako v pracovnej pamäti RAM.

Ekosystém balíka Node.js

V registri NPM sa nachádza viac ako 1,2 milióna balíkov bezplatného, ​​opakovane použiteľného kódu Node.js, čo z neho robí najväčší softvérový register na svete. Všimnite si, že väčšina NPM balíkov (v zásade priečinky alebo položky registra NPM obsahujúce program opísaný v súbore package.json) obsahujú viac modulov (programy, ktoré načítate pomocou vyžadovať Vyhlásenia). Je ľahké zameniť si tieto dva pojmy, ale v tomto kontexte majú špecifický význam a nemali by sa zamieňať.

NPM môže spravovať balíčky, ktoré sú lokálnymi závislosťami konkrétneho projektu, ako aj globálne nainštalované nástroje JavaScriptu. Keď sa NPM používa ako správca závislostí pre miestny projekt, môže nainštalovať v jednom príkaze všetky závislosti projektu prostredníctvom súboru package.json. Pri použití pre globálne inštalácie vyžaduje NPM často systémové (sudo) oprávnenie.

Vy nie mať použiť príkazový riadok NPM na prístup do verejného registra NPM. Ostatní správcovia balíkov, ako napríklad Facebook's Yarn, ponúkajú alternatívne zážitky na strane klienta. Balíky môžete tiež vyhľadávať a prehliadať pomocou webových stránok NPM.

Prečo by ste chceli používať balík NPM? V mnohých prípadoch je inštalácia balíka pomocou príkazového riadku NPM najrýchlejšia a najpohodlnejšia na získanie najnovšej stabilnej verzie modulu bežiaceho vo vašom prostredí a zvyčajne je menej náročná ako klonovanie zdrojového úložiska a inštalácia inštalácie z úložiska. Ak nechcete najnovšiu verziu, môžete určiť číslo verzie pre NPM, čo je obzvlášť užitočné, keď jeden balík závisí od iného balíka a môže sa rozbiť s novšou verziou závislosti.

Napríklad rámec Express, minimálny a flexibilný rámec webových aplikácií Node.js, poskytuje robustnú sadu funkcií na vytváranie jednostránkových a viacstránkových a hybridných webových aplikácií. Zatiaľ čo ľahko klonovateľné úložisko Expresscode sa nachádza na //github.com/expressjs/express a dokumentácia Express je na //expressjs.com/, rýchly spôsob, ako začať používať Express, je jeho inštalácia do už inicializovaného miestneho pracovného vývoja adresár s npm príkaz, napríklad:

$ npm inštalácia expresného ukladania

The —Uložiť voľba, ktorá je v predvolenom nastavení v NPM 5.0 a novšej, zapnutá, hovorí správcovi balíkov, aby po inštalácii pridal modul Express do zoznamu závislostí v súbore package.json.

Ďalším rýchlym spôsobom, ako začať používať Express, je inštalácia spustiteľného súboru generátorexpres (1) globálne a potom ju použiť na lokálne vytvorenie aplikácie v novom pracovnom priečinku:

$ npm inštalácia -g express-generator @ 4

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

Vďaka tomu môžete pomocou NPM nainštalovať všetky potrebné závislosti a spustiť server na základe obsahu súboru package.json vytvoreného generátorom:

$ npm inštalácia

$ npm štart

Je ťažké vybrať si najdôležitejšie body z viac ako milióna balíkov v NPM, ale vyniká niekoľko kategórií. Express je najstarší a najvýznamnejší príklad rámcov Node.js. Ďalšou veľkou kategóriou v úložisku NPM sú nástroje na vývoj JavaScriptu vrátane prehliadača, balíka modulov; bower, správca balíkov prehliadačov; grunt, bežec úlohy JavaScript; a prehltnite streamovací systém. A nakoniec, dôležitou kategóriou pre podnikových vývojárov Node.js sú databázoví klienti, ktorých je viac ako 8 000, vrátane populárnych modulov, ako sú redis, mongoose, firebase a pg, klient PostgreSQL.

Ak to zhrnieme, Node.js je medziplatformové runtime prostredie JavaScriptu pre servery a aplikácie. Je postavený na jednovláknovej neblokujúcej slučke udalostí, stroji JavaScript prehliadača Google Chrome V8 a nízkoúrovňovom I / O API. Rôzne techniky vrátane klastrového modulu umožňujú aplikáciám Node.js presahovať rámec jediného jadra CPU. Okrem základných funkcií Node.js inšpiroval ekosystém viac ako milióna balíkov, ktoré sú zaregistrované a majú verzie v úložisku NPM a môžu byť inštalované pomocou príkazového riadku NPM alebo alternatívy, ako je napríklad Yarn.

$config[zx-auto] not found$config[zx-overlay] not found