Programmēšana

Kas ir Node.js? Paskaidrots JavaScript izpildlaiks

Mērogojamība, latentums un caurlaidspēja ir galvenie tīmekļa serveru veiktspējas rādītāji. Turēt zemu latentumu un lielu caurlaidspēju, vienlaikus palielinot un samazinot, nav viegli. Node.js ir JavaScript izpildlaika vide, kas nodrošina zemu latentumu un lielu caurlaidspēju, izmantojot “nebloķējošu” pieeju pieprasījumu apkalpošanai. Citiem vārdiem sakot, Node.js netērē laiku un resursus, gaidot I / O pieprasījumus atgriezties.

Tradicionālajā pieejā tīmekļa serveru izveidošanai katram ienākošajam pieprasījumam vai savienojumam serveris nārsto jauns izpildes pavediens vai pat dakšas jauns process apstrādāt pieprasījumu un nosūtīt atbildi. Konceptuāli tam ir pilnīga jēga, taču praksē tas rada daudz pieskaitāmo izmaksu.

Nārstojot diegi rada mazāk atmiņas un centrālā procesora papildu izmaksas nekā dakša procesi, tas joprojām var būt neefektīvs. Liela skaita pavedienu klātbūtne var izraisīt ļoti noslogotas sistēmas dārgu ciklu iztērēšanu pavedienu plānošanā un konteksta maiņā, kas palielina latentumu un uzliek ierobežojumus mērogojamībai un caurlaidspējai.

Node.js izmanto citu pieeju. Tas darbojas ar vienu vītni notikumu cilpa, kas reģistrēta sistēmā, lai apstrādātu savienojumus, un katrs jauns savienojums izraisa JavaScript atzvanīšanas funkcija šaut. Atzvana funkcija var apstrādāt pieprasījumus ar nebloķējošiem I / O zvaniem un, ja nepieciešams, var radīt pavedienus no pūļa, lai veiktu bloķēšanas vai intensīvas procesora darbības un lai līdzsvarotu CPU kodolus. Mezgla pieejai mērogošanai ar atzvanīšanas funkcijām ir nepieciešama mazāka atmiņa, lai apstrādātu vairāk savienojumu nekā lielākajai daļai konkurētspējīgu arhitektūru, kas mērogojas ar pavedieniem, tostarp Apache HTTP Server, dažādajiem Java lietojumprogrammu serveriem, IIS un ASP.NET un Ruby on Rails.

Node.js izrādās diezgan noderīgs darbvirsmas lietojumprogrammām papildus serveriem. Ņemiet vērā arī to, ka Node lietojumprogrammas neaprobežojas tikai ar JavaScript. Varat izmantot jebkuru valodu, kas tiek pārnesta uz JavaScript, piemēram, TypeScript un CoffeeScript. Node.js ietver Google Chrome V8 JavaScript motoru, kas atbalsta ECMAScript 2015 (ES6) sintaksi, bez nepieciešamības izmantot ES6 – ES5 transpileru, piemēram, Babel.

Liela daļa Node utilītu nāk no tās lielās pakotņu bibliotēkas, kurai var piekļūt no npm komandu. NPM, Node pakotņu pārvaldnieks, ir daļa no standarta Node.js instalācijas, lai gan tai ir sava vietne.

Daži JavaScript vēsture

1995. gadā Brendans Eihs, kurš pēc tam bija Netscape darbuzņēmējs, izveidoja JavaScript valodu, lai tā darbotos tīmekļa pārlūkprogrammās - pēc stāsta 10 dienu laikā. Sākotnēji JavaScript bija paredzēts, lai iespējotu animācijas un citas manipulācijas ar pārlūka dokumenta objekta modeli (DOM). Drīz pēc tam tika ieviesta Netscape Enterprise Server JavaScript versija.

Vārds JavaScript tika izvēlēts mārketinga nolūkos, jo tajā laikā Sun Java valoda tika plaši izspēlēta. Faktiski JavaScript valoda faktiski balstījās galvenokārt uz shēmu un pašvalodām ar virspusēju Java līdzīgu semantiku.

Sākotnēji daudzi programmētāji noraidīja JavaScript kā bezjēdzīgu “reālam darbam”, jo tā tulks veica lieluma pakāpi lēnāk nekā sastādītās valodas. Tas mainījās, kad vairāki pētniecības centieni, kuru mērķis bija padarīt JavaScript ātrāku, sāka nest augļus. Vissvarīgākais ir tas, ka atvērtā koda Google Chrome V8 JavaScript dzinējs, kas tieši savlaicīgi kompilē, iekļauj un dinamiski optimizē kodu, dažām slodzēm faktiski var pārspēt C ++ kodu un lielākajā daļā lietošanas gadījumu pārspēj Python.

