Programavimas

Kas yra Node.js? Paaiškintas „JavaScript“ vykdymo laikas

Mastelis, vėlavimas ir pralaidumas yra pagrindiniai žiniatinklio serverių našumo rodikliai. Laikyti mažą delsą ir didelę pralaidumą didinant ir mažinant nėra lengva. „Node.js“ yra „JavaScript“ vykdymo laiko aplinka, pasiekianti mažą delsą ir didelę pralaidumą laikydamasi „neužblokuojančio“ požiūrio į užklausų teikimą. Kitaip tariant, „Node.js“ eikvoja ne laiką ir išteklius laukdamas I / O užklausų grąžinimo.

Tradiciniu požiūriu kuriant žiniatinklio serverius kiekvienam gaunamam prašymui ar prisijungimui serveris neršia naujas vykdymo gija ar net šakės naujas procesą tvarkyti užklausą ir išsiųsti atsakymą. Konceptualiai tai yra visiškai prasminga, tačiau praktiškai tai patiria daug pridėtinių išlaidų.

Neršto metu siūlai užima mažiau atminties ir procesoriaus pridėtinių išlaidų nei šakės procesus, jis vis tiek gali būti neefektyvus. Esant dideliam gijų skaičiui, gali būti, kad labai apkrauta sistema išleidžia brangius ciklus planuodama gijas ir keisdama kontekstą, o tai padidina vėlavimą ir nustato mastelio bei pralaidumo ribas.

„Node.js“ laikosi kitokio požiūrio. Jis vykdo vienos gijos įvykių kilpą, užregistruotą sistemoje, kad tvarkytų ryšius, o kiekvienas naujas ryšys sukelia „JavaScript“ atgalinio skambinimo funkcija šaudyti. Atgalinio skambučio funkcija gali tvarkyti užklausas su neužblokuojančiais įvesties / išvesties skambučiais ir prireikus gali sudaryti gijas iš baseino, kad būtų galima atlikti blokavimo ar intensyvaus procesoriaus operacijas ir apkrovos balansą visose procesoriaus šerdyse. „Node“ požiūriui į mastelio keitimą naudojant atgalinio ryšio funkcijas reikia mažiau atminties, kad būtų galima apdoroti daugiau ryšių, nei daugumoje konkuruojančių architektūrų, kurios keičiamos gijomis, įskaitant „Apache HTTP Server“, įvairius „Java“ programų serverius, IIS ir ASP.NET bei „Ruby on Rails“.

Pasirodo, kad „Node.js“ be serverių yra gana naudinga darbalaukio programoms. Taip pat atkreipkite dėmesį, kad „Node“ programos neapsiriboja vien „JavaScript“. Galite naudoti bet kurią kalbą, kuri perkeliama į „JavaScript“, pavyzdžiui, „TypeScript“ ir „CoffeeScript“. „Node.js“ apima „Google Chrome V8 JavaScript“ variklį, kuris palaiko „ECMAScript 2015“ (ES6) sintaksę, nereikalaujant ES6 – ES5 transpilerio, pvz., „Babel“.

Didžiąją „Node“ naudingumo dalį teikia jos didelė paketinė biblioteka, prieiga prie kurios npm komandą. „NPM“, „Node“ paketų tvarkyklė, yra standartinio „Node.js“ diegimo dalis, nors ir turi savo svetainę.

Šiek tiek „JavaScript“ istorijos

1995 m. Brendanas Eichas, tuometinis „Netscape“ rangovas, sukūrė „JavaScript“ kalbą, kad ji veiktų žiniatinklio naršyklėse - kaip pasakojama, per 10 dienų. Iš pradžių „JavaScript“ buvo skirtas įgalinti animacijas ir kitas manipuliacijas naršyklės dokumento objekto modeliu (DOM). Netrukus po to buvo pristatyta „Netscape Enterprise Server“ „JavaScript“ versija.

Pavadinimas „JavaScript“ buvo pasirinktas rinkodaros tikslais, nes „Sun“ Java kalba tuo metu buvo plačiai paplitusi. Tiesą sakant, „JavaScript“ kalba pirmiausia buvo paremta „Scheme“ ir „Self“ kalbomis su paviršutiniška „Java“ tipo semantika.

Iš pradžių daugelis programuotojų atmetė „JavaScript“ kaip nenaudingą „tikram darbui“, nes jo vertėjas vykdė didesnę eilę lėčiau nei kompiliuotos kalbos. Tai pasikeitė, kai kelios mokslinių tyrimų pastangos, skirtos „JavaScript“ pagreitinti, pradėjo duoti vaisių. Ryškiausiai atvirojo kodo „Google Chrome V8“ „JavaScript“ variklis, kuris kompiliuoja, įterpia ir dinamiškai optimizuoja kodą, iš tikrųjų kai kurioms apkrovoms gali pranokti C ++ kodą, o daugeliu atvejų - „Python“.

