Programiranje

Vadnica za Node.js: Začnite z uporabo Node.js

Node.js, med platformo izvajalno okolje JavaScript za strežnike in programe, ponuja številne prednosti. Nizka poraba pomnilnika, dobra zmogljivost in velik ekosistem paketov, ki jih je trenutno približno 475.000, so Node.js postale priljubljena izbira za izdelavo spletnih strežnikov, API-jev REST, omrežnih aplikacij v realnem času (npr. Klepet, igre) in celo namizne aplikacije na več platformah.

Če še niste začeli uporabljati Node.js, je morda čas. Oglejte si moj razlagalnik Node.js, če želite izvedeti, kako Node.js deluje čarobno. V tem članku bomo podrobno opisali namestitev Node.js in upravitelja paketov NPM, zavrteli preprost spletni strežnik in uporabili modul grozda Node.js, da izkoristimo več jeder CPU.

Ogledali si bomo tudi namestitev dodatnih modulov Node.js in drugih paketov JavaScript z uporabo upravitelja paketov NPM. In potegnili bomo nogo v uporabo ogrodja Node.js, v tem primeru Koa, da bi ustvarili bolj bogate s funkcijami in prilagodljive strežnike Node.js.

Začnimo.

Kako namestiti Node.js in NPM

Začnite z brskanjem po //nodejs.org:

Fundacija Node.js

Kliknite gumb za prenos LTS (dolgoročna podpora), razen če veste, da potrebujete novo funkcijo v trenutni izdaji. Natančno, kako bo videti preneseni namestitveni program, se lahko med operacijskimi sistemi razlikuje, vendar je na Macu na začetku videti tako:

Ko je namestitev končana, je videti tako:

Zdaj se prepričajte, da sta Node.js in NPM pravilno nameščena. Odprite lupino ukazne vrstice (Terminal v Macu; Ukazni poziv v sistemu Windows) in preverite nameščene različice obeh:

$ vozlišče —verzija

v6.11.3

$ npm - različica

3.10.10

Če se prikažejo napake, ki pravijo, da Node.js ali NPM ni bil najden, poskusite znova zagnati aplikacijo lupine ali znova zagnati računalnik. Če to ne deluje, boste morda morali urediti $ PATH (Mac in Linux) ali PATH (Windows) in znova zagnati.

Node.js in NPM se ujemata z nameravanimi različicami na zgornjem posnetku zaslona Terminal, zato sem pripravljen nadaljevati in dejansko nekaj razviti z Node.js. Začnimo z nečim, kar je enostavno zgraditi s čistim vozliščem.

Potrebovali boste urejevalnik kode ali IDE, po možnosti tak, ki podpira JavaScript in Node.js, kot so Sublime Text, Visual Studio Code, Brackets, Atom ali WebStorm.

Primer Node.js: preprost spletni strežnik

Za začetek preprosto, ukradimo preprost primer s spletnega mesta Node.js. Kopirajte kodo in jo prilepite v urejevalnik kode (uporabljam Visual Studio Code, vendar zadostuje kateri koli urejevalnik, ki shrani navadno besedilo), nato pa jo shranite kot example.js.

const http = require (‘http’);

const ime gostitelja = '127.0.0.1';

const port = 3000;

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

res.statusCode = 200;

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

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

});

server.listen (vrata, ime gostitelja, () => {

console.log (`Strežnik deluje na // $ {ime gostitelja}: $ {vrata} /`);

});

Odprite lupino v imeniku, kamor ste shranili datoteko, in jo zaženite iz ukazne vrstice:

$ vozlišče example.js

Strežnik, ki se izvaja na //127.0.0.1:3000/

V mojem primeru sem uporabil okno Terminal v Visual Studio Code. Skoraj enako enostavno bi lahko prešel na neodvisno okno lupine.

Zdaj poiščite URL, ki ga je navedel strežnik:

Pritisnite Control-C v terminalu, da zaustavite strežnik Node.

