Programovanie

Výukový program Node.js: Začíname s Node.js

Node.js, medziplatformové runtime prostredie JavaScriptu pre servery a aplikácie, ponúka mnoho výhod. Nízke využitie pamäte, dobrý výkon a veľký ekosystém balíkov, ktorých je v súčasnosti okolo 475 000, spôsobili, že Node.js je obľúbenou voľbou pre vytváranie webových serverov, REST API, sieťových aplikácií v reálnom čase (napr. Chat, hry) a dokonca multiplatformové desktopové aplikácie.

Ak ste s Node.js ešte nezačali, asi je čas. Pozrite sa na môj vysvetľovač Node.js, aby ste sa dozvedeli, ako Node.js funguje. V tomto článku si ukážeme inštaláciu Node.js a správcu balíkov NPM, roztočenie jednoduchého webového servera a použitie klastrového modulu Node.js na využitie výhod viacerých jadier CPU.

Taktiež sa pozrieme na inštaláciu ďalších modulov Node.js a ďalších balíkov JavaScriptu pomocou správcu balíkov NPM. A my sa ponoríme do práce s využitím rámca Node.js, v tomto prípade Koa, aby sme vytvorili viac funkčných a flexibilných serverov Node.js.

Začnime.

Ako nainštalovať Node.js a NPM

Začnite prehliadaním stránky //nodejs.org:

Nadácia Node.js

Kliknite na tlačidlo pre stiahnutie LTS (dlhodobá podpora), pokiaľ neviete, že v aktuálnom vydaní potrebujete nejakú novú funkciu. Ako bude stiahnutý inštalačný program vyzerať, sa môže v jednotlivých operačných systémoch líšiť, ale v počítačoch Mac to na začiatku vyzerá takto:

Po dokončení inštalácie to vyzerá takto:

Teraz by ste sa mali ubezpečiť, že sú súbory Node.js aj NPM nainštalované správne. Otvorte shell príkazového riadku (Terminal na Macu; Command Prompt na Windows) a skontrolujte nainštalované verzie oboch:

$ node - verzia

v6.11.3

$ npm - verzia

3.10.10

Ak sa vyskytnú chyby, ktoré hovoria, že súbory Node.js alebo NPM sa nenašli, skúste reštartovať aplikáciu shellu alebo reštartovať počítač. Ak to nefunguje, možno budete musieť upraviť svoj $ PATH (Mac a Linux) alebo PATH (Windows) a reštartovať ho znova.

Node.js aj NPM sa zhodujú s zamýšľanými verziami na snímke terminálu vyššie, takže som pripravený ísť ďalej a skutočne niečo vyvíjať s Node.js. Začnime s niečím, čo sa dá ľahko vytvoriť pomocou čistého uzla.

Budete potrebovať editor kódu alebo IDE, najlepšie taký, ktorý podporuje JavaScript a Node.js, ako sú Sublime Text, Visual Studio Code, Brackets, Atom alebo WebStorm.

Príklad Node.js: Jednoduchý webový server

Ak chcete začať skutočne jednoducho, poďme si ukradnúť jednoduchý príklad zo stránky Node.js. Skopírujte kód a vložte ho do svojho editora kódu (používam Visual Studio Code, ale postačí akýkoľvek editor, ktorý ukladá obyčajný text), potom ho uložte ako example.js.

const http = vyžadovať („http“);

const hostname = „127.0.0.1“;

konštantný port = 3000;

const server = http.createServer ((požiadavka, res) => {

res.statusCode = 200;

res.setHeader („Content-Type“, „text / plain“);

res.end („Hello World \ n“);

});

server.listen (port, hostname, () => {

console.log (`Server bežiaci na // $ {hostname}: $ {port} /`);

});

Otvorte shell v adresári, do ktorého ste súbor uložili, a spustite súbor z príkazového riadku:

$ node example.js

Server bežiaci na //127.0.0.1:3000/

V mojom prípade som použil okno Terminál v Visual Studio Code. Takmer ľahko som mohol prejsť na nezávislé okno shellu.

