Programavimas

„Node.js“ pamoka: pradėkite naudoti „Node.js“

„Node.js“ - tai įvairių platformų „JavaScript“ vykdymo laiko aplinka, skirta serveriams ir programoms, teikia daug privalumų. Mažas atminties naudojimas, geras našumas ir didelė paketų ekosistema, kurių šiuo metu yra apie 475 000, padarė „Node.js“ populiarų pasirinkimą kuriant interneto serverius, REST API, realaus laiko tinklo programas (pvz., Pokalbius, žaidimus) ir netgi kelių platformų darbalaukio programos.

Jei dar nepradėjote naudotis „Node.js“, galbūt atėjo laikas. Norėdami sužinoti, kaip „Node.js“ veikia savo magiją, patikrinkite mano „Node.js“ paaiškintoją. Šiame straipsnyje mes įdiegsime „Node.js“ ir „NPM“ paketų tvarkyklę, sukursime paprastą žiniatinklio serverį ir naudosime „Node.js“ sankaupos modulį, kad galėtume pasinaudoti kelių procesoriaus branduolių pranašumais.

Mes taip pat nagrinėsime, kaip įdiegti papildomus „Node.js“ modulius ir kitus „JavaScript“ paketus, naudojant „NPM“ paketų tvarkyklę. Mes sukursime pirštą naudodami „Node.js“ sistemą, šiuo atveju „Koa“, kad sukurtume daugiau funkcijų turinčius ir lanksčius „Node.js“ serverius.

Pradėkime.

Kaip įdiegti „Node.js“ ir „NPM“

Pradėkite naršydami //nodejs.org:

Fondas „Node.js“

Spustelėkite mygtuką, norėdami atsisiųsti LTS (ilgalaikis palaikymas), nebent žinote, kad jums reikia naujos funkcijos dabartiniame leidime. Tiksliai, kaip atsisiųsta diegimo programa atrodys, gali skirtis skirtingos operacinės sistemos, tačiau „Mac“ sistemoje pradžioje tai atrodo taip:

Baigus diegti, jis atrodo taip:

Dabar turėtumėte įsitikinti, kad „Node.js“ ir „NPM“ tinkamai įdiegtos. Atidarykite komandų eilutės apvalkalą („Mac“ terminalas; „Windows“ komandų eilutė) ir patikrinkite įdiegtas abiejų versijas:

$ mazgas - versija

v6.11.3

$ npm - versija

3.10.10

Jei gaunate klaidų, sakančių, kad „Node.js“ ar „NPM“ nerastas, pabandykite iš naujo paleisti „shell“ programą arba iš naujo paleisti kompiuterį. Jei tai neveikia, gali tekti redaguoti $ PATH („Mac“ ir „Linux“) arba PATH („Windows“) ir vėl paleisti iš naujo.

Tiek „Node.js“, tiek „NPM“ atitinka numatytas versijas aukščiau esančioje „Terminal“ ekrano kopijoje, todėl esu pasirengęs judėti toliau ir iš tikrųjų ką nors plėtoti su „Node.js“. Pradėkime nuo to, ką lengva sukurti naudojant gryną mazgą.

Jums reikės kodo rengyklės arba IDE, geriausiai palaikančios „JavaScript“ ir „Node.js“, pvz., „Sublime Text“, „Visual Studio Code“, „Skliausteliuose“, „Atom“ ar „WebStorm“.

„Node.js“ pavyzdys: paprastas žiniatinklio serveris

Norėdami pradėti tikrai paprastai, pavogime paprastą pavyzdį iš „Node.js“ svetainės. Nukopijuokite kodą ir įklijuokite jį į savo kodo rengyklę (aš naudoju „Visual Studio Code“, bet pakaks bet kurio redaktoriaus, kuris išsaugo paprastą tekstą), tada išsaugokite jį kaip pavyzdį.js.

const http = reikalauti (‘http’);

const hostname = ‘127.0.0.1’;

konst portas = 3000;

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

res.statusCode = 200;

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

res.end (‘Sveikas pasaulis \ n’);

});

server.listen (prievadas, pagrindinio kompiuterio vardas, () => {

console.log (`Serveris veikia adresu // $ {hostname}: $ {port} /`);

});

Atidarykite apvalkalą kataloge, kuriame išsaugojote failą, ir paleiskite failą iš savo komandinės eilutės:

$ node example.js

Serveris veikia //127.0.0.1:3000/

Mano atveju „Visual Studio Code“ naudojau langą „Terminalas“. Beveik taip pat lengvai galėjau persijungti į nepriklausomą apvalkalo langą.

