Node.js is een verbazingwekkende nieuwe technologie, maar tenzij je specifiek een JavaScript-ontwikkelaar bent, kan het proces om er kennis mee te maken snel een beetje overweldigend worden. Maar daarom zijn we hier! Als je wilt werkelijk Leer hoe je Node.js gebruikt, deze set van artikelen en screencasts zullen de slag gaan.
Hallo allemaal, mijn naam is Christopher Roach en ik zal je gids zijn in deze serie screencasts op Node.js. In deze serie zullen we Node gebruiken om een eenvoudige blog-engine te maken, zoals degene die beroemd is geworden in de populaire introductievideo van Ruby on Rails. Het doel van deze serie is om u, de kijker, een echt gevoel te geven voor hoe Node werkt, zodat u zich comfortabel genoeg voelt met al uw populaire webontwikkelingsraamwerken zoals Express of Getty. de innerlijke werking van Node om naar de bron te kunnen vallen en indien nodig wijzigingen aan te brengen in uw behoeften.
Voordat we ingaan op enkele details van wat Node is en waarom je het zou willen gebruiken, zou ik graag door willen gaan om ons op weg te helpen met de installatie van Node, omdat het, hoewel supereenvoudig, enige tijd kan kosten..
Knooppunt is nog erg jong en is in actieve ontwikkeling, dus het is het beste om het vanaf de bron te installeren.
Knooppunt is nog erg jong en is in actieve ontwikkeling, dus het is het beste om het vanaf de bron te installeren. Dat gezegd hebbende, Node heeft heel weinig afhankelijkheden, en dus is compilatie lang niet zo gecompliceerd als andere projecten waarmee je in het verleden misschien hebt gevochten. Ga naar de Node.js-website om de code te krijgen. Als u de pagina naar de downloadsectie bladert, vindt u een aantal keuzes. Als je Git hebt geïnstalleerd, kun je een kloon van de repository maken en vanaf daar installeren. Anders is er een link naar een tarball die je in plaats daarvan kunt downloaden. In deze video houd ik dingen eenvoudig en installeer ik vanuit de tarball.
Terwijl dit aan het downloaden is, is het nu een goed moment om te vermelden dat er inspanningen worden geleverd om een poort met Node voor Windows aan te bieden, en er zijn instructies voor de installatie op Windows voor Cygwin of MinGW. Ik geloof dat er zelfs enkele binaire pakketten zijn die je kunt installeren, maar op het moment van dit schrijven is de primaire omgeving gebaseerd op Unix- en Linux-gebaseerde platforms. Als u op een Windows-computer bent, kunt u op de koppeling klikken voor buildinstructies en de instructieset daar voor een Windows-installatie volgen of u kunt een versie van Linux, zoals Ubuntu, installeren en Node daar installeren.
Wanneer het klaar is met downloaden, untar en unzip het pakket met tar -xvf
en CD
in de map die het heeft gemaakt. Eerst moeten we een doen ./ configure
, dan maken
, en tenslotte make install
. Dat gaat wat tijd kosten om te bouwen, dus ik zal dat op de achtergrond laten lopen en deze gelegenheid aangrijpen om wat meer te vertellen over Node, en waarom het zo'n opschudding veroorzaakt in de webontwikkelingsgemeenschap.
Knooppunt is JavaScript op de server.
Dus, als dit artikel en deze video je eerste kennismaking met Node zijn, vraag je je waarschijnlijk af wat het is en wat het de moeite waard maakt om te leren wanneer er al zoveel andere frameworks voor webontwikkeling zijn om uit te kiezen. Om te beginnen, een reden waarom je je zorgen moet maken, is dat Node JavaScript is op de server, en laten we eerlijk zijn, als je op internet werkt, het leuk vindt of het niet leuk vindt, zul je op een gegeven moment met JavaScript moeten werken . Het gebruik van JavaScript als uw backend-taal en voor de client-side betekent een veel minder contextomwisseling voor uw hersenen.
Oh, ik weet wat je denkt: "dus Node is JavaScript op de server, nou dat is geweldig, maar er zijn andere JavaScripts geweest op de serverpogingen in het verleden die in feite net zijn afgebrokkeld."
Nou, het korte antwoord is: Node is JavaScript aan de server eindelijk goed gedaan. Waar andere pogingen feitelijk poorten waren van traditionele MVC-webraamwerken naar de JavaScript-taal, is Node iets heel anders. Volgens zijn website is Node evented I / O voor V8 JavaScript, maar wat betekent dat precies? Laten we beginnen met V8.
V8 is de supersnelle JavaScript-implementatie van Google die wordt gebruikt in hun Chrome-browser.
Via een zeer ingenieuze toepassing van de compilatie "Just in Time", kan V8 snelheden voor JavaScript behalen die gebruikers van andere dynamische talen, zoals Python en Ruby, groen van jaloezie maken. Bekijk enkele van de benchmarks en ik geloof dat je er versteld zult staan van. V8 JavaScript is daar met veel JVM-gebaseerde talen zoals Clojure en Java en gecompileerde talen, zoals Go in veel gevallen.
De mogelijkheid van JavaScript om afsluitingen door te geven maakt het programmeren van gebeurtenissen eenvoudig.
De andere sleutelzin in die verklaring is evented I / O. Deze is de biggie. Als het gaat om het maken van een webserver, heeft u in principe twee keuzes te maken bij het omgaan met meerdere gelijktijdige verbindingsverzoeken. De eerste, die de meer traditionele route is die door webservers zoals Apache wordt gevolgd, is om threads te gebruiken om binnenkomende verbindingsaanvragen af te handelen. De andere methode, die door Node wordt genomen en enkele extreem snelle moderne servers zoals Nginx en Thin, is om een enkele niet-blokkerende thread te gebruiken met een event-loop. Dit is waar de beslissing om JavaScript te gebruiken echt uitblinkt, omdat JavaScript is ontworpen om te worden gebruikt in een op een lus gebaseerde event-loop-gebaseerde omgeving: de browser. De mogelijkheid van JavaScript om afsluitingen door te geven maakt het programmeren van gebeurtenissen eenvoudig. U belt in feite gewoon een functie om een bepaald type I / O uit te voeren en door te geven als een callback-functie en JavaScript maakt automatisch een afsluiting, waarbij u ervoor zorgt dat de juiste status behouden blijft, zelfs nadat de aanroepfunctie al lang buiten bereik is. Maar dit is allemaal gewoon technisch jargon en ik ben er zeker van dat je op het punt staat om een code in actie te zien. Ik ga een stukje verder naar het einde van deze installatie, zodat we kunnen beginnen met spelen met onze gloednieuwe, nieuw geslagen exemplaar van Node.
Dus het ziet ernaar uit dat mijn build eindelijk is voltooid; Ik wil snel controleren en controleren of alles goed is verlopen met de installatie. Om dit te doen, gewoon uitvoeren knooppunt - versie
vanaf de opdrachtregel, en je zou een indicatie moeten zien dat je de nieuwste versie van Node gebruikt, die op dit moment versie 0.4.5 is. Als u een versie ziet afdrukken, kunt u er zeker van zijn dat alles vlekkeloos is verlopen en u bent klaar om uw eerste Node-app te schrijven. Dus laten we CD
terug in onze thuismap en maak een nieuwe map om al ons werk in de loop van deze reeks screencasts te bewaren. Hier ga ik gewoon de mijne bellen 'blog
en laten we CD
daarin om aan de slag te gaan.
In tegenstelling tot andere frameworks, is Node niet strikt voor webontwikkeling. In feite kun je Node zien als een raamwerk voor server-ontwikkeling van welke aard dan ook. Met Node kunt u een IRC-server, een chatserver of, zoals we in deze reeks zelfstudies zien, een http-server bouwen. Dus omdat we geen inleidende tutorial kunnen hebben zonder de verplichte 'Hallo Wereld
'applicatie, we beginnen daarmee.
Laten we een nieuw bestand maken met de naam app.js
. Nu wordt Node geleverd met een handvol bibliotheken om de ontwikkeling van op gebeurtenissen gebaseerde servers eenvoudig te maken. Als u een van de beschikbare bibliotheken wilt gebruiken, neemt u eenvoudig de module op met behulp van de vereiste functie. De vereiste functie retourneert een object dat de module vertegenwoordigt die u erin invoert en u kunt dat object in een variabele vastleggen. Hiermee wordt effectief een naamruimte gemaakt voor de functionaliteit van elke vereiste module. Voor het maken van een HTTP-server biedt knooppunt de http-bibliotheek. Dus laten we doorgaan en vereisen dat nu en het geretourneerde object toewijzen aan de variabele http.
Vervolgens moeten we onze server daadwerkelijk maken. De http-bibliotheek biedt een functie genaamd createServer
die een callback-functie vereist en een nieuw serverobject retourneert.
De callback-functie is wat Node een listener-functie oproept en deze wordt door de server opgeroepen wanneer er een nieuw verzoek binnenkomt.
Telkens wanneer een HTTP-verzoek wordt gedaan, wordt de listenerfunctie aangeroepen en worden objecten die het HTTP-verzoek en antwoord vertegenwoordigen doorgegeven aan de functie. We kunnen dan het responsobject binnen onze luisterfunctie gebruiken om een reactie terug te sturen naar de browser. Om dit te doen, moeten we eerst de juiste HTTP-headers schrijven, dus laten we de writeHead
functie op ons antwoordobject.
De writeHead
functie voert een aantal argumenten. De eerste is een geheel getal dat de statuscode van de aanvraag vertegenwoordigt en die voor ons 200 is, met andere woorden, OK. De tweede waarde is een object dat alle responskoppen bevat die we willen instellen. In dit voorbeeld stellen we eenvoudig het inhoudstype in op 'text / plain' om platte tekst terug te sturen.
Nadat we de headers hebben ingesteld, kunnen we de gegevens verzenden. Om dat te doen, bel je de schrijven
functie en geef de gegevens door die u wilt verzenden. Hier, laten we de schrijven
op ons antwoordobject werken en de string doorgeven "Hallo Wereld
".
Om het antwoord daadwerkelijk te verzenden, moeten we een signaal afgeven aan de server dat we klaar zijn met het schrijven van de inhoud van ons antwoord; we kunnen dat doen door te bellen Response.End
. De einde
Dankzij de functie kunnen we ook gegevens doorgeven, zodat we onze servercode kunnen verkorten door de aanroep van de eerder gemaakte schrijffunctie kwijt te raken en in plaats daarvan de string door te geven "Hallo Wereld
"naar het einde functie, zoals zo.
Nu we onze server hebben gemaakt, moeten we deze instellen om naar nieuwe verzoeken te luisteren. Dat is eenvoudig genoeg om te doen: bel de luisterfunctie op ons serverobject en geef een poortnummer door om te luisteren; in dit geval gebruik ik de poort 8000
. De luisterfunctie neemt ook een optionele tweede parameter die de hostnaam-URL is, maar aangezien we dit lokaal alleen uitvoeren, kunnen we die parameter veilig overslaan voor nu.
Laten we tenslotte een bericht afdrukken om ons te laten weten dat onze server actief is en op welke poort hij naar nieuwe verzoeken luistert. U kunt dat doen door te bellen console.log
, net zoals we in de browser zouden doen en de string doorgeven "Luisteren op http://127.0.0.1:8000
"Daar gaan we nu, laten we onze app uitvoeren door een knooppunt te bellen en de naam door te geven van het bestand dat we willen dat het uitvoert.
Voordat we dit eerste artikel en de video in de serie tot een goed einde brengen, gaan we terug naar de terminal en nemen we snel een kijkje in Node's REPL.
Een REPL, voor degenen die onbekend zijn met het acroniem, staat voor Read-Eval-Print-Loop, wat niets meer is dan een eenvoudig programma dat commando's accepteert, evalueert en hun resultaten afdrukt.
Het is in wezen een interactieve prompt waarmee je vrijwel alles kunt doen wat je kunt doen met een regulier knooppunt, maar zonder de kosten van het maken van een apart bestand, en het is geweldig om te experimenteren, dus laten we een beetje spelen met de REPL en een meer informatie over Node.
We zullen eerst onze servertoepassing moeten stoppen door op te slaan Ctrl-C
. Voer vervolgens het knooppunt opnieuw uit, maar deze keer zonder een bestandsnaam. Running knooppunt zonder enige argumenten zal de REPL naar voren brengen, zoals we hier kunnen zien door de verandering in de prompt. De REPL is heel eenvoudig: je kunt in principe JavaScript-code schrijven en de evaluatie van die code bekijken. Ondanks zijn eenvoud heeft de REPL echter weinig opdrachten die van pas kunnen komen en je kunt een kijkje nemen bij elk van deze door de opdracht .Help op de prompt aan te roepen. Hier (refereer naar screencast) zien we een lijst met vier commando's, waarvan de eerste de is .breken
commando. Als je een code schrijft die meerdere regels beslaat en je ontdekt dat je een soort fout hebt gemaakt en om welke reden dan ook moet breken, .breken
commando kan worden gebruikt om dit te doen. Laten we het nu proberen?
Ik ga hier een functie creëren en ik zal het gewoon noemen foo
en open de hoofdtekst van de functie en druk vervolgens op invoeren
. Merk op dat we op de volgende regel, in plaats van het typische symbool groter dan het symbool te zien, nu een set van drie punten of een ellips zien. Dit is de manier van Node om aan te geven dat we de opdracht op de vorige regel nog niet hebben voltooid en dat Node nog steeds meer van ons verwacht voordat het de code evalueert die we hebben ingetypt. Dus laten we doorgaan en een regel toevoegen van code nu: we zullen doen console.log
en we zullen de naam van de functie afdrukken. Laten we nu op enter drukken, en nogmaals merken dat het ellips-karakter nog een keer wordt weergegeven. Node verwacht nog steeds dat we de functie op een gegeven moment afmaken. Laten we nu aannemen dat ik een fout heb gemaakt en ik wil gewoon teruggaan naar een normale prompt. Als, ik blijf op Enter drukken, blijft Node het ellips karakter weergeven. Maar als ik de .breken
opdracht, Knoop zal ons uit de huidige opdracht breken en brengt ons terug naar de normale prompt.
Vervolgens hebben we de .duidelijk
commando. Deze zal onze huidige context wissen. Dus als je de omgeving vol hebt met het maken van verschillende variabelen en functies en je wilt een schone lei, voer dan gewoon de .duidelijk
commando en Voila, alles verdwijnt magisch.
.Uitgang
en .helpen
Eindelijk is er de .Uitgang
en .helpen
commando's. De .helpen
commando is redelijk voor de hand liggend, omdat het de opdracht is die we gebruikten om de lijst met opdrachten in de eerste plaats te zien. De .Uitgang
commando is even duidelijk: je roept het in feite gewoon om de REPL te verlaten, zoals zo.
Dus dat dekt vrijwel alle functionaliteit die de REPL biedt buiten de evaluatie van de code die u invoert. Maar voordat we de REPL volledig verlaten, wil ik van deze gelegenheid gebruik maken om enkele verschillen en overeenkomsten tussen JavaScript in de browser en de JavaScript-smaak van Node te bespreken. Dus laten we Node opnieuw uitvoeren en teruggaan naar de REPL.
Het eerste verschil tussen client-side JavaScript en Node is dat in de browser elke functie of variabele die buiten een functie of object is gemaakt, gebonden is aan het globale bereik en overal beschikbaar is. In Node is dit echter niet waar. Elk bestand, en zelfs de REPL, heeft zijn eigen niveau op moduleniveau waartoe alle globale verklaringen behoren. We zullen dit later in de serie gebruiken om modules te bespreken en er enkele van te maken. Maar voor nu kunt u het werkelijke moduleobject voor de REPL bekijken door de module bij de prompt in te typen. Merk op dat er een promptattribuut een paar niveaus diep in ons moduleobject begraven ligt? Dit bepaalt de prompt die we zien in de REPL. Laten we dat gewoon veranderen in iets anders en kijken wat er gebeurt. Daar hebben we nu een nieuwe prompt.
Een ander verschil tussen Node JavaScript en JavaScript van de browser is dat u in de browser een globaal vensterobject hebt dat u in essentie verbindt met de browseromgeving.
In Node is er geen browser en dus niet zoiets als een venster
voorwerp. Knooppunt heeft echter een tegenstuk dat je haakt in de werkomgeving die het procesobject is dat we kunnen zien door eenvoudig het proces in de REPL te typen. Hier vindt u verschillende handige functies en informatie, zoals de lijst met omgevingsvariabelen.
Een overeenkomst die belangrijk is om hier te noemen, is de functie setTimeout. Als u bekend bent met client-side JavaScript, heeft u ongetwijfeld deze functie een of twee keer gebruikt. Het laat je in principe een functie instellen om op een later tijdstip te worden aangeroepen. Laten we doorgaan en dat nu proberen.
> function sayHello (seconden) ? console.log ('Hallo') ;? setTimeout (function () ? console.log ('World') ;?, seconds * 1000) ;?
Hiermee wordt een functie gemaakt die, wanneer deze wordt opgeroepen, de tekenreeks 'Hallo' wordt afgedrukt en vervolgens een paar seconden later de tekenreeks 'Wereld' wordt afgedrukt. Laten we de functie nu uitvoeren om deze in actie te zien.
> sayHello (2);
Er zijn een paar belangrijke ideeën om hier rekening mee te houden. Ten eerste heeft Ryan Dahl, de maker van Node, zijn best gedaan om de omgeving zo vertrouwd mogelijk te maken voor iedereen met JavaScript-ervaring aan de kant van de klant. Dus het gebruik van namen zoals setTimeout
en setInterval in plaats van slapen en herhalen, bijvoorbeeld, was een bewuste keuze om de omgeving van de server aan te laten sluiten, waar dat ook logisch is, de browseromgeving.
Het tweede concept waarvan ik wil dat je op de hoogte bent, is het belangrijkste. Merk op dat, wanneer we bellen zeg hallo
, direct nadat de eerste reeks is afgedrukt, wordt de besturing onmiddellijk teruggegeven aan de REPL. In de tijd tussen het moment waarop de eerste reeks wordt afgedrukt en de callback-functie wordt uitgevoerd, kunt u alles blijven doen wat u wilt na de prompt van de REPL. Dit komt door de op gebeurtenissen gebaseerde aard van Node. In Node is het vrijwel onmogelijk om een functie te bellen die om welke reden dan ook blokkeert. Dit geldt voor de functie setTimeout. Laten we onze bellen zeg hallo
opnieuw functioneren, maar laten we dit keer een iets langer time-outinterval doorgeven om ons voldoende tijd te geven om wat rond te spelen en ons punt te bewijzen. Ik geloof dat 10 seconden de slag moeten slaan.
Daar zien we de eerste reeks. Laten we doorgaan en een eigen code maken, hoe zit het 2 + 2
. Geweldig, we zien dat het antwoord is 4
en? daar wordt onze tweede string nu uitgeprint.
Dus dat brengt ons bij het einde van de eerste aflevering in deze serie. Ik hoop dat dit een vrij informatieve introductie is geweest van Node voor jou, en ik hoop dat ik genoeg heb gedaan om uit te leggen waarom het zo spannend is, wat het te bieden heeft en hoe leuk en eenvoudig het is om te gebruiken. In de volgende aflevering zullen we beginnen met het schrijven van een deel van de code voor onze blog-engine; dus ik hoop dat jullie allemaal weer bij me komen als het een beetje meer handen op gaat. Zie je dan!