Teraz prejdite na adresu URL uvedenú serverom:

Stlačením klávesu Control-C v termináli zastavíte server uzlov.

Predtým, ako pokračujeme, roztrhajme kód.

const http = vyžadovať („http“);

1. riadok používa vyžadovať, ako načítate moduly v Node.js. Prehlásenie načítava modul Node.js http, ktorý dodáva createServer metóda nazývaná v riadkoch 6 až 10 a počúvaj metóda volaná v riadkoch 12 až 14. Operátor „šípka tuku“ => v riadkoch 6 a 12 je skratka na vytváranie anonymných funkcií Lambda, ktoré sa často používajú v aplikáciách Node.js.

const server = http.createServer ((požiadavka, res) => {

res.statusCode = 200;

res.setHeader („Content-Type“, „text / plain“);

res.end („Hello World \ n“);

});

The res argument k createServer () v riadku 6 sa používa na zostavenie odpovede; the požiadavka argument obsahuje prichádzajúcu požiadavku HTTP, ktorá je v tomto kóde ignorovaná. The znovu odoslať metóda nastaví údaje odpovede na „Hello World \ n“ a povie serveru, že vytváranie odpovede je hotové.

server.listen (port, hostname, () => {

console.log (`Server bežiaci na // $ {hostname}: $ {port} /`);

});

Server uzáver vyrobené spoločnosťou server.listen () metóda povie serveru, aby počúval požiadavky na definovanom hostiteľovi (127.0.0.1, napr. localhost) a porte (3000). Uzáver vyrobený createServer () metóda spracuje požiadavky, keď prídu na definovanom hostiteľovi a porte.

Myšlienka, že uzávery JavaScriptu sú definované ako obslužné rutiny udalostí, je jednou z najjemnejších a najsilnejších častí súboru Node.js a je kľúčom k asynchrónnej neblokujúcej architektúre Node. Node.js skryje svoju slučku udalostí, ale vždy sa vráti k spracovaniu udalostí, ak nie je inak zapojený. Uzávery JavaScriptu navyše využívajú oveľa menej pamäte ako alternatívne spôsoby riešenia viacerých pripojení klientov, ako sú napríklad vytváranie vlákien alebo procesy rozdvojenia.

Príklad Node.js: Webový server s viacerými procesmi

Okrem iba tlače „Hello World“ je uvedený príklad spustený iba v jednom vlákne, čo znamená, že môže používať iba jedno jadro hostiteľského počítača. Sú chvíle, kedy budete mať veľa jadier, ktoré by ste chceli venovať serveru.

Oficiálny príklad klastrového modulu Node ukazuje, ako to napraviť. Rovnako ako predtým ukradneme kód a spustíme ho. Prejdite do dokumentácie klastra Node.js, skopírujte kód, vložte ho do editora kódu alebo IDE a uložte ho ako server.js.

const cluster = require („klaster“);

const http = vyžadovať („http“);

const numCPUs = require („os“). cpus (). dĺžka;

if (cluster.isMaster) {

console.log (`Master $ {process.pid} je spustený`);

// Pracovníci vidlice.

pre (leti = 0; i

cluster.fork ();

}

cluster.on ('exit', (pracovník, kód, signál) => {

console.log (`pracovník $ {worker.process.pid} zomrel`);

});

} else {

// Pracovníci môžu zdieľať akékoľvek pripojenie TCP

// V tomto prípade ide o server HTTP

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

res.writeHead (200);

res.end (`ahoj svet od $ {process.pid} \ n`);

}). počúvať (8000);

console.log (`Pracovník $ {process.pid} spustený`);

}

Keď popravíte uzol server.js z príkazového riadku bude v denníku zobrazené ID procesov pre hlavný a pracovný proces. Pracovníkov by malo byť toľko, koľko má váš počítač logických jadier - osem pre môj MacBook Pro s procesorom Core i7, ktorý má štyri hardvérové ​​jadrá a hypervlákanie.

Ak prechádzate na localhost: 8000 alebo na 127.0.0.1:8000, zobrazí sa „ahoj svet“. Stlačením klávesovej skratky Control-C v okne terminálu zastavíte procesy servera uzla.