„Java“ platformą „Node.js“ 2009 m. Pristatė Ryanas Dahlas, skirtas „Linux“ ir „MacOS“, kaip labiau keičiamą „Apache“ HTTP serverio alternatyvą. „NPM“, parašytas Isaaco Schlueterio, paleistas 2010 m. „Node.js“ gimtoji „Windows“ versija debiutavo 2011 m.

„Joyent“ daugelį metų valdė, valdė ir palaikė „Node.js“ kūrimo pastangas. 2015 m. „Node.js“ projektas buvo perduotas „Node.js“ fondui ir jį valdė fondo techninis valdymo komitetas. „Node.js“ taip pat buvo įtrauktas kaip „Linux Foundation“ bendradarbiavimo projektas. 2019 m. „Node.js“ fondas ir „JS Foundation“ susijungė ir sudarė „OpenJS“ fondą.

Pagrindinė „Node.js“ architektūra

Aukštu lygiu „Node.js“ sujungia „Google V8 JavaScript“ variklį, vienos gijos neužblokuojančių įvykių ciklą ir žemo lygio įvesties / išvesties API. Žemiau pateiktas nuimtas pavyzdinis kodas iliustruoja pagrindinį HTTP serverio modelį, naudojant ES6 rodyklių funkcijas (anoniminės „Lambda“ funkcijos, deklaruojamos naudojant riebalų rodyklės operatorių, =>) skambučiams.

Kodo pradžia įkelia HTTP modulį, nustato serverį pagrindinio kompiuterio vardas kintamasis vietinis šeimininkas (127.0.0.1) ir nustato uostas kintamasis yra 3000. Tada sukuriama serverio ir atgalinio ryšio funkcija, šiuo atveju riebalų rodyklės funkcija, kuri visada pateikia tą patį atsakymą į bet kurią užklausą: statusCode 200 (sėkmė), turinio tipo paprastas tekstas ir teksto atsakymas „Sveikas pasaulis \ n“. Galiausiai jis liepia serveriui klausytis vietinis šeimininkas 3000 prievadą (per lizdą) ir nustato atgalinį skambutį, kad atspausdintų žurnalo pranešimą konsolėje, kai serveris pradės klausytis. Jei paleidžiate šį kodą terminale ar konsolėje naudodami mazgas komandą ir tada naršykite iki localhost: 3000 naudodami bet kurią to paties kompiuterio žiniatinklio naršyklę, savo naršyklėje pamatysite „Hello World“. Norėdami sustabdyti serverį, terminalo lange paspauskite „Control-C“.

Atminkite, kad kiekvienas šiame pavyzdyje atliktas skambutis yra asinchroninis ir neužblokuojamas. Skambinimo funkcijos yra iškviečiamos kaip atsakas į įvykius. createServer callback tvarko kliento užklausos įvykį ir pateikia atsakymą. klausyk atgalinis skambutis tvarko klausantis įvykis.

„Node.js“ biblioteka

Kaip matote kairėje pusėje pateiktame paveikslėlyje, „Node.js“ bibliotekoje yra daug funkcijų. HTTP modulis, kurį anksčiau naudojome pavyzdiniame kode, apima kliento ir serverio klases, kaip matote dešinėje paveikslo pusėje. HTTPS serverio funkcionalumas, naudojant TLS arba SSL, veikia atskirame modulyje.

Viena būdinga vieno sriegio įvykių ciklo problema yra vertikalaus mastelio trūkumas, nes įvykio ciklo gijoje bus naudojamas tik vienas procesoriaus branduolys. Tuo tarpu šiuolaikiniai procesoriaus lustai dažnai atskleidžia aštuonias ar daugiau branduolių, o šiuolaikiniai serverių stelažai dažnai turi keletą procesoriaus lustų. Vienos gijos programa neišnaudos visų 24 pliusų branduolių, esančių tvirto serverio stende.

Galite tai ištaisyti, nors tam reikia papildomo programavimo. Pirmiausia, „Node.js“ gali sukelti vaiko procesus ir palaikyti vamzdžius tarp tėvų ir vaikų, panašiai kaip ir sistemoje popen (3) skambučio darbai, naudojant child_process.spawn () ir susijusius metodus.

Klasterio modulis yra dar įdomesnis nei antrinio proceso modulis, skirtas kurti keičiamo dydžio serverius. cluster.fork () metodas sukuria darbuotojų procesus, kurie naudojasi tėvų serverio prievadais, naudojant child_process.spawn () po viršeliais. Klasterio meistras paskirsto gaunamus ryšius tarp savo darbuotojų pagal numatytuosius nustatymus algoritmą, kuris yra jautrus darbuotojo proceso apkrovoms.

Atminkite, kad „Node.js“ neteikia maršruto logikos. Jei norite palaikyti būseną visose jungčių grupėse, sesijos ir prisijungimo objektus turėsite laikyti kitur, išskyrus darbuotojo RAM.

„Node.js“ paketo ekosistema

