Programiranje

Kaj je Node.js? Razloženo izvajanje JavaScript

Razširljivost, zakasnitev in prepustnost so ključni kazalniki uspešnosti spletnih strežnikov. Vzdrževanje nizke zakasnitve in visoke prepustnosti med povečevanjem in zmanjševanjem ni enostavno. Node.js je izvajalno okolje JavaScript, ki doseže nizko zakasnitev in veliko prepustnost z uporabo "neblokirajočega" pristopa k vročanju zahtev. Z drugimi besedami, Node.js ne izgublja časa ali virov pri čakanju na vrnitev V / I zahtev.

V tradicionalnem pristopu k ustvarjanju spletnih strežnikov za vsako dohodno zahtevo ali povezavo strežnik drsti novo nit izvedbe ali celo vilice novo proces za obravnavo zahteve in pošiljanje odgovora. Konceptualno je to povsem smiselno, v praksi pa ima veliko stroškov.

Med drstenjem niti ima manj pomnilnika in porabe CPU kot forking procesov, je lahko še vedno neučinkovit. Prisotnost velikega števila niti lahko povzroči, da močno obremenjen sistem porabi dragocene cikle za razporejanje niti in preklapljanje konteksta, kar dodaja zakasnitev in omejuje razširljivost in prepustnost.

Node.js ima drugačen pristop. Izvaja enonitno zanko dogodka, registrirano v sistemu za obdelavo povezav, in vsaka nova povezava povzroči JavaScript funkcija povratnega klica streljati. Funkcija povratnega klica lahko obravnava zahteve z neblokirajočimi V / I klici in po potrebi lahko ustvari niti iz področja za izvajanje blokadnih ali CPU-intenzivnih operacij in za uravnoteženje obremenitve med jedri CPU. Nodejev pristop k skaliranju s funkcijami povratnega klica zahteva manj pomnilnika za obdelavo več povezav kot večina konkurenčnih arhitektur, ki se spreminjajo z nitmi, vključno s strežnikom Apache HTTP, različnimi strežniki aplikacij Java, IIS in ASP.NET ter Ruby on Rails.

Node.js se poleg strežnikov izkaže za zelo uporabnega za namizne aplikacije. Upoštevajte tudi, da aplikacije Node niso omejene na zgolj JavaScript. Uporabite lahko kateri koli jezik, ki se prevede v JavaScript, na primer TypeScript in CoffeeScript. Node.js vključuje mehanizem JavaScript Google Chrome V8 JavaScript, ki podpira sintakso ECMAScript 2015 (ES6), ne da bi potrebovali transpilator ES6 v ES5, kot je Babel.

Velik del uporabniškega pripomočka Node prihaja iz velike knjižnice paketov, ki je dostopna iz npm ukaz. NPM, upravitelj paketov Node, je del standardne namestitve Node.js, čeprav ima svojo spletno stran.

Nekaj ​​zgodovine JavaScript

Leta 1995 je Brendan Eich, takrat izvajalec del podjetja Netscape, ustvaril jezik JavaScript za zagon v spletnih brskalnikih - kot pravi zgodba v 10 dneh. JavaScript je bil prvotno namenjen omogočanju animacij in drugih manipulacij z objektnim modelom dokumentov brskalnika (DOM). Kmalu zatem je bila predstavljena različica JavaScript za strežnik Netscape Enterprise.

Ime JavaScript je bilo izbrano za tržne namene, saj je bil Sunov jezik Java takrat zelo razširjen. Pravzaprav je jezik JavaScript dejansko temeljil predvsem na jezikih Scheme in Self, s površinsko semantiko, podobno Java.

Sprva so mnogi programerji JavaScript zavrnili kot neuporabnega za "resnično delo", ker je njegov tolmač tekel za red velikosti počasneje kot prevedeni jeziki. To se je spremenilo, ko je več raziskovalnih prizadevanj za pospešitev JavaScript začelo obrodovati sadove. Najbolj vidno je, da lahko odprtokodni JavaScript JavaScript Google Chrome V8, ki izvaja pravočasno prevajanje, vstavljanje in dinamično optimizacijo kode, pri nekaterih obremenitvah dejansko preseže kodo C ++ in v večini primerov preseže Python.