Preden nadaljujemo, raztrgamo kodo.

const http = require (‘http’);

Vrstica 1 uporablja zahtevajo, tako naložite module v Node.js. Izjava nalaga http modul Node.js, ki dobavlja createServer metoda, imenovana v vrsticah od 6 do 10 in poslušaj metoda, imenovana v vrsticah od 12 do 14. Operator "maščobna puščica" => v vrsticah 6 in 12 je okrajšava za ustvarjanje anonimnih Lambda funkcij, ki se pogosto uporabljajo v aplikacijah Node.js.

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

res.statusCode = 200;

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

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

});

The res argument za createServer () v vrstici 6 se uporablja za oblikovanje odziva; zahteva argument vsebuje dohodno zahtevo HTTP, ki je v tej kodi prezrta. The ponovno poslati metoda nastavi podatke o odzivu na 'Hello World \ n' in strežniku sporoči, da je vse končano z ustvarjanjem odziva.

server.listen (vrata, ime gostitelja, () => {

console.log (`Strežnik deluje na // $ {ime gostitelja}: $ {vrata} /`);

});

Strežnik zaključek ki jih proizvaja server.listen () metoda sporoči strežniku, naj posluša zahteve na določenem gostitelju (127.0.0.1, npr. localhost) in vratih (3000). Zapora, ki jo je ustvaril createServer () metoda obravnava zahteve, ko pridejo na definiranega gostitelja in vrata.

Zamisel, da so zapiranja JavaScript opredeljena kot obdelovalci dogodkov, je eden najbolj prefinjenih in najmočnejših delov Node.js in je ključna za Ninhovo sinhrono neblokirajočo arhitekturo. Node.js skrije svojo zanko dogodkov, vendar se vedno vrne na obdelavo dogodkov, kadar ni drugače vključen. Poleg tega zapiranja JavaScript uporabljajo veliko manj pomnilnika kot alternativni načini za obdelavo več odjemalskih povezav, kot so drstenje niti ali procesi vilic.

Primer Node.js: večprocesni spletni strežnik

Zgornji primer poleg tiskanja »Hello World« deluje le v eni niti, kar pomeni, da lahko uporablja samo eno jedro gostiteljskega računalnika. Včasih boste imeli veliko jeder, ki bi jih radi namenili strežniku.

Uradni primer modula gruče Node prikazuje, kako to popraviti. Kot prej bomo ukradli kodo in jo zagnali. Poiščite dokumentacijo gruče Node.js, kopirajte kodo, jo prilepite v urejevalnik kode ali IDE in jo shranite kot server.js.

const cluster = require ('gruča');

const http = require (‘http’);

const numCPUs = require (‘os’). cpus (). length;

if (cluster.isMaster) {

console.log (`Izvaja se glavni $ {process.pid});

// Viličarji.

za (leti = 0; i

cluster.fork ();

}

cluster.on (‘exit’, (worker, code, signal) => {

console.log (`delavec $ {worker.process.pid} umrl`);

});

} še {

// Delavci lahko delijo katero koli povezavo TCP

// V tem primeru gre za strežnik HTTP

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

res.writeHead (200);

res.end (`pozdravljen svet iz $ {process.pid} \ n`);

}). poslušaj (8000);

console.log ("Delavec $ {process.pid} je začel");

}

Ko izvršite vozlišče server.js iz vaše ukazne vrstice bo dnevnik prikazal ID-je procesov za glavni in delovni proces. Delavcev bi moralo biti toliko, kolikor ima vaš računalnik logičnih jeder - osem za moj MacBook Pro s procesorjem Core i7, ki ima štiri strojna jedra in hiper-nit.

Če brskate po localhost: 8000 ali 127.0.0.1:8000, bo prikazan napis »hello world«. V oknu terminala lahko pritisnete Control-C, da zaustavite procese strežnika Node.

const cluster = require ('gruča');

const http = require (‘http’);

const numCPUs = require (‘os’). cpus (). length;

Vrstici 1 in 2 bi se iz zadnjega primera morale poznati. Vrstica 3 je nekoliko drugačna. Namesto da bi preprosto zahtevali os modul, pokliče tudi cpus () član in vrne dolžino vrnjene matrike, kar je število CPU-jev. Sama matrika in os Povezava modula je nato nedosegljiva in je morda smeti, ki jih pozneje zbere mehanizem JavaScript.

if (cluster.isMaster) {

console.log (`Izvaja se glavni $ {process.pid});

// Viličarji.

za (naj i = 0; i <število procesorjev; i ++) {

cluster.fork ();

   }

cluster.on (‘exit’, (worker, code, signal) => {

console.log (`delavec $ {worker.process.pid} umrl`);

   });

}

