Ohjelmointi

Node.js-opetusohjelma: Aloita Node.js: n käyttö

Node.js, palvelinten ja sovellusten välinen alustojen välinen JavaScript-ajonaikaisympäristö tarjoaa monia etuja. Alhainen muistin käyttö, hyvä suorituskyky ja suuri pakettien ekosysteemi, joita tällä hetkellä on noin 475 000, ovat tehneet Node.js: stä suositun valinnan verkkopalvelimien, REST-sovellusliittymien, reaaliaikaisten verkkosovellusten (esim. Chat, pelit) ja jopa monitasoiset työpöytäsovellukset.

Jos et ole vielä aloittanut Node.js: n käyttöä, on ehkä aika. Tutustu Node.js-selittäjääni oppiaksesi, kuinka Node.js toimii. Tässä artikkelissa käymme läpi Node.js: n ja NPM-paketinhallinnan asentamisen, yksinkertaisen verkkopalvelimen rakentamisen ja Node.js-klusterimoduulin käyttämisen useiden suorittimen ytimien hyödyntämiseksi.

Tarkastelemme myös muiden Node.js-moduulien ja muiden JavaScript-pakettien asentamista NPM-paketinhallinnan avulla. Ja käytämme Node.js-kehystä, tässä tapauksessa Koa, luomaan monipuolisempia ja joustavampia Node.js-palvelimia.

Aloitetaan.

Kuinka asentaa Node.js ja NPM

Aloita selaamalla osoitteeseen //nodejs.org:

Node.js -säätiö

Napsauta LTS (pitkäaikainen tuki) -latauspainiketta, ellet tiedä, että tarvitset uutta ominaisuutta nykyiseen julkaisuun. Ladatun asennusohjelman täsmällinen ulkonäkö voi vaihdella käyttöjärjestelmittäin, mutta Macilla se näyttää alussa tältä:

Kun asennus on valmis, se näyttää tältä:

Nyt sinun on varmistettava, että sekä Node.js että NPM on asennettu oikein. Avaa komentorivin kuori (pääte Macissa; komentokehote Windowsissa) ja tarkista molempien asennetut versiot:

$ solmu - versio

v6.11.3

$ npm - versio

3.10.10

Jos saat virheitä, joiden mukaan Node.js tai NPM ei löytynyt, yritä käynnistää shell-sovellus uudelleen tai käynnistää tietokone uudelleen. Jos se ei toimi, joudut ehkä muokkaamaan $ PATH (Mac ja Linux) tai PATH (Windows) ja käynnistämään uudestaan.

Sekä Node.js että NPM vastaavat aiottuja versioita yllä olevassa päätelaitteen kuvakaappauksessa, joten olen valmis siirtymään eteenpäin ja kehittämään jotain Node.js: n kanssa. Aloitetaan jostakin, joka on helppo rakentaa puhtaalla solmulla.

Tarvitset koodieditorin tai IDE: n, mieluiten sellaisen, joka tukee JavaScriptiä ja Node.js: ää, kuten Sublime Text, Visual Studio Code, Brackets, Atom tai WebStorm.

Node.js-esimerkki: Yksinkertainen verkkopalvelin

Aloitetaan todella yksinkertaisesti: varastetaan yksinkertainen esimerkki Node.js-sivustolta. Kopioi koodi ja liitä se koodieditoriin (käytän Visual Studio -koodia, mutta kaikki pelkkää tekstiä säästävät muokkaimet riittävät) ja tallenna se esimerkkinä.js.

const http = vaatia (’http’);

const isäntänimi = ’127.0.0.1’;

const-portti = 3000;

const-palvelin = http.createServer ((kysy, res) => {

res.statusCode = 200;

res.setHeader (’Sisältötyyppi’, ’teksti / tavallinen’);

res.end (’Hello World \ n’);

});

server.listen (portti, isäntänimi, () => {

console.log (`Palvelin toimii osoitteessa // $ {hostname}: $ {port} /`);

});

Avaa komentotulkki hakemistossa, johon tallensit tiedoston, ja suorita tiedosto komentoriviltä:

$ solmu esimerkki.js

Palvelin toimii osoitteessa //127.0.0.1:3000/

Minun tapauksessani käytin Visual Studio -koodissa pääteikkunaa. Olisin melkein yhtä helposti voinut siirtyä itsenäiseen kuori-ikkunaan.

Selaa nyt palvelimen ilmoittamaan URL-osoitteeseen:

Pysäytä solmupalvelin painamalla terminaalin Control-C-painiketta.