Dabar naršykite prie serverio nurodyto URL:

Norėdami sustabdyti mazgo serverį, terminale paspauskite „Control-C“.

Prieš tęsdami, išardykime kodą.

const http = reikalauti (‘http’);

1 eilutė naudoja reikalauti, kaip jūs įkeliate modulius į „Node.js“. Pareiškimas įkelia Node.js http modulį, kuris tiekia createServer metodas vadinamas 6 - 10 eilutėmis ir klausyk metodas vadinamas 12–14 eilutėmis. „Riebalų rodyklės“ operatorius => 6 ir 12 eilutėse yra anoniminių „Lambda“ funkcijų, kurios dažnai naudojamos „Node.js“ programose, kūrimas.

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

res.statusCode = 200;

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

res.end (‘Sveikas pasaulis \ n’);

});

res argumentas createServer () 6 eilutėje naudojamas atsakui sukurti; reikalauti argumente yra gaunama HTTP užklausa, kuri šiame kode nepaisoma. Persiūsti metodas nustato atsakymo duomenis į „Sveikas pasaulis \ n“ ir praneša serveriui, kad viskas padaryta kuriant atsakymą.

server.listen (prievadas, pagrindinio kompiuterio vardas, () => {

console.log (`Serveris veikia adresu // $ {hostname}: $ {port} /`);

});

Serveris uždarymas pagaminta server.listen () metodas nurodo serveriui klausytis užklausų apibrėžtame pagrindiniame kompiuteryje (127.0.0.1, pvz., localhost) ir prievade (3000). Uždarymas pagamintas createServer () metodas tvarko užklausas, kai jos patenka į apibrėžtą pagrindinį kompiuterį ir prievadą.

Idėja, kad „JavaScript“ uždarymai apibrėžiami kaip įvykių apdorotojai, yra viena subtiliausių ir galingiausių „Node.js“ dalių ir yra raktas į „Node“ asinchroninę neužblokuojančią architektūrą. „Node.js“ slepia įvykių ciklą, tačiau visada grįžta prie įvykių tvarkymo, kai kitaip neįsitraukia. Be to, „JavaScript“ uždarymai naudoja daug mažiau atminties nei alternatyvūs kelių klientų ryšių valdymo būdai, pvz., Neršto gijos ar šakiniai procesai.

„Node.js“ pavyzdys: kelių procesų tinklo serveris

Be tik „Hello World“ spausdinimo, aukščiau pateiktas pavyzdys veikia tik vienoje temoje, o tai reiškia, kad jis gali naudoti tik vieną pagrindinio kompiuterio šerdį. Kartais yra daugybė branduolių, kuriuos norėtumėte skirti serveriui.

Oficialus „Node“ sankaupos modulio pavyzdys rodo, kaip tai išspręsti. Kaip ir anksčiau, mes pavogsime kodą ir paleisime jį. Naršykite iki „Node.js“ sankaupos dokumentacijos, nukopijuokite kodą, įklijuokite jį į savo kodo rengyklę arba IDE ir išsaugokite kaip server.js.

const cluster = reikalauti (‘klasteris’);

const http = reikalauti (‘http’);

const numCPUs = reikalauti (‘os’). cpus (). ilgis;

jei (cluster.isMaster) {

console.log („Master $ {process.pid} veikia“);

// Šakių darbininkai.

už (leti = 0; t

klasteris.šakis ();

}

cluster.on (‘exit’, (darbuotojas, kodas, signalas) => {

console.log (`darbuotojas $ {darbuotojas.process.pid} mirė`);

});

} Kitas {

// Darbuotojai gali bendrinti bet kokį TCP ryšį

// Šiuo atveju tai yra HTTP serveris

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

res.writeHead (200);

res.end (`labas pasaulis nuo $ {process.pid} \ n`);

}). klausytis (8000);

console.log (`Darbuotojas $ {process.pid} pradėtas`);

}

Kai įvykdai mazgas server.js iš komandinės eilutės žurnale bus rodomi pagrindinio ir darbininko procesų ID. Darbuotojų turėtų būti tiek, kiek jūsų kompiuteryje yra loginių branduolių - aštuoni mano „MacBook Pro“ su savo „Core i7“ procesoriumi, kuriame yra keturios aparatinės šerdys ir hipersriegis.

Jei naršote „localhost“: 8000 arba „127.0.0.1:8000“, pamatysite „labas pasaulis“. Norėdami sustabdyti mazgo serverio procesus, terminalo lange galite paspausti „Control-C“.

