Programmēšana

Node.js apmācība: sāciet darbu ar Node.js

Node.js, starpplatformu JavaScript izpildlaika vide serveriem un lietojumprogrammām, piedāvā daudzas priekšrocības. Zems atmiņas patēriņš, laba veiktspēja un liela paku ekosistēma, kuras šobrīd ir aptuveni 475 000, ir padarījusi Node.js populāru izvēli tīmekļa serveru, REST API, reāllaika tīkla lietojumprogrammu (piemēram, tērzēšana, spēles) un pat starpplatformu darbvirsmas lietotnes.

Ja vēl neesat sācis darbu ar Node.js, iespējams, ir pienācis laiks. Pārbaudiet manu Node.js skaidrotāju, lai uzzinātu, kā Node.js darbojas ar savu burvību. Šajā rakstā mēs instalēsim Node.js un NPM pakotņu pārvaldnieku, izveidosim vienkāršu tīmekļa serveri un izmantosim Node.js kopu moduli, lai izmantotu vairāku CPU kodolu priekšrocības.

Mēs izskatīsim arī papildu Node.js moduļu un citu JavaScript pakotņu instalēšanu, izmantojot NPM pakotņu pārvaldnieku. Mēs izmantosim Node.js ietvaru, šajā gadījumā Koa, lai izveidotu funkcijām bagātākus un elastīgākus Node.js serverus.

Sāksim.

Kā instalēt Node.js un NPM

Sāciet, pārlūkojot vietni //nodejs.org:

Node.js fonds

Noklikšķiniet uz pogas, lai lejupielādētu LTS (ilgtermiņa atbalsts), ja vien jūs nezināt, ka pašreizējā laidienā jums nepieciešama kāda jauna funkcija. Precīzi, kā lejupielādētais instalētājs izskatīsies, dažādās operētājsistēmās var atšķirties, taču Mac datorā sākumā tas izskatās šādi:

Kad instalēšana ir pabeigta, tas izskatās šādi:

Tagad jums jāpārliecinās, ka gan Node.js, gan NPM ir pareizi instalēti. Atveriet komandrindas apvalku (Terminal Mac datorā; Komandu uzvedne Windows) un pārbaudiet abu instalētās versijas:

$ mezgls - versija

v6.11.3

$ npm - versija

3.10.10

Ja rodas kļūdas, kurās teikts, ka Node.js vai NPM netika atrasts, mēģiniet restartēt čaulas lietojumprogrammu vai restartēt datoru. Ja tas nedarbojas, iespējams, jums būs jārediģē $ PATH (Mac un Linux) vai PATH (Windows) un jārestartē vēlreiz.

Gan Node.js, gan NPM atbilst paredzētajām versijām iepriekšminētajā Terminal ekrānuzņēmumā, tāpēc esmu gatavs virzīties tālāk un reāli kaut ko attīstīt ar Node.js. Sāksim ar kaut ko tādu, ko viegli izveidot, izmantojot tīru Node.

Jums būs nepieciešams kodu redaktors vai IDE, vēlams, kas atbalsta JavaScript un Node.js, piemēram, Sublime Text, Visual Studio Code, Brackets, Atom vai WebStorm.

Node.js piemērs: vienkāršs tīmekļa serveris

Lai sāktu patiešām vienkārši, nozagsim vienkāršu piemēru no vietnes Node.js. Nokopējiet kodu un ielīmējiet to koda redaktorā (es izmantoju Visual Studio kodu, taču pietiek ar jebkuru redaktoru, kas saglabā vienkāršu tekstu), pēc tam saglabājiet to kā example.js.

const http = pieprasīt (‘http’);

const resursdatora nosaukums = ‘127.0.0.1’;

const ports = 3000;

const serveris = http.createServer ((req, res) => {

res.statusCode = 200;

res.setHeader (‘Content-Type’, ‘text / plain’);

res.end (‘Sveika pasaule \ n’);

});

server.listen (ports, resursdatora nosaukums, () => {

console.log (`Serveris darbojas vietnē // $ {resursdatora nosaukums: $ {ports} /`);

});

Atveriet čaulu direktorijā, kurā saglabājāt failu, un palaidiet failu no komandrindas:

$ node example.js

Serveris darbojas vietnē //127.0.0.1:3000/

Manā gadījumā es izmantoju Visual Studio koda logu Terminal. Gandrīz tikpat viegli es būtu varējis pāriet uz neatkarīgu čaulas logu.

Tagad pārlūkojiet servera norādīto URL:

Lai apturētu mezgla serveri, terminālā nospiediet Control-C.

Pirms turpināt darbu, atdalīsim kodu.

const http = pieprasīt (‘http’);

1. rindā tiek izmantoti pieprasīt, kā jūs moduļus ielādējat Node.js. Izraksts tiek ielādēts Node.js http modulis, kas piegādā createServer metode, kas izsaukta 6. līdz 10. rindā, un klausīties metodi sauc par līnijām 12 līdz 14. Operators “tauku bultiņa” => 6. un 12. rindā ir stenogrāfija, lai izveidotu anonīmas Lambda funkcijas, kuras bieži izmanto Node.js lietotnēs.

const serveris = http.createServer ((req, res) => {

res.statusCode = 200;

res.setHeader (‘Content-Type’, ‘text / plain’);

res.end (‘Sveika pasaule \ n’);

});

The rez arguments uz createServer () 6. rindā tiek izmantots reakcijas veidošanai; pieprasījums arguments satur ienākošo HTTP pieprasījumu, kas šajā kodā tiek ignorēts. The res.end method nosaka atbildes datus uz “Hello World \ n” un paziņo serverim, ka atbildes izveidošana ir pabeigta.

server.listen (ports, resursdatora nosaukums, () => {

console.log (`Serveris darbojas vietnē // $ {resursdatora nosaukums: $ {ports} /`);

});

Serveris slēgšana ražo server.listen () metode liek serverim noklausīties pieprasījumus noteiktajā resursdatorā (127.0.0.1, piemēram, localhost) un portā (3000). Aizdare, ko ražo createServer () metode apstrādā pieprasījumus, kad tie ienāk definētajā resursdatorā un portā.

Ideja, ka JavaScript slēgšana tiek definēta kā notikumu apstrādātāja, ir viena no vissīkākajām un spēcīgākajām Node.js daļām un ir atslēga mezgla asinhronajai nebloķējošajai arhitektūrai. Node.js slēpj savu notikumu ciklu, taču vienmēr atgriežas pie notikumu apstrādes, ja tas nav citādi iesaistīts. Turklāt JavaScript slēgšana patērē daudz mazāk atmiņas nekā alternatīvi veidi, kā apstrādāt vairākus klienta savienojumus, piemēram, nārsta pavedieni vai dakšu procesi.

Node.js piemērs: daudzprocesu tīmekļa serveris

Izņemot tikai “Hello World” drukāšanu, iepriekš minētais piemērs darbojas tikai vienā pavedienā, kas nozīmē, ka tajā var izmantot tikai vienu resursdatora kodolu. Ir reizes, kad jums būs daudz kodolu, kurus vēlaties veltīt serverim.

Mezglu kopas moduļa oficiālais piemērs parāda, kā to novērst. Tāpat kā iepriekš, mēs nozagsim kodu un palaidīsim to. Pārlūkojiet līdz Node.js kopas dokumentācijai, nokopējiet kodu, ielīmējiet to koda redaktorā vai IDE un saglabājiet to kā server.js.

konst klasteris = pieprasīt (‘kopa’);

const http = pieprasīt (‘http’);

const numCPUs = pieprasīt (‘os’). cpus (). garums;

ja (cluster.isMaster) {

console.log (`Master $ {process.pid} darbojas`);

// Dakšu strādnieki.

par (leti = 0; i

kopa.dakša ();

}

cluster.on (‘izeja’, (darbinieks, kods, signāls) => {

console.log (`darbinieks $ {darbinieks.process.pid} miris`);

});

} cits

// Darbinieki var koplietot jebkuru TCP savienojumu

// Šajā gadījumā tas ir HTTP serveris

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

res.writeHead (200);

res.end (`sveika pasaule no $ {process.pid} \ n`);

}). klausieties (8000);

console.log (`Darbinieks $ {process.pid} sākās`);

}

Kad jūs izpildāt mezgls server.js no komandrindas žurnālā tiks parādīti galvenā un darba procesa procesu ID. Darbinieku vajadzētu būt tik daudz, cik datorā ir loģiski kodoli - astoņi manam MacBook Pro ar tā Core i7 procesoru, kuram ir četri aparatūras kodoli un hiper pavedieni.

Pārlūkojot vietni localhost: 8000 vai līdz 127.0.0.1:8000, redzēsiet “sveika pasaule”. Lai apturētu mezgla servera procesus, termināļa logā varat nospiest Control-C.

konst klasteris = pieprasīt (‘kopa’);