Ennen kuin jatkat, hajotetaan koodi.

const http = vaatia (’http’);

Rivi 1 käyttää vaatia, miten moduulit ladataan Node.js: ään. Lauseke lataa Node.js http -moduulia, joka toimittaa createServer menetelmä kutsutaan riveillä 6-10 ja kuunnella menetelmä kutsutaan riveillä 12 - 14. "Rasva nuoli" -operaattori => riveillä 6 ja 12 on lyhenne luoda nimettömiä Lambda-toimintoja, joita käytetään usein Node.js-sovelluksissa.

const-palvelin = http.createServer ((kysy, res) => {

res.statusCode = 200;

res.setHeader (’Sisältötyyppi’, ’teksti / tavallinen’);

res.end (’Hello World \ n’);

});

res argumentti createServer () rivillä 6 käytetään vastauksen rakentamiseen; req argumentti sisältää saapuvan HTTP-pyynnön, joka ohitetaan tässä koodissa. uudelleen lähettää method asettaa vastaustiedoksi ”Hello World \ n” ja kertoo palvelimelle, että vastauksen luominen on valmis.

server.listen (portti, isäntänimi, () => {

console.log (`Palvelin toimii osoitteessa // $ {hostname}: $ {port} /`);

});

Palvelin päättäminen tuottaja server.listen () method käskee palvelimen kuuntelemaan määritetyn isännän (127.0.0.1, esim. localhost) ja portin (3000) pyyntöjä. -. - sulkimen tuottama createServer () method käsittelee pyynnöt, kun ne tulevat määritetylle isännälle ja portille.

Ajatus siitä, että JavaScript-sulkemiset määritellään tapahtumankäsittelijöiksi, on yksi Node.js: n hienovaraisimmista ja tehokkaimmista osista, ja se on avain solmun asynkroniseen estämättömään arkkitehtuuriin. Node.js piilottaa tapahtumasilmukkansa, mutta palaa aina tapahtumien käsittelyyn, kun sitä ei muuten käytetä. Lisäksi JavaScript-sulkemiset käyttävät paljon vähemmän muistia kuin vaihtoehtoiset tapat käsitellä useita asiakasyhteyksiä, kuten kutevan langan tai haarautumisprosessit.

Node.js-esimerkki: Moniprosessinen verkkopalvelin

Sen lisäksi, että yllä oleva esimerkki tulostaa vain "Hello World", se toimii vain yhdessä säikeessä, mikä tarkoittaa, että se voi käyttää vain yhtä isäntätietokoneen ydintä. Joskus sinulla on monia ytimiä, jotka haluat omistaa palvelimelle.

Solmun klusterimoduulin virallinen esimerkki näyttää, kuinka tämä korjataan. Kuten aikaisemmin, varastamme koodin ja suoritamme sen. Selaa Node.js-klusterin ohjeisiin, kopioi koodi, liitä se koodieditoriin tai IDE: hen ja tallenna se nimellä server.js.

const cluster = vaatia (’cluster’);

const http = vaatia (’http’);

const numCPUs = vaativat (’os’). cpus (). pituus;

if (cluster.isMaster) {

console.log (`Master $ {process.pid} on käynnissä`);

// Haarukkatyöntekijät.

for (leti = 0; i

cluster.fork ();

}

cluster.on (’exit’, (työntekijä, koodi, signaali) => {

console.log (`työntekijä $ {worker.process.pid} kuoli`);

});

} muu {

// Työntekijät voivat jakaa minkä tahansa TCP-yhteyden

// Tässä tapauksessa se on HTTP-palvelin

http.createServer ((kysy, res) => {

res.writeHead (200);

res.end (`hello world from $ {process.pid} \ n`);

}). kuuntele (8000);

console.log (`Työntekijä $ {process.pid} aloitettu`);

}

Kun suoritat solmu server.js komentoriviltä loki näyttää pää- ja työntekijäprosessien prosessitunnukset. Työntekijöitä pitäisi olla niin monta kuin tietokoneellasi on loogisia ytimiä - kahdeksan MacBook Prolle, jossa on Core i7 -prosessori, jossa on neljä laitteistoydintä ja hyperlanka.

Jos selaat osoitteeseen localhost: 8000 tai kohtaan 127.0.0.1:8000, näet "hei maailma". Voit lopettaa solmupalvelimen prosessit painamalla pääteikkunassa Control-C.

const cluster = vaatia (’cluster’);

const http = vaatia (’http’);

const numCPUs = vaatia (’os’). cpus (). pituus;