const cluster = require („klaster“);

const http = vyžadovať („http“);

const numCPUs = require („os“). cpus (). dĺžka;

Riadky 1 a 2 by z posledného príkladu mali vyzerať dobre. 3. riadok je trochu iný. Namiesto toho, aby ste jednoducho vyžadovali os modul tiež volá cpus () členská funkcia a vráti dĺžku vráteného poľa, čo je počet CPU. Samotné pole a os odkazy na moduly potom nie sú dostupné a môžu sa neskôr stať odpadom zhromaždeným motorom JavaScript.

if (cluster.isMaster) {

console.log (`Master $ {process.pid} je spustený`);

// Pracovníci vidlice.

pre (nech i = 0; i <počet CPU; i ++) {

cluster.fork ();

   }

cluster.on ('exit', (pracovník, kód, signál) => {

console.log (`pracovník $ {worker.process.pid} zomrel`);

   });

}

Riadok 5 spustí blok, ktorý beží iba pre hlavný proces. Zaznamenáva svoj PID, rozdeľuje pracovníka na dostupné CPU a vytvára uzáver na spracovanie a protokolovanie udalostí ukončenia klastra.

} else {

// Pracovníci môžu zdieľať akékoľvek pripojenie TCP

// V tomto prípade ide o server HTTP

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

res.writeHead (200);

res.end („ahoj svet \ n“);

}). počúvať (8000);

console.log (`Pracovník $ {process.pid} spustený`);

Blok začínajúci na riadku 16 riadia iba pracovné procesy. Tento kód by mal vyzerať dobre z predchádzajúceho príkladu: Vytvára webový server, ktorý na každú žiadosť odpovedá „ahoj svet“.

Z výstupu, ktorý sme videli vyššie, je zrejmé, že tento kód bežal na mojom stroji osemkrát, čo vytvorilo osem pracovníkov webového servera zdieľajúcich TCP spojenie nadradeného procesu na porte 8000. Ako ich však systém zdieľa?

Dokumentácia hovorí, že klastrový modul Node.js používa v predvolenom nastavení upravený algoritmus round-robin, s výnimkou systému Windows. Algoritmus je riadený cluster.schedulingPolicy nehnuteľnosť.

Ako vieme, že to funguje? Poďme to vyskúšať. Bude to trvať iba zmena jedného riadku kódu. Upravte riadok 21 na čítanie:

      res.end (`ahoj svet od $ {process.pid} \ n`);

Všimnite si, že musíte nielen pridať od $ {process.pid}, ale musíte tiež zmeniť oddeľovače z jednoduchých úvodzoviek na zadné značky, aby JavaScript mohol v reťazci vykonávať zámenu premenných.

Uložte súbor, zastavte všetky predchádzajúce spustené inštancie a znova ho spustite. Možno si myslíte, že pri každom obnovení klienta prehliadača sa ID vráteného procesu zmení, ale mýlili ste sa. Prehliadač je príliš inteligentný a webovú stránku sme neoznačili ako webovú stránku, ktorej platnosť vyprší. Prehliadač preto pri prvom spustení uloží odpoveď do vyrovnávacej pamäte a bude zobrazovať rovnaké číslo. Urobí to, aj keď vytvoríte viac kariet alebo stránok prehľadávača odkazujúcich na rovnakú adresu URL. Môžete však vidieť, že dispečerský dispečerský dispečing z hlavného počítača funguje spustením viacerých prehliadačov súčasne, v tomto prípade Chrome, Safari a Opera:

Ak poznáte iné webové servery, môžete očakávať, že sa vám zobrazí schéma smerovania požiadaviek a udržiavania trvalého stavu na zachovanie prihlasovacích údajov a prostredia každého používateľa v uzle. Bohužiaľ, uzol to nemá zabudované. Nebojte sa: Na Node.js je postavených veľa webových rámcov, ktoré robia všetko, čo by ste čakali.

Ako nainštalovať modul Node.js s NPM