Vrstica 5 začne blok, ki se izvaja samo za glavni postopek. Zabeleži svoj PID, se razširi na delavca na razpoložljivi CPU in ustvari zapiralo za obdelavo in beleženje izhodnih dogodkov gruče.

} še {

// Delavci lahko delijo katero koli povezavo TCP

// V tem primeru gre za strežnik HTTP

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

res.writeHead (200);

res.end ('pozdravljen svet \ n');

}). poslušaj (8000);

console.log ("Delavec $ {process.pid} je začel");

Blok, ki se začne v vrstici 16, vodijo samo delovni procesi. Ta koda bi se iz prejšnjega primera morala poznati: Ustvari spletni strežnik, ki se na vsako zahtevo odzove s pozdravljenim svetom.

Iz izhodišč, ki smo jih videli zgoraj, je razvidno, da se je ta koda na mojem računalniku zagnala osemkrat in ustvarila osem delavcev spletnega strežnika, ki si delijo povezavo TCP nadrejenega procesa na vratih 8000. Toda kako si sistem deli obremenitev med njimi?

V dokumentaciji piše, da modul grozda Node.js privzeto uporablja spremenjeni algoritem zaokroževanja, razen v sistemu Windows. Algoritem nadzoruje cluster.schedulingPolicy lastnine.

Kako vemo, da to deluje? Preizkusimo. Spremenili boste le eno vrstico kode. Uredite vrstico 21, da se glasi:

      res.end (`pozdravljen svet iz $ {process.pid} \ n`);

Upoštevajte, da ne samo, da morate dodati od $ {process.pid}, vendar morate tudi ločila spremeniti iz enojnih narekovajev v povratne kljukice, tako da bo JavaScript izvedel zamenjavo spremenljivk v nizu.

Shranite datoteko, ustavite kateri koli prejšnji izvajani primerek in ga znova zaženite. Morda mislite, da se bo vsakič, ko osvežite odjemalca brskalnika, vrnjeni ID postopka spremenil, vendar se boste zmotili. Brskalnik je preveč pameten in nismo označili spletne strani kot tiste, ki poteče, zato bo brskalnik ob prvem zagonu shranil odgovor in še naprej prikazoval isto številko. To bo storilo, tudi če ustvarite več zavihkov ali strani brskalnika, ki kažejo na isti URL. Vendar lahko vidite, da krožno pošiljanje iz glavne enote deluje tako, da hkrati zažene več brskalnikov, v tem primeru Chrome, Safari in Opera:

Če ste seznanjeni z drugimi spletnimi strežniki, boste morda pričakovali, da boste videli shemo za zahteve za usmerjanje in za vzdrževanje trajnega stanja, da se v Node ohrani prijava in okolje vsakega uporabnika. Žal, Node nima tega vgrajenega. Ne bojte se: Na vrhu Node.js so zgrajeni številni spletni okviri, ki naredijo vse, kar bi pričakovali.

Kako namestiti modul Node.js z NPM