2009. gadā Ryan Dahl uz Linux balstītu platformu Node.js Linux un MacOS ieviesa kā vairāk pielāgojamu Apache HTTP servera alternatīvu. NPM, kuru autors ir Īzaks Šlueter, tika palaists 2010. gadā. Vietējā Node.js Windows versija debitēja 2011. gadā.

Joyent daudzus gadus piederēja, pārvaldīja un atbalstīja Node.js izstrādes centienus. 2015. gadā projekts Node.js tika nodots Node.js fondam, un to pārvalda fonda tehniskā vadības komiteja. Node.js tika iekļauts arī kā Linux Foundation sadarbības projekts. 2019. gadā fonds Node.js un JS fonds apvienojās, izveidojot OpenJS fondu.

Node.js pamata arhitektūra

Augstā līmenī Node.js apvieno Google V8 JavaScript dzinēju, viena pavediena nebloķējošu notikumu loku un zema līmeņa I / O API. Zemāk parādītais noņemtais koda paraugs parāda HTTP servera pamata modeli, izmantojot ES6 bultiņu funkcijas (anonīmas Lambda funkcijas, kas deklarētas, izmantojot tauku bultiņas operatoru, =>) par atzvanīšanu.

Koda sākums ielādē HTTP moduli, iestata serveri resursdatora nosaukums mainīgais uz vietējais saimnieks (127.0.0.1), un iestata osta mainīgais līdz 3000. Tad tas izveido serveri un atzvanīšanas funkciju, šajā gadījumā tauku bultiņas funkciju, kas vienmēr atgriež to pašu atbildi uz jebkuru pieprasījumu: statusCode 200 (panākumi), satura veids vienkāršs teksts un teksta atbilde “Sveika pasaule \ n”. Visbeidzot, tas liek serverim klausīties vietējais saimnieks ports 3000 (izmantojot kontaktligzdu) un nosaka atzvanīšanu, lai drukātu žurnāla ziņojumu konsolē, kad serveris ir sācis klausīties. Ja palaižat šo kodu terminālā vai konsolē, izmantojot mezgls komandu un pēc tam pārlūkojiet vietni localhost: 3000, izmantojot jebkuru tīmekļa pārlūkprogrammu tajā pašā mašīnā, pārlūkprogrammā redzēsiet “Hello World”. Lai apturētu serveri, termināļa logā nospiediet Control-C.

Ņemiet vērā, ka visi šajā piemērā veiktie zvani ir asinhroni un nebloķējoši. Atzvana funkcijas tiek izmantotas, reaģējot uz notikumiem. The createServer atzvanīšana apstrādā klienta pieprasījuma notikumu un atgriež atbildi. The klausīties atzvanīšana apstrādā klausoties notikumu.

Node.js bibliotēka

Kā redzams kreisajā pusē redzamajā attēlā, Node.js bibliotēkā ir daudz funkciju. HTTP modulis, kuru mēs iepriekš izmantojām parauga kodā, satur gan klienta, gan servera klases, kā redzat attēla labajā pusē. HTTPS servera funkcionalitāte, izmantojot TLS vai SSL, dzīvo atsevišķā modulī.

Viena raksturīga viena pavediena notikumu cilpas problēma ir vertikālas mērogošanas trūkums, jo notikuma cilpas pavedienā tiks izmantots tikai viens CPU kodols. Tikmēr mūsdienu CPU mikroshēmas bieži vien pakļauj astoņus vai vairāk kodolus, un mūsdienu serveru plauktiem bieži ir vairākas CPU mikroshēmas. Viena pavediena lietojumprogramma pilnībā neizmantos 24 plus kodolu priekšrocības stabilajā serveru plauktiņā.

To var novērst, lai gan tas prasa papildu programmēšanu. Pirmkārt, Node.js var radīt bērnu procesus un uzturēt caurules starp vecākiem un bērniem līdzīgi kā sistēmā popen (3) zvanu darbi, izmantojot child_process.spawn () un ar to saistītās metodes.

Klastera modulis ir vēl interesantāks par pakārtotā procesa moduli mērogojamu serveru izveidošanai. The cluster.fork () metode rada strādnieku procesus, kuriem ir kopīgi vecāku serveru porti, izmantojot child_process.spawn () zem vākiem. Klastera meistars izplata ienākošos savienojumus starp saviem darbiniekiem, pēc noklusējuma izmantojot apļa algoritmu, kas ir jutīgs pret darba ņēmēja procesa slodzēm.

Ņemiet vērā, ka Node.js nenodrošina maršrutēšanas loģiku. Ja vēlaties saglabāt stāvokli starp kopas savienojumiem, sesijas un pieteikšanās objekti ir jāglabā citur, nevis darbinieka RAM.

Node.js paketes ekosistēma

