Programování

Výukový program Node.js: Začínáme s Node.js

Node.js, běhové prostředí JavaScriptu pro různé platformy pro servery a aplikace, nabízí mnoho výhod. Nízké využití paměti, dobrý výkon a velký ekosystém balíků, kterých je v současné době asi 475 000, učinily z Node.js oblíbenou volbu pro vytváření webových serverů, REST API, síťových aplikací v reálném čase (např. Chat, hry) a dokonce multiplatformní desktopové aplikace.

Pokud jste s Node.js ještě nezačali, možná je čas. Podívejte se na můj vysvětlovač Node.js, abyste zjistili, jak Node.js funguje. V tomto článku projdeme instalací Node.js a správce balíčků NPM, roztočením jednoduchého webového serveru a použitím modulu clusteru Node.js, abychom využili výhod více jader CPU.

Podíváme se také na instalaci dalších modulů Node.js a dalších balíčků JavaScriptu pomocí správce balíčků NPM. A ponoříme se do používání rámce Node.js, v tomto případě Koa, abychom vytvořili více funkčních a flexibilních serverů Node.js.

Začněme.

Jak nainstalovat Node.js a NPM

Začněte procházením stránky //nodejs.org:

Node.js Foundation

Klikněte na tlačítko pro stažení LTS (dlouhodobá podpora), pokud nevíte, že v aktuální verzi potřebujete nějakou novou funkci. Přesně to, jak bude stažený instalační program vypadat, se může u různých operačních systémů lišit, ale v počítačích Mac to na začátku vypadá takto:

Po dokončení instalace to vypadá takto:

Nyní byste se měli ujistit, že jsou Node.js i NPM nainstalovány správně. Otevřete prostředí příkazového řádku (terminál v systému Mac; příkazový řádek v systému Windows) a zkontrolujte nainstalované verze obou:

$ uzel - verze

v6.11.3

$ npm - verze

3.10.10

Pokud se zobrazí chyby, které říkají, že Node.js nebo NPM nebyly nalezeny, zkuste restartovat aplikaci shellu nebo restartovat počítač. Pokud to nefunguje, možná budete muset upravit svůj $ PATH (Mac a Linux) nebo PATH (Windows) a restartovat znovu.

Jak Node.js, tak NPM odpovídají zamýšleným verzím na screenshotu Terminálu výše, takže jsem připraven jít dál a skutečně něco vyvinout pomocí Node.js. Začněme něčím, co se snadno vytvoří pomocí čistého uzlu.

Budete potřebovat editor kódu nebo IDE, nejlépe ten, který podporuje JavaScript a Node.js, jako je Sublime Text, Visual Studio Code, Brackets, Atom nebo WebStorm.

Příklad Node.js: Jednoduchý webový server

Abychom mohli začít opravdu jednoduše, pojďme si ukradnout jednoduchý příklad ze stránky Node.js. Zkopírujte kód a vložte jej do editoru kódu (používám Visual Studio Code, ale postačí jakýkoli editor, který ukládá prostý text), poté jej uložte jako example.js.

const http = require („http“);

const název_hostitele = „127.0.0.1“;

const port = 3000;

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

res.statusCode = 200;

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

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

});

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

console.log (`Server běží na // $ {název_hostitele}: $ {port} /`);

});

Otevřete prostředí v adresáři, kam jste soubor uložili, a spusťte soubor z příkazového řádku:

$ node example.js

Server běží na //127.0.0.1:3000/

V mém případě jsem použil okno Terminál v Visual Studio Code. Téměř stejně snadno jsem mohl přejít na nezávislé okno shellu.

Nyní přejděte na adresu URL uvedenou serverem:

Stisknutím klávesy Control-C v terminálu zastavíte server uzlů.

Než budeme pokračovat, roztrhneme kód.

const http = require („http“);

Řádek 1 používá vyžadovat, což je způsob, jakým načítáte moduly v Node.js. Příkaz načítá modul Node.js http, který dodává createServer metoda volaná v řádcích 6 až 10 a poslouchat metoda volaná na řádcích 12 až 14. Operátor „tučné šipky“ => v řádcích 6 a 12 je zkratka pro vytvoření anonymních funkcí Lambda, které se často používají v aplikacích Node.js.

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

res.statusCode = 200;

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

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

});

The res argument k createServer () v řádku 6 se používá k vytvoření odpovědi; the požadavek Argument obsahuje příchozí požadavek HTTP, který je v tomto kódu ignorován. The přeposlat metoda nastaví data odezvy na „Hello World \ n“ a řekne serveru, že je vše hotové při vytváření odpovědi.

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

console.log (`Server běží na // $ {název_hostitele}: $ {port} /`);

});