const cluster = reikalauti (‘klasteris’);

const http = reikalauti (‘http’);

const numCPUs = reikalauti (‘os’). cpus (). ilgis;

1 ir 2 eilutės turėtų atrodyti pažįstamos iš paskutinio pavyzdžio. 3 eilutė šiek tiek skiriasi. Užuot paprasčiausiai reikalavęs os modulis, jis taip pat vadina CPU () nario funkcija ir pateikia grąžinto masyvo ilgį, kuris yra centrinių procesorių skaičius. Pats masyvas ir os tada modulio nuoroda nepasiekiama ir vėliau gali būti „JavaScript“ variklio surinkta šiukšlė.

jei (cluster.isMaster) {

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

// Šakių darbininkai.

for (tegul i = 0; i <procesorių skaičius; i ++) {

klasteris.šakis ();

   }

cluster.on (‘exit’, (darbuotojas, kodas, signalas) => {

console.log (`darbuotojas $ {darbuotojas.process.pid} mirė`);

   });

}

5 eilutė pradeda bloką, kuris vykdomas tik pagrindiniam procesui. Jis registruoja savo PID, išsijungia darbuotojui už kiekvieną galimą procesorių ir sukuria uždarymą, kad būtų galima tvarkyti ir užregistruoti sankaupos išėjimo įvykius.

} Kitas {

// Darbuotojai gali bendrinti bet kokį TCP ryšį

// Šiuo atveju tai yra HTTP serveris

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

res.writeHead (200);

res.end (‘labas pasaulis \ n’);

}). klausytis (8000);

console.log (`Darbuotojas $ {process.pid} pradėtas`);

Blokas, prasidedantis 16 eilutėje, vykdomas tik darbuotojo procesų. Šis kodas turėtų atrodyti pažįstamas iš ankstesnio pavyzdžio: jis sukuria žiniatinklio serverį, kuris į visas užklausas atsako „labas pasaulis“.

Iš išvesties, kurią matėme aukščiau, aišku, kad šis kodas mano kompiuteryje paleistas aštuonis kartus, sukurdamas aštuonis tinklo serverio darbuotojus, kurie 8000 prievade dalijasi pirminio proceso TCP ryšiu. Bet kaip sistema pasidalija apkrova tarp jų?

Dokumentuose sakoma, kad „Node.js“ sankaupos modulis pagal numatytuosius nustatymus naudoja modifikuotą „round-robin“ algoritmą, išskyrus „Windows“. Algoritmą valdo klasteris.planavimasPolitika nuosavybė.

Iš kur mes žinome, kad tai veikia? Išbandykime. Reikės pakeisti tik vieną kodo eilutę. Redaguokite 21 eilutę skaityti:

      res.end (`labas pasaulis nuo $ {process.pid} \ n`);

Atkreipkite dėmesį, kad jūs turite ne tik pridėti nuo $ {process.pid}, bet jūs taip pat turite pakeisti ribotuvus iš vienos kabutės į užpakalines erkes, kad „JavaScript“ atliktų kintamą eilutės pakeitimą.

Išsaugokite failą, sustabdykite bet kurį ankstesnį veikiantį egzempliorių ir paleiskite jį dar kartą. Galite pagalvoti, kad kiekvieną kartą atnaujinant naršyklės klientą grąžintas proceso ID pasikeis, bet klystate. Naršyklė yra per daug išmani ir mes nepažymėjome tinklalapio, kurio galiojimo laikas baigiasi, todėl naršyklė atsakymą išsaugos talpykloje pirmą kartą paleidus ir toliau rodys tą patį numerį. Tai padarys, net jei sukursite kelis naršyklės skirtukus ar puslapius, nukreipiančius į tą patį URL. Tačiau matote, kad pagrindinio kompiuterio siuntimas iš pagrindinio kompiuterio veikia vienu metu paleidžiant kelias naršykles, šiuo atveju „Chrome“, „Safari“ ir „Opera“:

Jei esate susipažinę su kitais žiniatinklio serveriais, galite tikėtis pamatyti užklausų nukreipimo ir nuolatinės būsenos palaikymo schemą, kad išsaugotumėte kiekvieno vartotojo prisijungimą ir aplinką „Node“. Deja, „Node“ neturi to integruoto. Nebijokite: „Node.js“ viršuje yra daugybė žiniatinklio sistemų, kurios daro viską, ko tikitės.

Kaip įdiegti „Node.js“ modulį su NPM