NPM registre yra daugiau nei 1,2 milijono nemokamo, daugkartinio naudojimo „Node.js“ kodo paketų, todėl jis yra didžiausias programinės įrangos registras pasaulyje. Atkreipkite dėmesį, kad dauguma NPM pakuotės (iš esmės aplankuose arba NPM registro elementuose, kuriuose yra programa, aprašyta failo package.json), yra keli moduliai (programos, kurias įkeliate reikalauti teiginiai). Lengva supainioti abu terminus, tačiau šiame kontekste jie turi konkrečią reikšmę ir neturėtų būti keičiami.

NPM gali valdyti paketus, kurie yra vietinės konkretaus projekto priklausomybės, taip pat visame pasaulyje įdiegtus „JavaScript“ įrankius. Naudodamas kaip vietinio projekto priklausomybės tvarkytuvę, NPM vienoje komandoje gali įdiegti visas projekto priklausomybes per failą „package.json“. Naudojant visuotiniams diegimams, NPM dažnai reikalauja sistemos (sudo) privilegijų.

Jūs neturite turėti naudoti NPM komandų eilutę, kad pasiektumėte viešąjį NPM registrą. Kiti paketų valdytojai, pvz., „Facebook“ siūlai, siūlo alternatyvias kliento puses. Taip pat galite ieškoti ir naršyti paketus naudodami NPM svetainę.

Kodėl norėtumėte naudoti NPM paketą? Daugeliu atvejų paketo diegimas per NPM komandų eilutę yra greičiausias ir patogiausias būdas gauti naujausią stabilią modulio versiją, veikiančią jūsų aplinkoje, ir paprastai tai yra mažiau darbo nei klonuoti šaltinio saugyklą ir įdiegti diegimą iš saugyklos. Jei nenorite naujausios versijos, galite nurodyti NPM versijos numerį, kuris yra ypač naudingas, kai vienas paketas priklauso nuo kito paketo ir gali sulaužyti naujesnę priklausomybės versiją.

Pavyzdžiui, „Express Framework“ - minimali ir lanksti „Node.js“ žiniatinklio programų sistema - suteikia patikimą funkcijų rinkinį, skirtą kurti vieno ir kelių puslapių bei hibridines žiniatinklio programas. Nors lengvai klonuojama „Expresscode“ saugykla yra //github.com/expressjs/express, o „Express“ dokumentai yra //expressjs.com/, greitas būdas pradėti naudoti „Express“ yra įdiegti ją į jau inicijuotą vietos darbo programą katalogą su npm komanda, pavyzdžiui:

$ npm įdiegti greitąjį - išsaugoti

-sutaupyti parinktis, kuri iš tikrųjų yra įjungta pagal numatytuosius nustatymus NPM 5.0 ir naujesnėse versijose, liepia paketų tvarkytuvei po įdiegimo pridėti „Express“ modulį į failo „package.json“ priklausomybių sąrašą.

Kitas greitas būdas pradėti naudoti „Express“ yra įdiegti vykdomąjį failą generatoriusekspresas (1) visame pasaulyje ir tada naudokite jį, kad sukurtumėte programą vietoje naujame darbiniame aplanke:

$ npm įdiegti -g express-generator @ 4

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

Tai atlikę, naudodami NPM galite įdiegti visas būtinas priklausomybes ir paleisti serverį, atsižvelgdami į generatoriaus sukurtą failą „package.json“:

$ npm įdiegti

$ npm pradžia

Iš milijono plius paketų NPM sunku išskirti svarbiausius dalykus, tačiau išsiskiria kelios kategorijos. „Express“ yra seniausias ir ryškiausias „Node.js“ sistemų pavyzdys. Kita didelė NPM saugyklos kategorija yra „JavaScript“ kūrimo priemonės, įskaitant „browserify“, modulių paketą; bower, naršyklės paketų tvarkyklė; murkti, „JavaScript“ užduočių bėgikas; ir gurkšnokite srautinio formavimo sistemą. Galiausiai, svarbi įmonės „Node.js“ kūrėjų kategorija yra duomenų bazių klientai, kurių yra daugiau nei 8000, įskaitant populiarius modulius, tokius kaip „redis“, „mongoose“, „firebase“ ir „pg“, „PostgreSQL“ klientas.

Apibendrinant galima pasakyti, kad „Node.js“ yra daugialypė „JavaScript“ vykdymo trukmės aplinka, skirta serveriams ir programoms. Jis sukurtas naudojant vienos gijos, neužblokuojantį įvykių ciklą, „Google Chrome“ V8 „JavaScript“ variklį ir žemo lygio įvesties / išvesties API. Įvairūs metodai, įskaitant grupių modulį, leidžia „Node.js“ programoms išplėsti mastelį už vieno procesoriaus šerdies. Be pagrindinės funkcijos, „Node.js“ įkvėpė daugiau nei milijono paketų, kurie yra užregistruoti ir versijuoti NPM saugykloje, ekosistemą ir gali būti įdiegti naudojant „NPM“ komandinę eilutę arba tokią alternatyvą, kaip „Yarn“.