Server uzavření produkoval server.listen () metoda řekne serveru, aby naslouchal požadavkům na definovaném hostiteli (127.0.0.1, např. localhost) a portu (3000). Uzávěr vyrobený společností createServer () metoda zpracovává požadavky, když přicházejí na definovaném hostiteli a portu.

Myšlenka, že uzávěry JavaScriptu jsou definovány jako obslužné rutiny událostí, je jednou z nejjemnějších a nejúčinnějších částí Node.js a je klíčem k asynchronní neblokující architektuře Node. Node.js skryje svou smyčku událostí, ale vždy se vrátí ke zpracování událostí, pokud není jinak aktivní. Uzávěry JavaScriptu navíc využívají mnohem méně paměti než alternativní způsoby manipulace s více klientskými připojeními, jako jsou například vytváření podprocesů nebo procesy rozvětvení.

Příklad Node.js: Webový server s více procesy

Kromě pouze tisku „Hello World“ je výše uvedený příklad spuštěn pouze v jednom vlákně, což znamená, že může používat pouze jedno jádro hostitelského počítače. Jsou chvíle, kdy budete mít mnoho jader, které byste chtěli věnovat serveru.

Oficiální příklad modulu clusteru Node ukazuje, jak to opravit. Stejně jako dříve ukradneme kód a spustíme jej. Přejděte do dokumentace klastru Node.js, zkopírujte kód, vložte jej do editoru kódu nebo IDE a uložte jej jako server.js.

const cluster = require („cluster“);

const http = require („http“);

const numCPUs = require („os“). cpus (). délka;

if (cluster.isMaster) {

console.log (`Master $ {process.pid} je spuštěn`);

// Pracovníci vidlice.

pro (leti = 0; i

cluster.fork ();

}

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

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

});

} else {

// Pracovníci mohou sdílet jakékoli připojení TCP

// V tomto případě se jedná o server HTTP

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

res.writeHead (200);

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

}). poslouchat (8000);

console.log (`Pracovník $ {process.pid} spuštěn`);

}

Když popravíte uzel server.js z příkazového řádku bude protokol zobrazovat ID procesu pro hlavní a pracovní procesy. Mělo by být tolik pracovníků, kolik má váš počítač logická jádra - osm pro můj MacBook Pro s procesorem Core i7, který má čtyři hardwarová jádra a hypervlákání.

Pokud procházíte na localhost: 8000 nebo na 127.0.0.1:8000, zobrazí se „hello world“. Stisknutím klávesy Ctrl-C v okně terminálu zastavíte procesy serveru Node.

const cluster = require („cluster“);

const http = require („http“);

const numCPUs = require („os“). cpus (). délka;

Řádky 1 a 2 by z posledního příkladu měly vypadat dobře. Řádek 3 je trochu jiný. Místo toho, abyste jednoduše požadovali os modul také volá cpus () členské funkce a vrátí délku vráceného pole, což je počet CPU. Samotné pole a os odkazy na moduly jsou poté nedostupné a mohou být později odstraněny odpadky shromážděnými modulem JavaScript.

if (cluster.isMaster) {

console.log (běží „Master $ {process.pid});

// Pracovníci vidlice.

for (let i = 0; i <num CPU; i ++) {

cluster.fork ();

   }

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

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

   });

}

Řádek 5 spustí blok, který běží pouze pro hlavní proces. Přihlásí svůj PID, rozdělí se na pracovníka podle dostupného CPU a vytvoří uzávěr pro zpracování a protokolování událostí opuštění klastru.

} else {

// Pracovníci mohou sdílet jakékoli připojení TCP

// V tomto případě se jedná o server HTTP

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

res.writeHead (200);

res.end („ahoj svět \ n“);

}). poslouchat (8000);

console.log (`Worker $ {process.pid} started`);

Blok začínající na řádku 16 je spuštěn pouze pracovními procesy. Tento kód by měl z předchozího příkladu vypadat povědomě: Vytváří webový server, který na jakýkoli požadavek odpoví „ahoj svět.“

Z výstupu, který jsme viděli výše, je zřejmé, že tento kód běžel na mém počítači osmkrát a vytvořil tak osm pracovníků webového serveru, kteří sdíleli připojení TCP nadřazeného procesu na portu 8000. Jak ale systém sdílí zátěž mezi nimi?

Dokumentace říká, že modul clusteru Node.js používá ve výchozím nastavení upravený algoritmus round-robin, s výjimkou Windows. Algoritmus je řízen cluster.schedulingPolicy vlastnictví.

Jak víme, že to funguje? Pojďme to vyzkoušet. Bude to trvat pouze změna jednoho řádku kódu. Upravit řádek 21 ke čtení:

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

Všimněte si, že musíte nejen přidat od $ {process.pid}, ale musíte také změnit oddělovače z jednoduchých uvozovek na zadní značky, aby JavaScript provedl substituci proměnných na řetězci.

