Node.js
![]() | |
---|---|
Sākotnējais autors | Raiens Dāls |
Izstrādātājs | Node.js Izstrādātāji,Joyent,atbalstītāji |
Sākotnējā versija | 2009. gada 27. maijs[1] |
Stabilā versija | 9.5.0 & 8.9.4 (LTS) / 2018. gada 31. janvāris[2]& 2018. gada 2. janvāris[3] |
Izstrādes statuss | Aktīvs |
Progr. valoda | C,C++,JavaScript |
Operētājsistēma | Linux,macOS,Solaris,FreeBSD,OpenBSD,Microsoft Windows,webOS,NonStop OS |
Veids | notikumu virzītatīklošana |
Licence | MIT[4] |
Repozitorijs |
![]() |
Node.jsiratvērtā pirmkoda,starpplatformuJavaScriptreāllaika vide,kas ļauj izpildītJavaScriptkoduservera pusē.
VēsturiskiJavaScripttika izmantots klienta pusē,JavaScriptrakstīto kodu ievietojot tīmekļa lappusesHTMLkodā, un to klienta pusē lietotāja pārlūkprogrammā darbinājaJavaScriptdzinis.Node.jsļaujJavaScriptrakstītu kodu darbināt servera pusē, lai veidotu dinamisku tīmekļa lappušu saturu. TādējādiNode.jsir kļuvusi par "JavaScriptvisur "paradigmas pamatelementu, ļaujot tīmekļa lietotnes servera un klienta daļu rakstīt vienā programmēšanas valodā.
Node.jsirnotikumu virzītaarhitektūra ar asinhronuievadizvadi.Šādas arhitektūras mērķis ir caurlaides spējas optimizēšana tīmekļa lietotnēs ar daudzām ievades un izvades darbībām, kā arī reāllaika tīmekļa lietotnēs (piemēram, reāllaika sakaru programmas un pārlūkprogrammas spēles).
Lai gan ar ".js"apzīmēJavaScriptfailu paplašinājumu, nosaukums "Node.js"šajā kontekstā neattiecas un kādu atsevišķu failu, bet ir tieši produkta nosaukums.
Projektu vada fondsNode.js Foundation,un atbalstaLinux Foundationkopīgo projektu programma.
Vēsture
[labot šo sadaļu|labot pirmkodu]![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Ryan_Dahl.jpg/160px-Ryan_Dahl.jpg)
Pirmoreiz idejuJavaScriptizmantot servera pusē 1996. gadā realizējaNetscapeproduktāLiveWire Pro Web,bet tas neguva plašu popularitāti.
2009. gadā ASV uzņēmumaJoyentprogrammētājs Raiens Dāls (Ryan Dahl) aizdomājās parFlickrfailu lejupielādes progresa joslas darbības nepilnībām.[5]Vēlāk viņš stāstīja:[6]"Pārlūkprogramma nezin, cik daudz ir lejupielādēts, tāpēc tā regulāri veic pieprasījumus serverim. Tas ir līdzīgi kā tad, kad klausāties citu personu runājam: jūs taču nepārtraukti nesūtat viņam signālu, lai paziņotu, ka klausāties viņu; jūs vienkārši saņemat informāciju. Citiem vārdiem sakot, cilvēku komunikācija nav kā programmēšanas valoda. Tā notiek haotiski, bez sinhronizācijas, un tā nav paralēla — man nav jāgaida, kamēr jūs atbildēsit, pirms atkal varu sarunāties."
Tajā laikā tīmekļa serveriem bija sarežģīti apstrādāt vairākus pieprasījumus vienlaicīgi. Nebloķējošāstīkla ligzdasbija viens no risinājumiem. Dāls aizdomājās: "Kas būtu, ja viss būtu nebloķēts? Kas būtu, ja nevajadzētu gaidīt katru ievadi un izvadi?"
Tā 2009. gada sākumā Dālam radās ideja apvienotJavaScriptar nebloķējošu ievadizvadi un novērtēt, vai no tā būtu sanācis kaut kas noderīgs. Viņš iedvesmojās noRubyMongreltīmekļa servera un nesen izlaistāGoogle ChromeunV8.[7]Četru līdz sešu mēnešu laikā Dāls izveidoja pirmo risinājumu, ko demonstrēja EiropasJSConfkonferencē 2009. gada 8. novembrī. Dāla projektu sāka sponsorēt uzņēmumsJoyent,kurā viņš strādāja.
2010. gada janvārī tika izlaistsNode.jsvidespakotnes pārvaldnieksnmp.
Sākotnēji notikumu cilpas mehānismam tika izmantota Marka Lēmana (Marc Lehmann) bibliotēkalibev.Tā kā tā darbojās tikaiUnixvidē, tad to nevarēja izmantotWindowssistēmās.JoyentarMicrosoftatbalstu izstrādāja jaunu bibliotēkulibuv,kas bijalibevabstrakcija un varēja izmantotMicrosoftIOCP.[8]Node.jsversija 0.5.0 arlibuvtika izlaista 2011. gada jūlijā.
2012. gada janvārī Dāls atgāja no projekta vadības, par projekta pārvaldītāju izvirzotNode.jslīdzizstrādātāju unnpmautoru Īzaku Šliteru (Isaac Schlueter). 2014. gada janvārī Šliters paziņoja, ka projektu vadīs Timotijs Fonteins (Timothy J. Fontaine).
2014. gada decembrī Fedors Indutni (Fedor Indutny) sāka projektuio.js,kas bijaNode.jsatzarojums.Joyentiekšējā vadības konflikta dēļio.jstika veidots kā projekts ar atvērtu vadību ar atsevišķu tehnisko komiteju. Atšķirībā noNode.js,autori plānoja uzturētio.jsarGoogle V8jaunākajiem laidieniem.
2015. gada februārī tika paziņots par nodomu izveidot neitrālu organizācijuNode.js Foundation.Līdz 2015. gada jūnijamNode.jsunio.jskopienas nobalsoja darboties kopāNode.js Foundationpaspārnē. 2015. gada septembrīNode.js v0.12unio.js v3.3apvienojās versijāNode v4.0.TāNode.jsienesaV8 ES6iespējas, kā arī ilgtermiņa atbalsta laidienu ciklu. 2016. gadāio.jsvietne izstrādātājiem rekomendēja pāriet uzNode.js,jo turpmāk vairs nav plānotiio.jslaidieni.
Pārskats
[labot šo sadaļu|labot pirmkodu]Node.jsļauj veidottīmekļa serverusun tīklošanas programmatūru, izmantojotJavaScriptvalodu. Moduļi nodrošina failsistēmas ievadizvadi, tīklošanu (DNS,HTTP,TCP,TLS/SSLvaiUDP),binārosdatus (buferus),kriptogrāfijasfunkcijas, datu plūsmas un citas kodola funkcijas.Node.jsmoduļi izmanto API, kas veidoti, lai vienkāršotu servera programmu rakstīšanu.
Node.jsvar darbināt uzLinux,macOS,Solaris,FreeBSD,OpenBSD,Microsoft Windows(vecākām versijām nepieciešamsCygwin),webOS,NonStop OSserveriem.Node.jsvar rakstīt arī citās valodās, ko var kompilēt uzJavaScript,piemēram,CoffeeScript,DartvaiTypeScript.
Lielākā atšķirība no citām servera puses programmēšanas vidēm, piemēramPHP,ir tāda, kaPHPvairums funkciju bloķē citu darbību izpildi līdz funkcijas pabeigšanai (komandas izpildās tikai pēc tam, kad iepriekšējā ir pabeigta),[9]betNode.jsneko nebloķē (komandas izpildāslaiksakritīgivai pat paralēli) un izmantoatzvana(callback) tehniku, lai signalizētu par pabeigšanu vai kļūmi.
Node.jslīdzīgas sistēmas irRubyEvent MachineunPythonTwisted,betNode.jsnotikumu virzītaismodelis ir nedaudz attīstītāks. To veido notikumu cilpa kā izpildlaika konstrukcija, nevis kā bibliotēka. Citās sistēmās, lai startētu notikumu cilpu, notiek bloķēšanas izsaukums.Nodevienkārši ieiet notikumu cilpā pēc ievades skripta izpildes. Savukārt iziet no notikumu cilpas tad, kad nav vairs neviena atzvana skripta, ko izpildīt.[10]
Kamēr notikumu cilpa apstrādā asinhronos uzdevumus,Node.jsvar turpināt normāli darboties un neapgrūtināt ar procesu smagu pacelšanu. Tas padaraNodeļoti labu tukšgaitas darbībā, kad nekas nav jādara, tā vietā, lai pastāvīgi pieprasītu papildu informāciju. Tādējādi arNode.jsvar veidot lietojumprogrammas, kas mērogojamas miljoniem lietotāju. Turklāt notikuma cilpa netērē daudz atmiņas.[11]
Pavedienošana
[labot šo sadaļu|labot pirmkodu]Node.jsdarbojas ar vienupavedienu.Tam tiek izmantota bibliotēkalibuv,kas, savukārt, izmantopavedienu pūlu,kas ir atbildīgs par nebloķējošām asinhronām ievadizvades operācijām. Viena pavediena kopīgošana starp visiem pieprasījumiem, kas izmantonovērotāja modeli,ir paredzēta, lai veidotu ļoti vienlaicīgas lietotnes, kur jebkurai funkcijai, kas veic ievadizvadi, jāizmanto atzvans.
Šīs viena pavediena pieejas negatīvais aspekts ir tāds, kaNode.jsneatļauj vertikālu mērogošanu, ja palielina datora procesora kodolu skaitu. To var risināt ar papildu procesu pārvaldnieka moduli, piemēram,Cluster,StrongLoop Process Manager,pm2,Forever.Izstrādātāji var arī palielināt noklusēto pavedienu skaitulibuvpavedienu pūlā; šos pavedienus servera operētājsistēma, visticamāk, sadalīs pa vairākiem kodoliem.
Paralēlus uzdevumusNode.jsapstrādā ar pavedienu pūlu. Galvenais pavediens norāda funkcijām nosūtīt uzdevumus koplietojamo uzdevumu rindā, kur pavedieni pavedienu pūlā tiek izvilkti un izpildīti. Dabiski bezbloķējošas sistēmas funkcijas, piemēram, tīklošana, pārvēršas par kodola puses bezbloķējošām tīkla ligzdām, savukārt dabiski bloķējošas sistēmas funkcijas, piemēram, failu ievadizvade, tiek palaistas bloķēšanas veidā savā pavedienā. Kad pavediens pavedienu pūlā aizpilda uzdevumu, tas informē par šo galveno pavedienu, kas, savukārt, pamostas un izpilda reģistrēto atzvanīšanas kodu.
Koda piemērs
[labot šo sadaļu|labot pirmkodu]HTTPservera izveidošana un palaišana. Serveris atbild arHello, world!:
// Ielādē moduli http
consthttp=require('http');
// Izveido serveri ar pieprasījumu apstrādātāju
constserver=http.createServer((req,res)=>{
// Atbildes kods un http galvene
res.writeHead(200,{
'Content-Type':'text/plain; charset=UTF-8'
});
res.end('Hello world!');
});
// Palaižam tīmekļa serveri
server.listen(2002,'127.0.0.1',()=>{
console.log('Serveris palaists uz http://127.0.0.1:2002/');
});
Atsauces un piezīmes
[labot šo sadaļu|labot pirmkodu]- ↑«node-v0.x-archive on GitHub».Skatīts: 2014. gada 2. augusts.
- ↑«Node.js 9 ChangeLog».Skatīts: 2017. gada 15. novembris.
- ↑«Node.js 8 ChangeLog».Skatīts: 2017. gada 6. decembris.
- ↑«node/LICENSE at master».GitHub.Node.js Foundation. 2017. gada 12. jūlijs.Skatīts: 2017. gada 12. jūlijs.
- ↑Laurent Orsini.«What You Need To Know About Node.js».readwrite, 2013-11-07. Arhivēts nooriģināla,laiks: 2018-10-15.Skatīts:2016-01-22.
- ↑Amber Harris.«The Birth of Node: Where Did it Come From? Creator Ryan Dahl Shares the History».Devops Angle, 2012. gada 1. aprīlis. Arhivēts nooriģināla,laiks: 2014. gada 18. oktobrī.Skatīts: 2013. gada 26. oktobris.
- ↑Node.js and V8 history[novecojusi saite]December 19, 2013 in Node.js
- ↑An Introduction to libuvArhivēts2018. gada 12. martā,Wayback Machinevietnē. nikhilm.github.io
- ↑PHPvairākpavedienošananav pieejama bāzes līmenī, bet tā ir iespējama arPEARpthreadspaplašinājumu
- ↑About Node.jsArhivēts2018. gada 28. janvārī,Wayback Machinevietnē. nodejs.org
- ↑What You Need To Know About Node.jsArhivēts2017. gada 13. decembrī,Wayback Machinevietnē. Hack, November 7, 2013
Ārējās saites
[labot šo sadaļu|labot pirmkodu]- Node.jsNode.js Foundation