const http = pieprasīt (‘http’);

const numCPUs = pieprasīt (‘os’). cpus (). garums;

1. un 2. rindai vajadzētu izskatīties pazīstami no pēdējā piemēra. 3. līnija ir nedaudz atšķirīga. Tā vietā, lai vienkārši pieprasītu os moduli, tas arī izsauc CPU () member funkcija un atgriež atgrieztā masīva garumu, kas ir CPU skaits. Pats masīvs un os moduļa saite pēc tam nav sasniedzama, un vēlāk tā var būt atkritumu savākšana ar JavaScript dzinēju.

ja (cluster.isMaster) {

console.log (`Master $ {process.pid} darbojas`);

// Dakšu strādnieki.

par (lai i = 0; i <CPU skaits; i ++) {

kopa.dakša ();

   }

cluster.on (‘izeja’, (darbinieks, kods, signāls) => {

console.log (`darbinieks $ {darbinieks.process.pid} miris`);

   });

}

5. rinda sāk bloku, kas darbojas tikai galvenajam procesam. Tas reģistrē savu PID, izveido darbinieku par katru pieejamo CPU un izveido slēgšanu, lai apstrādātu un reģistrētu kopas izejas notikumus.

} cits

// Darbinieki var koplietot jebkuru TCP savienojumu

// Šajā gadījumā tas ir HTTP serveris

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

res.writeHead (200);

res.end (‘sveika pasaule \ n’);

}). klausieties (8000);

console.log (`Darbinieks $ {process.pid} sākās`);

Bloku, kas sākas no 16. rindas, vada tikai strādnieku procesi. Šim kodam vajadzētu būt pazīstamam no iepriekšējā piemēra: tas izveido tīmekļa serveri, kas atbild uz visiem pieprasījumiem ar “sveika pasaule”.

No iepriekš redzētās izejas ir skaidrs, ka šis kods manā mašīnā darbojās astoņas reizes, izveidojot astoņus tīmekļa servera darbiniekus, kuri 8000. portā kopīgi izmantoja vecāku procesa TCP savienojumu. Bet kā sistēma dala slodzi starp viņiem?

Dokumentācijā teikts, ka Node.js kopas modulis pēc noklusējuma izmanto modificētu apļa algoritmu, izņemot Windows. Algoritmu kontrolē kopa.schedulingPolitika īpašums.

Kā mēs zinām, ka tas darbojas? Pārbaudīsim. Būs jāmaina tikai viena koda rinda. Rediģējiet 21. rindiņu, lai lasītu:

      res.end (`sveika pasaule no $ {process.pid} \ n`);

Ievērojiet, ka jums nav tikai jāpievieno no $ {process.pid}, taču jums ir arī jāmaina norobežotāji no vienpēdiņām uz aizmugurējām ērcēm, lai JavaScript virknē mainītu aizstājējus.

Saglabājiet failu, pārtrauciet jebkuru iepriekšējo palaisto gadījumu un palaidiet to vēlreiz. Jūs varētu domāt, ka katru reizi, kad atsvaidzināt pārlūkprogrammas klientu, atgrieztais procesa ID tiks mainīts, taču jūs kļūdāties. Pārlūkprogramma ir pārāk gudra, un mēs neesam atzīmējuši vietni kā tādu, kurai beidzas derīguma termiņš, tāpēc pārlūks atbildi saglabās kešatmiņā, kad tā pirmo reizi paliks, un turpinās rādīt to pašu numuru. Tas tiks darīts, pat ja izveidosit vairākas pārlūkprogrammas cilnes vai lapas, kas norāda uz vienu un to pašu URL. Tomēr jūs varat redzēt, ka apļa nosūtīšana no galvenā diska darbojas, vienlaikus darbinot vairākas pārlūkprogrammas, šajā gadījumā Chrome, Safari un Opera:

Ja esat pazīstams ar citiem tīmekļa serveriem, iespējams, ka redzēsit shēmu pieprasījumu maršrutēšanai un pastāvīga stāvokļa uzturēšanai, lai saglabātu katra lietotāja pieteikuminformāciju un vidi mezglā. Diemžēl mezglā nav tā iebūvēta. Nebaidieties: vietnē Node.js ir izveidoti daudzi tīmekļa ietvari, kas dara visu, ko gaidījāt.

Kā instalēt Node.js moduli ar NPM