Če želite uporabiti večino modulov Node, v bistvu preprosto namestite modul iz registra NPM bodisi globalno bodisi v imenik projekta in nato zahtevaj () iz vaše kode. Projekt je pogosto odvisen od več modulov NPM in ta seznam hrani v svoji datoteki project.json. Namesto da namestite vsako odvisnost iz ukazne vrstice, jih lahko namestite vse hkrati, pogosto po ogledu projekta iz njegovega skladišča GitHub:

$

$ cd moj_projekt

$ npm namestitev

Ne deluje vsak paket NPM točno tako. Nekateri, vključno z Reactom, imajo "tovarniške" aplikacije ustvariti začetne aplikacije kot eno od možnosti namestitve.

$ npm install -g create-response-app

$ cd ~ / delo

$ create-response-app my-app

$ cd my-app /

$ npm start

Ni neobičajno, da se orodja namestijo globalno. Na primer, orodje Ng z ukazno vrstico se namesti globalno. Nato ga zaženete lokalno, da ustvarite aplikacijo v mapi.

$ npm install -g @ angular / cli

$ cd ~ / delo

$ ng nove moje aplikacije

Zdi se, da ima Angular še en način namestitve, ki je bolj podoben standardnemu vzorcu. To velja za seme Angular QuickStart:

$ git clone //github.com/angular/quickstart.git hitri začetek

hitri začetek $ cd

$ npm namestitev

Datoteka package.json v mapi s hitrim zagonom pove npm namestite za pridobitev skoraj enakega seznama odvisnosti kot namestitev CLI.

Primer Node.js: spletni strežnik Koa

Čeprav sta React in Angular del ekosistema Node.js in za razvoj potrebujeta Node.js in NPM, nista posebej ogrodja Node.js - lahko delujeta v brskalniku. V "Popolnem vodniku po ogrodjih Node.js" sem zajel na desetine dejanskih okvirov Node.js.

Na primer, Express je prvotni dokončani spletni strežnik Node, ki obdeluje spletno aplikacijo, HTTP zahteve in odgovore, usmerjanje in vmesno programsko opremo. Novejša možnost, Koa, uporablja generatorji namesto povratnih klicev za vmesno programsko opremo.

Koa namestite s standardnim vzorcem v mapo aplikacije:

$ npm namestite koa

Spodaj je koda za aplikacijo Koa "Hello World", ki jo lahko shranite in zaženete kot v prejšnjih primerih.

const Koa = zahteva ("koa");

const app = novo Koa ();

// čas odziva x

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

const start = Date.now ();

počakajte na naslednji ();

const ms = Date.now () -start;

ctx.set ('Čas odziva X', `$ {ms} ms`);

});

// zapisovalnik

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

const start = Date.now ();

počakajte na naslednji ();

const ms = Date.now () -start;

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

});

// odgovor

app.use (async ctx => {

ctx.body = 'Hello World';

});

app.listen (3000);

Obstaja razlika med generatorji vmesne programske opreme, kot jih uporablja Koa, in povratnimi klici, kot jih uporabljajo Express in drugi okviri Node.js. Številne izvedbe povratnih klicev preprosto prenašajo nadzor skozi vrsto funkcij, dokler se ena ne vrne, medtem ko Koa daje "navzdol", nato nadzor teče nazaj "gorvodno".

V zgornjem primeru x-odzivni čas "ovije" odzivni generator z znakompočakaj naslednje () izjava, ki označuje klic. Uporaba te asinhrone funkcije je bolj prilagodljiva kot eksplicitni klici funkcij, saj olajša vstavljanje drugega generatorja v zaporedje, na primer spletnega zapisovalnika med časovnikom in odzivom.

Morda boste naleteli na starejšo kodo Koa, ki uporablja donos naslednji namesto počakaj naslednje (). Razlika je v tem, da Koa zdaj podpira ES2015 in async funkcije. Tok nadzora je enak: premakne se na naslednjega vodnika v verigi pri donos naslednji klic in se nato vrne, ko so vsi upravljavci končani.

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