Ak chcete využiť väčšinu uzlových modulov, v zásade stačí nainštalovať modul z registra NPM, a to buď globálne, alebo do adresára projektu, a potom vyžadovať () zo svojho kódu. Projekt často závisí od viacerých modulov NPM a tento zoznam uchováva vo svojom súbore project.json. Namiesto inštalácie každej závislosti z príkazového riadku ich môžete nainštalovať naraz, často po kontrole projektu z jeho úložiska GitHub:

$

$ cd môj_projekt

$ npm inštalácia

Nie každý balíček NPM funguje presne tak. Niektoré, vrátane React, majú „továrenské“ aplikácie vytvoriť štartovacie aplikácie ako jednu z možností ich inštalácie.

$ npm install -g create-react-app

$ cd ~ / práca

$ create-react-app moja-app

$ cd moja aplikácia /

$ npm štart

Nie je neobvyklé, že sa nástroje inštalujú globálne. Napríklad nástroj Ng pre uhlový príkazový riadok sa inštaluje globálne. Potom ho spustíte lokálne a vytvoríte aplikáciu v priečinku.

$ npm inštalácia -g @ angular / cli

$ cd ~ / práca

$ ng nová moja aplikácia

Angular má inú metódu inštalácie, ktorá vyzerá skôr ako štandardný vzor. To je pre semeno Angular QuickStart:

$ git clone //github.com/angular/quickstart.git rýchly štart

$ cd rýchly štart

$ npm inštalácia

Hovorí to súbor package.json v priečinku rýchleho spustenia npm nainštalovať načítať takmer rovnaký zoznam závislostí ako inštalácia CLI.

Príklad Node.js: webový server Koa

Aj keď React aj Angular sú súčasťou ekosystému Node.js a na vývoj potrebujú Node.js a NPM, nejde konkrétne o rámce Node.js - môžu bežať v prehliadači. Desiatky skutočných rámcov Node.js som zahrnul do časti „Kompletný sprievodca rámcami Node.js“.

Napríklad Express je pôvodný komplexný webový server Node, ktorý spracúva webovú aplikáciu, požiadavky a odpovede HTTP, smerovanie a middleware. Používa novšia možnosť, Koa generátory namiesto spätných volaní pre middleware.

Inštalujete program Koa so štandardným vzorom do priečinka s aplikáciami:

$ npm inštalácia koa

Nižšie je uvedený kód aplikácie Koa „Hello World“, ktorú môžete uložiť a spustiť ako v predchádzajúcich príkladoch.

const Koa = require („koa“);

const app = nový Koa ();

// x-response-time

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

const start = Date.now ();

čakať na next ();

const ms = Date.now () -start;

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

});

// logger

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

const start = Date.now ();

čakať na next ();

const ms = Date.now () -start;

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

});

// odpoveď

app.use (async ctx => {

ctx.body = ‘Hello World’;

});

app.listen (3000);

Je rozdiel medzi generátormi middlewaru, ktoré používa Koa, a spätnými volaniami, ktoré používa Express a ďalšie rámce Node.js. Mnoho implementácií spätného volania jednoducho odovzdá kontrolu cez sériu funkcií, kým sa jedna nevráti, zatiaľ čo Koa poskytuje „po prúde“, potom riadenie prúdi späť „po prúde“.

V príklade vyššie x-response-time „zabalí“ generátor odozvy sčakať na ďalšie () vyhlásenie označujúce hovor. Použitie tejto asynchrónnej funkcie je flexibilnejšie ako explicitné volanie funkcií, pretože umožňuje do sekvencie vložiť ďalší generátor, napríklad webový záznamník medzi časovačom a odpoveďou.

Môžete sa stretnúť so starším kódom Koa, ktorý používa výnos ďalej namiesto čakať na ďalšie (). Rozdiel je v tom, že Koa teraz podporuje funkcie ES2015 a asynchronné funkcie. Tok kontroly predstavuje to isté: Presunie sa k ďalšiemu ovládačovi v reťazci u výnos ďalej volanie a potom sa vráti, keď sú všetky obslužné programy hotové.

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