Lai izmantotu lielāko daļu Node moduļu, jūs vienkārši instalējat moduli no NPM reģistra globāli vai projekta direktorijā un pēc tam pieprasīt () to no sava koda. Bieži vien projekts ir atkarīgs no vairākiem NPM moduļiem un saglabā šo sarakstu savā project.json failā. Tā vietā, lai instalētu katru atkarību no komandrindas, jūs varat tos instalēt visus uzreiz, bieži vien pēc projekta pārbaudīšanas no tā GitHub repozitorija:

$

$ cd my_project

$ npm instalēt

Ne katra NPM pakete darbojas tieši tā. Dažiem, tostarp React, ir “rūpnīcas” lietotnes izveidot startera lietotnes kā vienu no to instalēšanas iespējām.

$ npm instalēt -g izveidot-reaģēt-lietotni

$ cd ~ / darbs

$ create-reaģēt-app mana-lietotne

$ cd mana lietotne /

Sākums: $ npm

Tas nav nekas neparasts, ja rīki tiek instalēti visā pasaulē. Piemēram, komandrindas rīks Angular tiek instalēts globāli. Pēc tam jūs to palaižat lokāli, lai mapē izveidotu lietotni.

$ npm instalēt -g @ angular / cli

$ cd ~ / darbs

$ ng jauna mana lietotne

Leņķa gadījumā ir cita instalēšanas metode, kas vairāk izskatās pēc standarta parauga. Tas attiecas uz Angular QuickStart sēklām:

$ git clone //github.com/angular/quickstart.git quickstart

$ cd ātrais sākums

$ npm instalēt

Ātrās palaišanas mapē norāda fails pack.json npm instalēt ielādēt gandrīz tādu pašu atkarību sarakstu kā CLI instalēšana.

Node.js piemērs: Koa tīmekļa serveris

Lai gan gan React, gan Angular ir daļa no Node.js ekosistēmas, un to izstrādei nepieciešami Node.js un NPM, tie nav īpaši Node.js ietvari - tos var palaist pārlūkprogrammā. Es apskatīju desmitiem faktisko Node.js ietvaru sadaļā “Pilnīgs ceļvedis Node.js ietvariem”.

Piemēram, Express ir oriģināls pilnveidots mezgla tīmekļa serveris, kas apstrādā tīmekļa lietojumprogrammu, HTTP pieprasījumus un atbildes, maršrutēšanu un starpprogrammatūru. Tiek izmantota jaunāka opcija Koa ģeneratori starpprogrammatūras atzvanīšanas vietā.

Jūs instalējat Koa ar standarta modeli savas lietotnes mapē:

$ npm instalējiet koa

Zemāk ir Koa lietotnes “Hello World” kods, kuru varat saglabāt un palaist tāpat kā iepriekšējos piemēros.

const Koa = pieprasīt (‘koa’);

const app = new Koa ();

// x-response-time

app.use (async (ctx, nākamais) => {

const start = Datums.tagad ();

gaidīt nākamo ();

const ms = Date.now () -start;

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

});

// mežizstrādātājs

app.use (async (ctx, nākamais) => {

const start = Datums.tagad ();

gaidīt nākamo ();

const ms = Date.now () -start;

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

});

// atbilde

app.use (async ctx => {

ctx.body = ‘Sveika pasaule’;

});

app.listen (3000);

Ir atšķirība starp starpprogrammatūras ģeneratoriem, kurus izmanto Koa, un atzvaniem, kurus izmanto Express un citi Node.js ietvari. Daudzas atzvanīšanas ieviešanas vienkārši kontrolē funkcijas, izmantojot virkni funkciju, līdz viena atgriežas, savukārt Koa dod “lejup pa straumi”, pēc tam vadība plūst atpakaļ “augšpus straumes”.

Iepriekš minētajā piemērā x-response-time “iesaiņo” atbildes ģeneratoru argaidīt nākamo () paziņojums, kas iezīmē zvanu. Šīs asinhronās funkcijas izmantošana ir elastīgāka nekā skaidru funkciju izsaukšana, jo tā ļauj secībā ievietot citu ģeneratoru, piemēram, tīmekļa reģistrētāju starp taimeri un atbildi.

Jūs varētu saskarties ar vecāku Koa kodu, kas tiek izmantots raža nākamā tā vietā gaidīt nākamo (). Atšķirība ir tāda, ka Koa tagad atbalsta ES2015 un asinhronizācijas funkcijas. Kontroles plūsma nozīmē to pašu: tā pāriet pie nākamā ķēdes apstrādātāja pie raža nākamā zvanu un pēc tam atgriežas, kad visi apstrādātāji ir pabeiguši.

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