Ohjelmointi

Mikä on Node.js? JavaScript-ajonaika on selitetty

Skaalautuvuus, viive ja läpäisykyky ovat verkkopalvelinten keskeisiä suorituskykyindikaattoreita. Viiveiden pitäminen matalana ja läpäisykyky korkealla suurennettaessa ja suurennettaessa ei ole helppoa. Node.js on JavaScript-ajonaikainen ympäristö, joka saavuttaa matalan viiveen ja korkean suorituskyvyn ottamalla "ei-estävän" lähestymistavan palvelupyyntöihin. Toisin sanoen, Node.js ei tuhlaa aikaa tai resursseja odottaessaan I / O-pyyntöjen paluuta.

Perinteisessä lähestymistavassa verkkopalvelimien luomiseen jokaiselle saapuvalle pyynnölle tai yhteydelle palvelin kutee uusi suorituslanka tai jopa haarukat uusi prosessi käsitellä pyyntöä ja lähettää vastaus. Käsitteellisesti tämä on täysin järkevää, mutta käytännössä siitä aiheutuu paljon yleiskustannuksia.

Kutevan aikana langat aiheuttaa vähemmän muistia ja suorittimen lisäkustannuksia kuin haarukka prosessit, se voi silti olla tehoton. Suuren määrän säikeiden läsnäolo voi saada voimakkaasti kuormitetun järjestelmän käyttämään arvokkaita syklejä ketjujen ajoitukseen ja tilanvaihtoon, mikä lisää viiveitä ja asettaa rajoituksia skaalattavuudelle ja läpäisykyvälle.

Node.js käyttää erilaista lähestymistapaa. Se suorittaa järjestelmään rekisteröidyn yksisäikeisen tapahtumasilmukan yhteyksien käsittelemiseksi, ja jokainen uusi yhteys aiheuttaa JavaScriptin takaisinsoittotoiminto ampua. Takaisinsoittotoiminto voi käsitellä pyyntöjä, joissa ei ole estäviä I / O-puheluita, ja tarvittaessa saada aikaan säikeitä poolista suorittamaan esto- tai suorittintehokkaita toimintoja ja kuormituksen tasapainottamiseksi prosessorin ytimissä. Solmun lähestymistapa skaalautumiseen takaisinsoittotoiminnoilla vaatii vähemmän muistia käsittelemään enemmän yhteyksiä kuin useimmat kilpailuarkkitehtuurit, jotka skaalautuvat säikeillä, mukaan lukien Apache HTTP Server, erilaiset Java-sovelluspalvelimet, IIS ja ASP.NET sekä Ruby on Rails.

Node.js osoittautuu palvelimien lisäksi varsin hyödylliseksi työpöytäsovelluksille. Huomaa myös, että Node-sovellukset eivät rajoitu puhtaaseen JavaScriptiin. Voit käyttää mitä tahansa kieltä, joka leviää JavaScriptiin, esimerkiksi TypeScript ja CoffeeScript. Node.js sisältää Google Chrome V8 JavaScript-moottorin, joka tukee ECMAScript 2015 (ES6) -syntaksi ilman tarvetta ES6 - ES5 -siirtolähettimeen, kuten Babeliin.

Suuri osa Noden apuohjelmasta tulee sen suuresta pakettikirjastosta, johon pääsee npm komento. Node-paketinhallinta NPM on osa Node.js-vakioasennusta, vaikka sillä on oma verkkosivusto.

Jotkut JavaScript-historia

Vuonna 1995 Netscapen silloinen urakoitsija Brendan Eich loi JavaScript-kielen toimimaan verkkoselaimissa - tarinan mukaan 10 päivässä. JavaScript oli alun perin tarkoitettu mahdollistamaan animaatiot ja muut selaimen asiakirjaobjektimallin (DOM) manipulaatiot. Pian sen jälkeen esiteltiin Netscape Enterprise Server -palvelimen JavaScript-versio.

Nimi JavaScript valittiin markkinointitarkoituksiin, koska Sunin Java-kieli oli tuolloin laajasti kypsynyt. Itse asiassa JavaScript-kieli perustui itse asiassa ensisijaisesti Scheme- ja Self-kieliin, joissa oli pinnallinen Java-tyyppinen semantiikka.

Aluksi monet ohjelmoijat hylkäsivät JavaScriptin hyödyttömänä "todellisen työn" vuoksi, koska sen tulkki juoksi suuruusluokkaa hitaammin kuin käännetyt kielet. Se muuttui, kun useat JavaScriptin nopeuttamiseen tähtäävät tutkimuspyrkimykset alkoivat tuottaa hedelmää. Näkyvin, avoimen lähdekoodin Google Chrome V8 JavaScript-moottori, joka tekee juuri oikeaan aikaan kokoamisen, linjaamisen ja dynaamisen koodin optimoinnin, voi todella ylittää C ++ -koodin joissakin kuormissa ja ylittää Pythonin useimmissa käyttötapauksissa.