Platformo Node.js na osnovi JavaScript je leta 2009 predstavil Ryan Dahl za Linux in MacOS kot bolj razširljivo alternativo strežniku Apache HTTP. NPM, ki ga je napisal Isaac Schlueter, se je začel leta 2010. Izvorna različica Node.js za Windows je bila predstavljena leta 2011.

Joyent je bil dolga leta v lasti, upravljanju in podpori razvojnim prizadevanjem Node.js. Leta 2015 je bil projekt Node.js predan fundaciji Node.js in ga je začel upravljati tehnični usmerjevalni odbor fundacije. Node.js je bil sprejet tudi kot skupni projekt Linux Foundation. Leta 2019 sta se fundaciji Node.js in JS fundacija združili in ustanovili fundacijo OpenJS.

Osnovna arhitektura Node.js

Na visoki ravni Node.js združuje mehanizem Google V8 JavaScript, enonitno neblokirajočo zanko dogodkov in vhodno / izhodni API na nizki ravni. Spodnja prikazana primerna koda prikazuje osnovni vzorec strežnika HTTP z uporabo puščic ES6 (anonimne Lambda funkcije, deklarirane z operaterjem puščice maščobe, =>) za povratne klice.

Začetek kode naloži modul HTTP in nastavi strežnik ime gostitelja spremenljivka na lokalni gostitelj (127.0.0.1) in nastavi pristanišče spremenljivka na 3000. Nato ustvari strežnik in funkcijo povratnega klica, v tem primeru maščobno puščico, ki vedno vrne enak odgovor na katero koli zahtevo: statusCode 200 (uspeh), navadno besedilo vrste vsebine in besedilni odziv "Pozdravljeni, svet \ n". Na koncu strežniku pove, naj posluša naprej lokalni gostitelj vrata 3000 (prek vtičnice) in definira povratni klic za tiskanje dnevnika na konzoli, ko strežnik začne poslušati. Če zaženete to kodo v terminalu ali konzoli z uporabo vozlišče in nato poiščite localhost: 3000 s katerim koli spletnim brskalnikom na istem računalniku, v brskalniku boste videli "Hello World". Če želite zaustaviti strežnik, v oknu terminala pritisnite Control-C.

Upoštevajte, da je vsak klic v tem primeru asinhron in neblokira. Funkcije povratnega klica se pokličejo kot odziv na dogodke. The createServer povratni klic obravnava dogodek zahteve odjemalca in vrne odgovor. The poslušaj povratni klic obravnava poslušanje dogodek.

Knjižnica Node.js

Kot lahko vidite na levi strani spodnjo sliko, ima Node.js v svoji knjižnici veliko funkcij. Modul HTTP, ki smo ga prej uporabili v vzorčni kodi, vsebuje razrede odjemalca in strežnika, kot lahko vidite na desni strani slike. Funkcija strežnika HTTPS, ki uporablja TLS ali SSL, živi v ločenem modulu.

Ena značilna težava enonitne zanke dogodkov je pomanjkanje vertikalnega skaliranja, saj bo nit zanke dogodkov uporabljala samo eno jedro CPU. Medtem sodobni CPU čipi pogosto razkrijejo osem ali več jeder, sodobni strežniški regali pa imajo pogosto več CPU čipov. Enonitna aplikacija ne bo v celoti izkoristila 24-plus jeder v robustnem strežniku.

To lahko popravite, čeprav je potrebno nekaj dodatnega programiranja. Za začetek lahko Node.js ustvari podrejene procese in vzdržuje cevi med staršem in otroki, podobno kot sistem popen (3) klic deluje, z uporabo otrok_proces.spawn () in s tem povezane metode.

Modul gruče je za ustvarjanje razširljivih strežnikov še bolj zanimiv kot podrejeni procesni modul. The cluster.fork () metoda ustvarja delovne procese, ki si delijo vrata strežnika nadrejenega, z uporabo otrok_proces.spawn () pod platnicami. Glavni grozd razdeli dohodne povezave med svoje delavce z uporabo privzeto algoritma z okroglim robinom, ki je občutljiv na obremenitve delovnega procesa.

Upoštevajte, da Node.js ne zagotavlja logike usmerjanja. Če želite ohraniti stanje med povezavami v gruči, boste morali hraniti predmete seje in prijave drugje kot delovni RAM.

Ekosistem paketa Node.js