Uložte soubor, zastavte všechny předchozí spuštěné instance a spusťte jej znovu. Možná si myslíte, že při každém obnovení klienta prohlížeče se ID vráceného procesu změní, ale mýlili jste se. Prohlížeč je příliš chytrý a web jsme neoznačili jako web, jehož platnost vyprší, takže prohlížeč při prvním spuštění uloží odpověď do mezipaměti a bude zobrazovat stejné číslo. Bude to dělat, i když vytvoříte více karet nebo stránek prohlížeče, které odkazují na stejnou adresu URL. Můžete však vidět, že dispečerský dispečink z hlavního počítače funguje spuštěním více prohlížečů současně, v tomto případě Chrome, Safari a Opera:

Pokud jste obeznámeni s jinými webovými servery, můžete očekávat, že uvidíte schéma pro požadavky na směrování a pro udržení trvalého stavu, aby se zachovalo přihlašovací údaje a prostředí každého uživatele v uzlu. Bohužel, Node to nemá vestavěné. Nebojte se: Na Node.js je postaveno mnoho webových frameworků, které dělají vše, co byste očekávali.

Jak nainstalovat modul Node.js pomocí NPM

Chcete-li využít většinu uzlových modulů, v podstatě stačí nainstalovat modul z registru NPM, globálně nebo v adresáři projektu, a poté vyžadovat() to z vašeho kódu. Projekt často závisí na více modulech NPM a udržuje tento seznam ve svém souboru project.json. Namísto instalace každé závislosti z příkazového řádku je můžete nainstalovat všechny najednou, často po kontrole projektu z jeho úložiště GitHub:

$

$ cd my_project

$ npm instalace

Ne každý balíček NPM funguje přesně tak. Některé, včetně React, mají „tovární“ aplikace vytvořit spouštěcí aplikace jako jednu z možností jejich instalace.

$ npm install -g create-react-app

$ cd ~ / práce

$ create-react-app moje aplikace

$ cd moje aplikace /

$ npm start

Není neobvyklé, že se nástroje instalují globálně. Například nástroj úhlového příkazového řádku Ng se instaluje globálně. Poté jej spustíte místně a vytvoříte aplikaci ve složce.

$ npm install -g @ angular / cli

$ cd ~ / práce

$ ng nová moje aplikace

Angular má jinou metodu instalace, která vypadá spíše jako standardní vzor. To je pro Angular QuickStart seed:

$ git clone //github.com/angular/quickstart.git rychlý start

$ cd rychlý start

$ npm instalace

Řekne soubor package.json ve složce pro rychlý start NPM instalace načíst téměř stejný seznam závislostí jako instalace CLI.

Příklad Node.js: Webový server Koa

Zatímco React i Angular jsou součástí ekosystému Node.js a pro vývoj potřebují Node.js a NPM, nejedná se konkrétně o Node.js framework - mohou běžet v prohlížeči. Desítky skutečných frameworků Node.js jsem popsal v „Kompletním průvodci k frameworkům Node.js“.

Například Express je původní upřesněný webový server Node, který zpracovává webovou aplikaci, požadavky a odpovědi HTTP, směrování a middleware. Využívá novější možnost, Koa generátory místo zpětných volání pro middleware.

Nainstalujete Koa se standardním vzorem uvnitř složky aplikace:

$ npm instalace koa

Níže je uveden kód aplikace Koa „Hello World“, kterou můžete uložit a spustit jako v předchozích příkladech.

const Koa = require („koa“);

const app = nový Koa ();

// x-response-time

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

const start = Date.now ();

čekat na next ();

const ms = Date.now () -start;

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

});

// záznamník

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

const start = Date.now ();

čekat na next ();

const ms = Date.now () -start;

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

});

// Odezva

app.use (async ctx => {

ctx.body = ‚Hello World ';

});

app.listen (3000);

Existuje rozdíl mezi generátory middlewaru, které používá Koa, a zpětnými voláními, jak je používají Express a další rámce Node.js. Mnoho implementací zpětného volání jednoduše předává kontrolu řadou funkcí, dokud se jeden nevrátí, zatímco Koa poskytuje „downstream“, pak řízení teče zpět „upstream“.

Ve výše uvedeném příkladu x-response-time „zabalí“ generátor odezvy sčekat na další () prohlášení označující hovor. Použití této asynchronní funkce je flexibilnější než explicitní volání funkcí, protože usnadňuje vložení dalšího generátoru do sekvence, například webového záznamníku mezi časovačem a odpovědí.

Můžete narazit na starší kód Koa, který používá výnos dále namísto čekat na další (). Rozdíl je v tom, že Koa nyní podporuje funkce ES2015 a asynchronní funkce. Tok kontroly se rovná stejné věci: Přesune se na dalšího psovoda v řetězci u výnos dále volání a poté se vrátí, když jsou všechny obslužné rutiny hotové.

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