Rivien 1 ja 2 tulisi näyttää tutuilta viimeisestä esimerkistä. Linja 3 on hieman erilainen. Sen sijaan, että yksinkertaisesti vaatisi os moduuli, se kutsuu myös cpus () jäsenfunktio ja palauttaa palautetun matriisin pituuden, joka on suorittimien lukumäärä. Itse taulukko ja os moduulilinkki on tällöin saavuttamaton, ja se voi olla roskaa, jonka JavaScript-moottori kerää myöhemmin.

if (cluster.isMaster) {

console.log (`Master $ {process.pid} on käynnissä`);

// Haarukkatyöntekijät.

for (olkoon i = 0; i <prosessorien lukumäärä; i ++) {

cluster.fork ();

   }

cluster.on (’exit’, (työntekijä, koodi, signaali) => {

console.log (`työntekijä $ {worker.process.pid} kuoli`);

   });

}

Rivi 5 aloittaa lohkon, joka toimii vain pääprosessia varten. Se kirjaa PID-tunnuksensa, haarautuu työntekijään käytettävissä olevaa prosessoria kohti ja luo sulkun klusterin poistumistapahtumien käsittelemiseksi ja kirjaamiseksi.

} muu {

// Työntekijät voivat jakaa minkä tahansa TCP-yhteyden

// Tässä tapauksessa se on HTTP-palvelin

http.createServer ((kysy, res) => {

res.writeHead (200);

res.end (’hei maailma \ n’);

}). kuuntele (8000);

console.log (`Työntekijä $ {process.pid} aloitettu`);

Riviltä 16 alkavaa lohkoa ohjaavat vain työntekijäprosessit. Tämän koodin tulisi näyttää tutulta edellisestä esimerkistä: Se luo verkkopalvelimen, joka vastaa kaikkiin pyyntöihin "hei maailma".

Edellä esitetystä tuloksesta käy selvästi ilmi, että tämä koodi suoritettiin koneellani kahdeksan kertaa, mikä loi kahdeksan verkkopalvelintyöntekijää jakamaan vanhemman prosessin TCP-yhteyden portissa 8000. Mutta miten järjestelmä jakaa kuormituksen keskenään?

Asiakirjoissa sanotaan, että Node.js-klusterimoduuli käyttää oletusarvoisesti muokattua round robin -algoritmia, paitsi Windowsissa. Algoritmia ohjaa cluster.schedulingPolitiikka omaisuus.

Mistä tiedämme, että tämä toimii? Testataan sitä. Se vaatii vain yhden koodirivin muuttamisen. Muokkaa riviä 21 lukemaan:

      res.end (`hello world from $ {process.pid} \ n`);

Huomaa, että sinun ei tarvitse vain lisätä alkaen $ {process.pid}, mutta joudut myös vaihtamaan erottimet yksittäisistä lainausmerkeistä takaosiin, jotta JavaScript suorittaa muuttuvan korvaamisen merkkijonossa.

Tallenna tiedosto, pysäytä kaikki aikaisemmat käynnissä olevat esiintymät ja suorita se uudelleen. Saatat ajatella, että joka kerta, kun päivität selainasiakasohjelman, palautettu prosessin tunnus muuttuu, mutta olisit väärässä. Selain on liian älykäs, emmekä ole merkinneet verkkosivua vanhentuvaksi, joten selain tallentaa välimuistiin vastauksen ensimmäisen käynnistyksen yhteydessä ja näyttää saman numeron. Se tekee sen, vaikka luotkin useita selaimen välilehtiä tai sivuja, jotka osoittavat samaan URL-osoitteeseen. Voit kuitenkin nähdä, että pääkierroksen lähettäminen masterista toimii suorittamalla useita selaimia samanaikaisesti, tässä tapauksessa Chrome, Safari ja Opera:

Jos olet perehtynyt muihin verkkopalvelimiin, saatat odottaa näkevän järjestelmän reitityspyynnöille ja jatkuvan tilan ylläpitämiselle, jotta jokaisen käyttäjän kirjautumistunnus ja ympäristö voidaan säilyttää Solmussa. Valitettavasti Solmella ei ole sitä sisäänrakennettua. Älä pelkää: Node.js: n päälle on rakennettu lukuisia verkkokehyksiä, jotka tekevät kaiken mitä odotat.

Node.js-moduulin asentaminen NPM: n kanssa

Useimpien Node-moduulien käyttämiseksi sinun on periaatteessa asennettava moduuli NPM-rekisteristä joko globaalisti tai projektihakemistoon ja sitten vaatia() se koodistasi. Usein projekti riippuu useista NPM-moduuleista ja pitää luettelon project.json-tiedostossa. Sen sijaan, että asennat jokaisen riippuvuuden komentoriviltä, ​​voit asentaa ne kaikki kerralla, usein tarkistettuasi projektin sen GitHub-arkistosta:

$

$ cd my_project

$ npm asennus

Kaikki NPM-paketit eivät toimi täsmälleen tällä tavalla. Joillakin, mukaan lukien React, on "tehdas" -sovelluksia luoda käynnistyssovellukset yhtenä asennusvaihtoehtona.

$ npm asennus -g create-reagoi-sovellus

$ cd ~ / työ

$ create-react-app my-app

$ cd my-app /

$ npm alku

Ei ole epätavallista, että työkalut asennetaan maailmanlaajuisesti. Esimerkiksi Angular-komentorivityökalu Ng asennetaan maailmanlaajuisesti. Suoritat sen sitten paikallisesti luoda sovelluksen kansioon.

$ npm asenna -g @ kulma / cli

$ cd ~ / työ

$ ng uusi oma sovellus

Kulmalla on satunnaisesti toinen asennusmenetelmä, joka näyttää enemmän kuin tavallinen kuvio. Tämä koskee Angular QuickStart -siemeniä:

$ git klooni //github.com/angular/quickstart.git pikakäynnistys

$ cd -pikaopas

$ npm asennus

Pikakäynnistyskansiossa oleva pack.json-tiedosto kertoo npm asentaa noutaa melkein saman luettelon riippuvuuksista kuin CLI-asennus.

Node.js-esimerkki: Koa-verkkopalvelin

Vaikka sekä React että Angular ovat osa Node.js-ekosysteemiä ja tarvitsevat Node.js: n ja NPM: n kehitykseen, ne eivät ole nimenomaan Node.js-kehyksiä - ne voivat toimia selaimessa. Käsittelin kymmeniä todellisia Node.js-kehyksiä "Täydellinen opas Node.js-kehyksiin".

Esimerkiksi Express on alkuperäinen täysi-solmuinen Web-palvelin, joka käsittelee verkkosovellusta, HTTP-pyyntöjä ja vastauksia, reititystä ja väliohjelmistoja. Uudempi vaihtoehto, Koa, käyttää generaattorit väliohjelmistojen takaisinsoittojen sijaan.

Asennat Koa-sovelluksen vakiokuvion sovelluskansioon:

$ npm asenna koa

Alla on Koa “Hello World” -sovelluksen koodi, jonka voit tallentaa ja suorittaa kuten edellisissä esimerkeissä.

const Koa = vaatia (’koa’);

const app = uusi Koa ();

// x-vasteaika

app.use (async (ctx, seuraava) => {

const start = Date.now ();

odota seuraavaksi ();

const ms = Date.now () -start;

ctx.set (‘X-Response-Time’, `$ {ms} ms`);

});

// kirjaaja

app.use (async (ctx, seuraava) => {

const start = Päivämäärä.nyt ();

odota seuraavaksi ();

const ms = Date.now () -aloitus;

console.log (`$ {ctx.method} $ {ctx.url} - $ {ms}`);

});

// vastaus

app.use (async ctx => {

ctx.body = ”Hei maailma”;

});

app. kuuntele (3000);

Koa käyttää väliohjelmistogeneraattoreita ja Expressin ja muiden Node.js-kehysten käyttämiä soittopyyntöjä. Monet takaisinsoittototeutukset yksinkertaisesti ohjaavat hallintaa toimintosarjojen läpi, kunnes yksi palaa, kun taas Koa antaa "alavirran", sitten ohjaus palaa "ylävirtaan".

Yllä olevassa esimerkissä x-vasteaika “kietoo” vastausgeneraattorinodottaa seuraavaa () lausunto, joka merkitsee puhelun. Tämän asynkronisen toiminnon käyttö on joustavampaa kuin eksplisiittiset funktiokutsut, koska sen avulla on helppo lisätä toinen generaattori sekvenssiin, esimerkiksi verkkoloki ajastimen ja vastauksen väliin.

Saatat törmätä vanhempaan Koa-koodiin, joka käyttää tuotto seuraavaksi sijasta odottaa seuraavaa (). Erona on, että Koa tukee nyt ES2015- ja asynkronitoimintoja. Ohjausvirta tarkoittaa samaa: Se siirtyy ketjun seuraavaan käsittelijään tuotto seuraavaksi ja palaa sitten, kun kaikki käsittelijät ovat valmiit.

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