V registru NPM je več kot 1,2 milijona paketov brezplačne kode Node.js za večkratno uporabo, zaradi česar je največji register programske opreme na svetu. Upoštevajte, da večina NPM paketov (v bistvu mape ali elementi registra NPM, ki vsebujejo program, opisan v datoteki package.json), vsebujejo več moduli (programi, ki jih naložite zahtevajo izjave). Zlahka je zamenjati oba izraza, vendar imata v tem kontekstu poseben pomen in ju ne bi smeli zamenjati.

NPM lahko upravlja pakete, ki so lokalne odvisnosti določenega projekta, pa tudi globalno nameščena orodja JavaScript. Ko se NPM uporablja kot upravitelj odvisnosti za lokalni projekt, lahko z enim ukazom preko datoteke package.json namesti vse odvisnosti projekta. Ko se NPM uporablja za globalne namestitve, pogosto zahteva sistemske (sudo) privilegije.

Saj ne imeti za uporabo ukazne vrstice NPM za dostop do javnega registra NPM. Drugi upravitelji paketov, kot je Facebookova preja, ponujajo alternativne izkušnje na strani stranke. Pakete lahko iščete in brskate tudi po spletnem mestu NPM.

Zakaj bi želeli uporabiti NPM paket? V mnogih primerih je namestitev paketa prek ukazne vrstice NPM najhitrejša in najprimernejša za pridobitev najnovejše stabilne različice modula, ki se izvaja v vašem okolju, in je običajno manj dela kot kloniranje izvornega repozitorija in gradnja namestitve iz repozitorija. Če ne želite najnovejše različice, lahko NPM določite številko različice, kar je še posebej koristno, če je en paket odvisen od drugega paketa in lahko prekine z novejšo različico odvisnosti.

Na primer, ogrodje Express, minimalno in prilagodljivo ogrodje spletnih aplikacij Node.js, ponuja obsežen nabor funkcij za izdelavo enojnih in večstranskih ter hibridnih spletnih aplikacij. Medtem ko je enostavno klonirano repozitorij Expresscode na naslovu //github.com/expressjs/express, dokumentacija Express pa na //expressjs.com/, je hiter način za začetek uporabe Express-a namestitev v že inicializiran lokalni delovni razvoj imenik z npm ukaz, na primer:

$ npm install express —save

The - shrani Možnost, ki je pri NPM 5.0 in novejših privzeto dejansko vklopljena, pove upravitelju paketov, naj po namestitvi doda modul Express na seznam odvisnosti v datoteki package.json.

Še en hiter način za začetek uporabe Expressa je namestitev izvedljive datoteke generatorekspresno (1) globalno in ga nato uporabite za lokalno ustvarjanje aplikacije v novi delovni mapi:

$ npm install -g express-generator @ 4

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

Po tem lahko z NPM namestite vse potrebne odvisnosti in zaženete strežnik na podlagi vsebine datoteke package.json, ki jo je ustvaril generator:

$ npm namestitev

$ npm start

Med milijoni paketov v NPM je težko izbrati vrhunce, a nekaj kategorij izstopa. Express je najstarejši in najvidnejši primer ogrodja Node.js. Druga velika kategorija v repozitoriju NPM so pripomočki za razvoj JavaScript, vključno z brskalnikom, modulom; bower, upravitelj paketov brskalnika; grunt, tekač opravil JavaScript; in gutljaj, sistem za pretakanje. Končno, pomembna kategorija za razvijalce podjetja Node.js so odjemalci baz podatkov, ki jih je več kot 8000, vključno s priljubljenimi moduli, kot so redis, mongoose, firebase in pg, odjemalec PostgreSQL.

Če povzamemo, Node.js je med platformo izvajalno okolje JavaScript za strežnike in aplikacije. Zgrajena je na enojni, neblokirajoči zanki dogodkov, mehanizmu JavaScript Google Chrome V8 in API-ju V / I na nizki ravni. Različne tehnike, vključno z modulom grozda, omogočajo aplikacijam Node.js, da se razširijo nad eno jedro CPU. Poleg svoje osnovne funkcionalnosti je Node.js navdihnil ekosistem z več kot milijonom paketov, ki so registrirani in opremljeni z različicami v skladišču NPM in jih je mogoče namestiti z ukazno vrstico NPM ali alternativo, kot je Yarn.

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