Ryan Dahl esitteli JavaScript-pohjaisen Node.js-alustan Linuxille ja MacOS: lle vuonna 2009 skaalautuvampana vaihtoehtona Apache HTTP Serverille. NPM, kirjoittanut Isaac Schlueter, käynnistettiin vuonna 2010. Node.js: n natiivi Windows-versio esiteltiin vuonna 2011.

Joyent omisti, hallinnoi ja tuki Node.js-kehitystyötä monien vuosien ajan. Vuonna 2015 Node.js-projekti siirrettiin Node.js -säätiölle, ja sitä hallitsi säätiön tekninen ohjauskomitea. Node.js hyväksyttiin myös Linux Foundation -yhteistyöprojektina. Vuonna 2019 Node.js -säätiö ja JS Foundation yhdistyivät ja muodostivat OpenJS-säätiön.

Node.js-perusarkkitehtuuri

Korkealla tasolla Node.js yhdistää Google V8 JavaScript-moottorin, yksisäikeisen ei-estävän tapahtumasilmukan ja matalan tason I / O-sovellusliittymän. Alla esitetty poistettu esimerkkikoodi havainnollistaa HTTP-palvelimen perusmallia ES6-nuolitoimintojen avulla (anonyymit Lambda-toiminnot, jotka on ilmoitettu käyttämällä fat arrow -operaattoria, =>) soittopyyntöjä varten.

Koodin alku lataa HTTP-moduulin, asettaa palvelimen isäntänimi muuttuja paikallinen isäntä (127.0.0.1) ja asettaa satamaan muuttuja on 3000. Sitten se luo palvelimen ja soittopyynnön, tässä tapauksessa rasva-nuolitoiminnon, joka palauttaa aina saman vastauksen kaikkiin pyyntöihin: statusCode 200 (menestys), sisältötyyppi pelkkää tekstiä ja tekstivaste "Hei maailma \ n". Lopuksi se kehottaa palvelinta kuuntelemaan paikallinen isäntä portti 3000 (pistorasian kautta) ja määrittelee soittopyynnön lokiviestin tulostamiseksi konsolille, kun palvelin on alkanut kuunnella. Jos suoritat tämän koodin päätelaitteessa tai konsolissa solmu komento ja selaa sitten localhost: 3000: een millä tahansa saman koneen verkkoselaimella, selaimessasi näkyy "Hello World". Pysäytä palvelin painamalla pääteikkunassa Control-C.

Huomaa, että jokainen tässä esimerkissä soitettu puhelu on asynkronista ja estämätöntä. Soittotoiminnot käynnistetään vastauksena tapahtumiin. createServer callback käsittelee asiakkaan pyyntötapahtuman ja palauttaa vastauksen. kuunnella soittopyyntö käsittelee kuuntelemalla tapahtuma.

Node.js-kirjasto

Kuten alla olevasta kuvasta näet vasemmalla puolella, Node.js: n kirjastossa on laaja valikoima toimintoja. Aikaisemmin esimerkkikoodissa käytetty HTTP-moduuli sisältää sekä asiakas- että palvelinluokat, kuten voit nähdä kuvan oikealla puolella. TLS: ää tai SSL: ää käyttävät HTTPS-palvelintoiminnot elävät erillisessä moduulissa.

Yksi luontainen ongelma yksisäikeisessä tapahtumasilmukassa on pystysuuntaisen skaalauksen puuttuminen, koska tapahtumasilmukan säie käyttää vain yhtä CPU-ydintä. Samaan aikaan nykyaikaiset suorittimen sirut paljastavat usein vähintään kahdeksan ydintä, ja nykyaikaisissa palvelintelineissä on usein useita suorittimen siruja. Yksisäikeinen sovellus ei hyödynnä täysimääräisesti vankan palvelintelineen 24 plus -ydintä.

Voit korjata sen, vaikka se vie jonkin verran lisäohjelmointia. Ensinnäkin, Node.js voi synnyttää lapsen prosessit ja ylläpitää vanhempien ja lasten välisiä putkia, samalla tavalla kuin järjestelmä popen (3) puhelu toimii child_process.spawn () ja siihen liittyvät menetelmät.

Klusterimoduuli on jopa mielenkiintoisempi kuin aliprosessimoduuli skaalautuvien palvelimien luomiseen. cluster.fork () menetelmä synnyttää työntekijän prosessit, jotka jakavat vanhemman palvelinportit child_process.spawn () kansien alla. Klusterimestari jakaa saapuvat yhteydet työntekijöidensä kesken käyttämällä oletusarvoisesti työntekijän prosessikuormitukselle herkkää pyöristysalgoritmia.

Huomaa, että Node.js ei tarjoa reitityslogiikkaa. Jos haluat ylläpitää tilaa klusterin kaikissa yhteyksissä, sinun on pidettävä istunto- ja kirjautumisobjektit muualla kuin työntekijän RAM-muistissa.

Node.js-pakettiekosysteemi