NPM reģistrā mitinās vairāk nekā 1,2 miljoni bezmaksas, atkārtoti izmantojama Node.js koda paku, kas padara to par lielāko programmatūras reģistru pasaulē. Ņemiet vērā, ka lielākā daļa NPM iepakojumiem (būtībā mapēs vai NPM reģistra elementos, kas satur programmu, kuru apraksta fails package.json), ir vairāki moduļi (programmas, kuras jūs ielādējat pieprasīt paziņojumi). Abus terminus ir viegli sajaukt, taču šajā kontekstā tiem ir īpaša nozīme, un tos nevajadzētu aizstāt.

NPM var pārvaldīt paketes, kas ir konkrēta projekta lokālas atkarības, kā arī globāli instalētus JavaScript rīkus. Ja to izmanto kā atkarības pārvaldnieku vietējam projektam, NPM vienā komandā var instalēt visas projekta atkarības, izmantojot failu package.json. Ja to izmanto globālām instalācijām, NPM bieži ir nepieciešamas sistēmas (sudo) privilēģijas.

Jums nav ir izmantot NPM komandrindu, lai piekļūtu publiskajam NPM reģistram. Citi pakotņu pārvaldnieki, piemēram, Facebook dzija, piedāvā alternatīvu klienta puses pieredzi. Varat arī meklēt un pārlūkot paketes, izmantojot NPM vietni.

Kāpēc jūs vēlaties izmantot NPM paketi? Daudzos gadījumos pakotnes instalēšana, izmantojot komandrindu NPM, ir ātrākais un ērtākais, lai iegūtu vidējā moduļa stabilāko versiju, un parasti tas ir mazāk darba nekā avota repozitorija klonēšana un instalācijas izveidošana no repozitorija. Ja nevēlaties jaunāko versiju, NPM varat norādīt versijas numuru, kas ir īpaši noderīgi, ja viena pakete ir atkarīga no citas paketes un var atšķirties no jaunākas atkarības versijas.

Piemēram, Express framework - minimāls un elastīgs tīmekļa lietojumprogrammu Node.js ietvars - nodrošina stabilu funkciju kopumu vienas, vairāku lapu un hibrīdu tīmekļa lietojumprogrammu veidošanai. Kaut arī viegli klonējamā Expresscode krātuve atrodas vietnē //github.com/expressjs/express un Express dokumentācija ir vietnē //expressjs.com/, ātrs veids, kā sākt lietot Express, ir instalēt to jau inicializētā vietējā darba izstrādē. direktoriju ar npm komandu, piemēram:

$ npm instalējiet ātro - saglabājiet

The - saglabājiet opcija, kas faktiski pēc noklusējuma ir ieslēgta NPM 5.0 un jaunākās versijās, liek pakotņu pārvaldniekam pēc instalēšanas pievienot Express moduli pakotnes add.json atkarību sarakstam.

Vēl viens ātrs veids, kā sākt lietot Express, ir instalēt izpildāmo failu ģeneratorsizteikt (1) globāli un pēc tam izmantojiet to, lai lokāli izveidotu lietojumprogrammu jaunā darba mapē:

$ npm instalējiet -g express-generator @ 4

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

Kad tas ir paveikts, varat izmantot NPM, lai instalētu visas nepieciešamās atkarības un palaistu serveri, pamatojoties uz ģeneratora izveidotā faila package.json saturu:

$ npm instalēt

Sākums: $ npm

No miljoniem plus paketēm NPM ir grūti izvēlēties izceltos elementus, taču izceļas dažas kategorijas. Express ir vecākais un pamanāmākais Node.js ietvaru piemērs. Vēl viena liela kategorija NPM krātuvē ir JavaScript izstrādes utilītas, ieskaitot browserify, moduļu paketi; bower, pārlūka pakotņu pārvaldnieks; grunt, JavaScript uzdevumu skrējējs; un norīt straumēšanas veidošanas sistēmu. Visbeidzot, svarīga uzņēmuma Node.js izstrādātāju kategorija ir datu bāzes klienti, kuru ir vairāk nekā 8000, ieskaitot tādus populārus moduļus kā redis, mongoose, firebase un pg, PostgreSQL klients.

Apkopojot, Node.js ir starpplatformu JavaScript izpildlaika vide serveriem un lietojumprogrammām. Tas ir veidots uz viena pavediena, nebloķējoša notikumu cikla, Google Chrome V8 JavaScript dzinēja un zema līmeņa I / O API. Dažādas metodes, tostarp klastera modulis, ļauj Node.js lietotnēm mērogot ārpus viena CPU kodola. Papildus galvenajai funkcionalitātei, Node.js ir iedvesmojis vairāk nekā miljona paku ekosistēmu, kas ir reģistrētas un versijas NPM krātuvē un kuras var instalēt, izmantojot NPM komandrindu vai alternatīvu, piemēram, Dzija.

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