Norėdami naudoti daugumą „Node“ modulių, iš esmės tiesiog įdiekite modulį iš NPM registro visame pasaulyje arba projekto kataloge, tada reikalauti () tai iš savo kodo. Dažnai projektas priklauso nuo kelių NPM modulių ir saugo tą sąrašą savo project.json faile. Užuot įdiegę kiekvieną priklausomybę iš komandinės eilutės, galite jas įdiegti visas vienu metu, dažnai patikrinę projektą iš „GitHub“ saugyklos:

$

$ cd my_project

$ npm įdiegti

Ne kiekvienas NPM paketas veikia būtent taip. Kai kurie, įskaitant „React“, turi „gamyklines“ programas sukurti starterio programos kaip viena iš jų diegimo parinkčių.

$ npm įdiegti -g sukurti-reaguoti-programą

$ cd ~ / darbas

$ sukurti-reaguoti-programa mano programa

$ cd mano programa /

$ npm pradžia

Nėra neįprasta, kad įrankiai įdiegiami visame pasaulyje. Pavyzdžiui, „Angular“ komandinės eilutės įrankis Ng įdiegiamas visame pasaulyje. Tada paleidžiate jį vietoje, kad sukurtumėte programą aplanke.

$ npm įdiegti -g @ angular / cli

$ cd ~ / darbas

$ ng nauja mano programa

Kampinis turi kitą diegimo metodą, kuris labiau panašus į standartinį modelį. Tai „Angular QuickStart“ sėklai:

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

$ cd greitas paleidimas

$ npm įdiegti

Paprasto paleidimo aplanke nurodomas failas „package.json“ npm įdiegti gauti beveik tą patį priklausomybių sąrašą kaip ir CLI diegimas.

„Node.js“ pavyzdys: „Koa“ žiniatinklio serveris

Nors „React“ ir „Angular“ yra „Node.js“ ekosistemos dalis, joms kurti reikalingi „Node.js“ ir „NPM“, jie nėra specialiai „Node.js“ pagrindai - jie gali veikti naršyklėje. Aš apžvelgiau dešimtis tikrųjų „Node.js“ rėmelių „Išsamiame„ Node.js “karkasų vadove“.

Pavyzdžiui, „Express“ yra originalus „Node“ tinklo serveris, tvarkantis žiniatinklio programą, HTTP užklausas ir atsakymus, nukreipimą ir tarpinę programinę įrangą. Naujesnė parinktis „Koa“ naudoja generatoriai vietoj tarpinių programų skambučių.

Programos aplanke įdiegiate „Koa“ su standartiniu šablonu:

$ npm įdiegti koa

Žemiau pateikiamas „Koa“ „Hello World“ programos kodas, kurį galite išsaugoti ir paleisti kaip ir ankstesniuose pavyzdžiuose.

const Koa = reikalauti (‘koa’);

const programa = nauja Koa ();

// x-response-time

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

const start = Data.dabar ();

laukti kito ();

const ms = Date.now () -start;

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

});

// medkirtis

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

const start = Data.dabar ();

laukti kito ();

const ms = Date.now () -start;

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

});

// atsakymas

app.use (async ctx => {

ctx.body = ‘Sveikas pasaulis’;

});

app.listen (3000);

Yra skirtumas tarp tarpinės programinės įrangos generatorių, kuriuos naudoja „Koa“, ir atgalinių skambučių, kuriuos naudoja „Express“ ir kitos „Node.js“ sistemos. Daugelis atgalinio skambučio funkcijų paprasčiausiai perduoda valdymą per daugybę funkcijų, kol viena grįžta, o „Koa“ duoda „pasroviui“, tada valdymas grįžta „prieš srovę“.

Ankstesniame pavyzdyje x atsako laikas „apgaubia“ atsako generatorių sulaukti kito () kvietimą žymintis pareiškimas. Šios asinchroninės funkcijos naudojimas yra lankstesnis nei aiškių funkcijų iškvietimų, nes tai leidžia į seką lengvai įterpti kitą generatorių, pavyzdžiui, žiniatinklio kaupiklį tarp laikmačio ir atsako.

Galite susidurti su senesniu „Koa“ kodu, kuris naudojamas derlius kitas vietoj laukti kito (). Skirtumas tas, kad „Koa“ dabar palaiko ES2015 ir asinchronines funkcijas. Valdymo srautas yra tas pats dalykas: jis pereina prie kito grandinės tvarkytojo derlius kitas skambinti, tada grįžta, kai visi tvarkytojai bus baigti.

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