NPM-rekisterissä on yli 1,2 miljoonaa ilmaista, uudelleenkäytettävää Node.js-koodipakettia, mikä tekee siitä maailman suurimman ohjelmistorekisterin. Huomaa, että suurin osa NPM: stä paketteja (lähinnä kansiot tai NPM-rekisterikohdat, jotka sisältävät paketin.json -tiedoston kuvaaman ohjelman) sisältävät useita moduulit (ohjelmat, joihin lataat vaatia lausunnot). Molemmat termit on helppo sekoittaa, mutta tässä yhteydessä niillä on erityinen merkitys, eikä niitä pidä vaihtaa keskenään.

NPM voi hallita paketteja, jotka ovat tietyn projektin paikallisia riippuvuuksia, sekä maailmanlaajuisesti asennettuja JavaScript-työkaluja. Kun sitä käytetään paikallisen projektin riippuvuuksien hallitsijana, NPM voi asentaa yhdellä komennolla kaikki projektin riippuvuudet package.json-tiedoston kautta. Kun sitä käytetään globaaleissa asennuksissa, NPM vaatii usein järjestelmän (sudo) oikeudet.

Et omistaa käyttää NPM-komentoriviä päästäksesi julkiseen NPM-rekisteriin. Muut paketinhallintaohjelmat, kuten Facebookin lanka, tarjoavat vaihtoehtoisia asiakaspuolen kokemuksia. Voit myös etsiä ja selata paketteja NPM: n verkkosivustolla.

Miksi haluat käyttää NPM-pakettia? Monissa tapauksissa paketin asentaminen NPM-komentorivin kautta on nopeinta ja kätevintä saada uusin vakaa versio moduulista, joka toimii ympäristössäsi, ja on yleensä vähemmän työtä kuin lähdetietovaraston kloonaus ja asennuksen rakentaminen arkistosta. Jos et halua uusinta versiota, voit määrittää versionumeroksi NPM, mikä on erityisen hyödyllistä, kun yksi paketti riippuu toisesta paketista ja saattaa rikkoa riippuvuuden uudemman version.

Esimerkiksi Express-kehys, minimaalinen ja joustava Node.js-verkkosovelluskehys, tarjoaa vankan joukon ominaisuuksia yhden, monisivuisten ja hybridisovellusten rakentamiseen. Vaikka helposti kloonattavissa oleva Expresscode-arkisto sijaitsee osoitteessa //github.com/expressjs/express ja Express-ohjeet ovat osoitteessa //expressjs.com/, nopea tapa aloittaa Expressin käyttö on asentaa se jo alustettuun paikalliseen työhön hakemisto npm komento, esimerkiksi:

$ npm install express - tallenna

-Tallentaa Vaihtoehto, joka on oletusarvoisesti käytössä NPM 5.0: ssa ja uudemmissa, käskee paketinhallintaa lisäämään Express-moduulin asennuksen jälkeen package.json-tiedoston riippuvuusluetteloon.

Toinen nopea tapa aloittaa Expressin käyttö on asentaa suoritettava tiedosto generaattoriilmaista (1) globaalisti ja luo sitten sovellus paikallisesti uuteen työkansioon:

$ npm asenna -g express-generator @ 4

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

Kun tämä on saavutettu, voit asentaa kaikki tarvittavat riippuvuudet ja käynnistää palvelimen NPM: n avulla generaattorin luoman package.json-tiedoston sisällön perusteella:

$ npm asennus

$ npm alku

NPM: n miljoonan plus-paketeista on vaikea valita kohokohtia, mutta muutama luokka erottuu. Express on vanhin ja näkyvin esimerkki Node.js-kehyksistä. Toinen suuri luokka NPM-arkistossa on JavaScript-kehitystyökalut, mukaan lukien browserify, moduulipaketti; bower, selainpakettien hallinta; grunt, JavaScript-tehtävän juoksija; ja nielaise, suoratoistojärjestelmä. Lopuksi tärkeä luokka yritys Node.js -kehittäjille on tietokantaasiakkaat, joita on yli 8000, mukaan lukien suositut moduulit, kuten redis, mongoose, firebase ja pg, PostgreSQL-asiakas.

Yhteenvetona voidaan todeta, että Node.js on palvelinten ja sovellusten välinen Java-käyttöympäristö. Se on rakennettu yksisäikeiseen, estämättömään tapahtumasilmukkaan, Google Chrome V8 JavaScript -moottoriin ja matalan tason I / O-sovellusliittymään. Erilaiset tekniikat, mukaan lukien klusterimoduuli, antavat Node.js-sovelluksille mahdollisuuden skaalata yhden CPU-ytimen ulkopuolelle. Ydintoimintojensa lisäksi Node.js on innoittanut yli miljoonan paketin ekosysteemin, jotka on rekisteröity ja versioitu NPM-arkistoon ja jotka voidaan asentaa käyttämällä NPM-komentoriviä tai muuta vaihtoehtoa, kuten Lanka.