Node.js Steg för steg Introduktion

Node.js är en fantastisk ny teknik, men om du inte är en JavaScript-utvecklare, kan processen för att bli bekant med den snabbt bli överväldigande. Men det är därför vi är här! Om du vill verkligen lär dig hur du använder Node.js, kommer denna uppsättning artiklar och screencasts att göra tricket.


En introduktion till Node.js


Screencast-transkription

Hej killar, jag heter Christopher Roach, och jag kommer att vara din guide i hela denna serie screencasts på Node.js. I denna serie använder vi Node för att skapa en enkel bloggmotor, som den som blev känd i den populära Ruby on Rails introduktionsvideo. Målet med denna serie är att ge dig tittaren en riktig känsla för hur Node fungerar så att du, även om du arbetar med några av de populära webbutvecklingsramarna där ute, som Express eller Getty, kommer att känna dig bekväm med Nodens inre arbete för att kunna falla ner i sin källa och göra ändringar som passar dina behov efter behov.


Installation

Innan vi kommer in i några detaljer om vad Node är och varför du vill använda den, skulle jag vilja fortsätta och börja med installationen av Node, eftersom det kan ta lite tid innan det är lätt.

Noder är fortfarande väldigt ung, och är i aktiv utveckling, så det är bäst att installera från källan.

Noder är fortfarande väldigt ung, och är i aktiv utveckling, så det är bäst att installera från källan. Med det sagt, Node har väldigt få beroenden, och så är kompilering inte så nära så komplicerad som andra projekt som du kanske har kämpat med tidigare. För att få koden, besök webbplatsen Node.js. Om du rullar ner sidan till nedladdningsdelen hittar du ett par val. Om du har Git installerat kan du göra en klon i förvaret och installera därifrån. Annars finns det en länk till en tarball som du kan ladda ner istället. I den här videon håller jag saker enkelt och installerar från tarballen.

Medan det här hämtas, är det nu dags att nämna att insatser pågår för att tillhandahålla en port i nod för Windows, och det finns instruktioner för installation på Windows för Cygwin eller MinGW. Jag tror att det finns även några binära paket där ute som du kan installera från, men vid tidpunkten för det här skrivandet är den primära miljön Unix och Linux-baserade plattformar. Om du är på en Windows-maskin kan du klicka på länken för byggnadsanvisningar och följa uppsättningen instruktioner där för en Windows-installation, eller du kan installera en version av Linux, till exempel Ubuntu, och installera Noder där.

När det är färdigt ladda ner, helt enkelt unter och pakka ut paketet med tjära -xvf och CD i katalogen den skapade. Först måste vi göra en ./ configure, sedan göra, och slutligen gör installationen. Det kommer att ta lite tid att bygga, så jag låter det springa i bakgrunden och ta tillfället i akt att prata lite mer om Node, och varför det orsakar en sådan rörelse i webbutvecklingsgemenskapen.


Introduktion till Node

Nod är JavaScript på servern.

Så om denna artikel och video är din första introduktion till Node undrar du förmodligen vad det är och vad som gör det värt att lära sig när det redan finns så många andra webbutvecklingsramar där ute att välja mellan. Tja, för att börja med, en anledning du bör bry dig är att Node är JavaScript på servern och låt oss möta det, om du arbetar på webben, älskar det eller hatar det, måste du jobba med JavaScript vid något tillfälle . Att använda JavaScript som ditt backend-språk såväl som för klientsidan betyder en hel del mindre kontextbyte för din hjärna.

Åh, jag vet vad du tänker: "så Node är JavaScript på servern, det är bra, men det har varit andra JavaScript på serverns försök i det förflutna som i grunden bara har blivit fizzlade."

Vad gör Node något annorlunda än resten?

Tja, det korta svaret är: Noder är server-sida JavaScript slutfört rätt. Där andra försök i grunden har varit portar av traditionella MVC-webbramar till JavaScript-språket, är Node något helt annat. Enligt webbplatsen uppträder Node I / O för V8 JavaScript, men vad betyder det egentligen? Låt oss börja med V8.

V8 är Googles snabba JavaScript-implementering som används i Chrome-webbläsaren.

Genom en viss väldigt genial tillämpning av Just-Time-kompilering kan V8 nå hastigheter för JavaScript som gör användarna av andra dynamiska språk, som Python och Ruby, grön av avund. Ta en titt på några av riktmärken och jag tror att du kommer att bli förvånad. V8 JavaScript är uppe med många JVM-baserade språk som Clojure och Java och kompilerade språk, som Go i många fall.

JavaScript: s förmåga att skicka runt stängningar gör händelsebaserad programmering död enkel.

Den andra nyckelfrasen i det uttalandet är händelse I / O. Den här är biggie. När det gäller att skapa en webbserver har du i princip två alternativ att göra när man arbetar med flera samtidiga anslutningsförfrågningar. Den första, som är den mer traditionella vägen som tas av webbservrar som Apache, är att använda trådar för att hantera inkommande anslutningsförfrågningar. Den andra metoden, som Node och några extremt snabba moderna servrar, som Nginx och Thin, använder, är att använda en enda icke-blockerande tråd med en händelsesslinga. Det här är det där beslutet att använda JavaScript verkligen lyser, eftersom JavaScript är utformat för att användas i en enda trådad händelsesspårig miljö: webbläsaren. JavaScript: s förmåga att skicka runt stängningar gör händelsebaserad programmering död enkel. Du ringer i grund och botten bara en funktion för att utföra någon typ av I / O och skickar den till en återuppringningsfunktion och JavaScript skapar automatiskt en stängning, så att det korrekta tillståndet bevaras även efter det att anropsfunktionen sedan länge har gått utanför räckhåll. Men det här är bara teknisk jargong och jag är säker på att du dör för att se en kod i aktion. Jag går fort framåt i slutet av den här installationen, så vi kan börja leka med vår helt nya, nycklade kopia av Node.


Bekräftar installationen

Så, det ser ut att min byggnad äntligen är klar. Jag vill snabbt kontrollera och se till att allt gick bra med installationen. För att göra det, kör helt enkelt nod - version från kommandoraden, och du borde se en indikation på att du kör den senaste versionen av Node som vid denna tidpunkt är version 0.4.5. Om du ser en version skriv ut så kan du vara säker på att allt gick simma och du är redo att skriva din första Node-app. Så, låt oss CD tillbaka till vår hemkatalog och skapa en ny mapp för att hålla allt vårt arbete under denna serie screencasts. Här ska jag bara ringa mina "blog"och låt oss CD in i det för att komma igång.


Node - Server Framework

Till skillnad från andra ramar är Node inte strängt för webbutveckling. Faktum är att du kan tänka på Node som ett ramverk för serverutveckling av något slag. Med Node kan du bygga en IRC-server, en chattserver eller, som vi ser i den här uppsättningen av handledning, en http-server. Så eftersom vi inte kan ha en introduktionskurs utan obligatorisk "Hej världen'ansökan börjar vi med det.


Hej världen

Låt oss skapa en ny fil som heter app.js. Nu kommer Node med en handfull bibliotek för att göra utvecklingen av händelsebaserade servrar enkla. För att använda ett av de tillgängliga biblioteken, inkluderar du helt enkelt sin modul med funktionen för behov. Kravsfunktionen kommer att returnera ett objekt som representerar modulen du passerar in i och du kan fånga det objektet i en variabel. Detta skapar effektivt en namnrymd för funktionaliteten för vilken modul som krävs. För att skapa en HTTP-server, tillhandahåller Node http-biblioteket. Så låt oss gå vidare och kräva det nu och tilldela det returnerade objektet till http-variabeln.

Därefter måste vi faktiskt skapa vår server. Http-biblioteket ger en funktion som heter createServer som tar en återuppringningsfunktion och returnerar ett nytt servernobjekt.

Återuppringningsfunktionen är vad Node kallar en lyssnarfunktion och det kallas av servern närhelst en ny förfrågan kommer in.

När en HTTP-begäran görs kommer lyssnarfunktionen att ringas och objekt som representerar HTTP-förfrågan och svaret kommer att skickas in i funktionen. Vi kan sedan använda responsobjektet inuti vår lyssnarfunktion för att skicka ett svar tillbaka till webbläsaren. För att göra det måste vi först skriva lämpliga HTTP-rubriker, så låt oss ringa writeHead funktion på vårt responsobjekt.

De writeHead funktionen tar ett par argument. Den första är ett heltal värde som representerar statuskoden för begäran som för oss kommer att vara 200, med andra ord, OK. Det andra värdet är ett objekt som innehåller alla de svarhuvuden vi vill ställa in. I det här exemplet ställer vi helt enkelt in innehållstypen till "text / vanlig" för att skicka ut vanlig text.

När vi har satt rubrikerna kan vi skicka data. För att göra det ska du ringa skriva funktionen och skicka in de data som du vill skicka. Här, låt oss ringa skriva funktion på vårt responsobjekt och passera i strängen "Hej världen".

För att faktiskt skicka svaret måste vi signalera till servern att vi är färdiga att skriva svarets kropp. det kan vi göra genom att ringa response.end. De slutet funktionen tillåter oss också att vidarebefordra data, så vi kan förkorta vår serverkod genom att bli av med anropet till skrivfunktionen som vi gjorde tidigare och istället passera i strängen "Hej världen"till slutfunktionen, som så.

Nu när vi har skapat vår server måste vi ställa in den för att lyssna på nya förfrågningar. Det är lätt att göra: ring lyssningsfunktionen på vårt servernobjekt och skicka in ett portnummer för att det ska lyssna på; i det här fallet använder jag porten 8000. Lyssningsfunktionen tar också en valfri andra parameter som är värdnamnens URL, men eftersom vi bara kör det här lokalt kan vi säkert hoppa över den här parametern för nu.

Slutligen, låt oss skriva ut ett meddelande för att meddela att vår server körs och i vilken port den lyssnar på nya förfrågningar. Du kan göra det genom att ringa console.log, precis som vi skulle i webbläsaren och passerar i strängen "Lyssnar på http://127.0.0.1:8000". Där går vi, nu låt oss springa vår app genom att ringa nod och ge den namnet på filen vi vill att den ska genomföras.


REPL

Innan vi tar den här första artikeln och videon i serien till slut, låt vi gå tillbaka till terminalen och snabbt ta en titt på Node's REPL.

En REPL, för de som inte känner till akronyn, står för Read-Eval-Print-Loop, vilket är inget annat än ett enkelt program som accepterar kommandon, utvärderar dem och skriver ut sina resultat.

Det är i grund och botten en interaktiv prompten som gör att du kan göra ganska mycket vad du kan göra med vanlig nod, men utan att behöva skapa en separat fil och det är bra för experiment, så låt oss leka lite med REPL och lära dig en lite mer om Node.

Vi måste först stoppa vår serverapplikation genom att slå Ctrl-C. Kör sedan nod igen, den här gången, utan filnamn. Running node utan några argument kommer att hämta REPL, som vi kan se här genom ändringen av prompten. REPL är mycket enkelt: i princip kan du skriva JavaScript-kod och se utvärderingen av den koden. Trots sin enkelhet har REPL dock få kommandon som kan komma till nytta och du kan titta på var och en av dessa genom att ringa kommandot .help vid prompten. Här (se skärmdump) ser vi en lista med fyra kommandon, varav den första är .ha sönder kommando. Om du skriver någon kod som spänner över flera rader och du upptäcker att du har gjort någon typ av misstag, och behöver bryta ut av vilken anledning som helst, .ha sönder Kommando kan användas för att göra det. Låt oss prova det nu?

Jag ska skapa en funktion här och jag ringer bara den foo och öppna funktionskroppen och slå sedan stiga på. Observera att vi i nästa rad, istället för att se den typiska som är större än symbolen, ser en uppsättning tre punkter eller en ellips. Detta är Nodes sätt att indikera för oss att vi ännu inte har avslutat kommandot på den föregående raden och att Node fortfarande väntar mer från oss innan det utvärderar koden som vi har skrivit in. Så, låt oss fortsätta och lägga till en rad av kod nu: vi ska göra console.log och vi skriver ut namnet på funktionen. Låt oss nu slå in, och märk igen att ellipsens tecken visas igen. Node förväntar sig fortfarande att vi ska slutföra funktionen vid någon tidpunkt. Låt oss nu anta att jag har gjort ett misstag och jag vill bara komma tillbaka till en vanlig prompten. Om jag fortsätter att slå in, fortsätter Node att visa ellipsets tecken. Men, om jag kallar .ha sönder kommando, kommer noden att bryta oss ut ur det befintliga kommandot och tar oss tillbaka till den normala prompten.

Därefter har vi .klar kommando. Den här kommer att rensa vårt nuvarande sammanhang. Så om du har rotat miljön med skapandet av flera variabler och funktioner och du vill ha en ren skiffer, kör du bara .klar kommando och Voila, allt försvinner magiskt.

.utgång och .hjälp

Slutligen finns det .utgång och .hjälp kommandon. De .hjälp kommandot är ganska uppenbart, eftersom det är kommandot vi brukade se listan med kommandon i första hand. De .utgång kommandot är lika uppenbart: du kallar väsentligen bara det för att avsluta REPL, som så.

Så, det täcker ganska mycket all den funktionalitet som REPL tillhandahåller utanför utvärderingen av koden du anger. Men innan vi lämnar REPL helt, skulle jag vilja ta tillfället i akt att diskutera några skillnader och likheter mellan JavaScript i webbläsaren och Node smaken av JavaScript. Så låt oss springa Node igen och hoppa tillbaka till REPL.

Den första skillnaden mellan JavaScript och nod på klientsidan är att i någon webbläsare är någon funktion eller variabel som skapats utanför en funktion eller objekt bunden till det globala räckviddet och tillgängligt överallt. I Node är det dock inte sant. Varje fil, och även REPL, har sin egen modulnivå omfattning som alla globala deklarationer tillhör. Vi ser att detta kommer att användas senare i serien när vi diskuterar moduler och skapar några av våra egna. Men för nu kan du se det aktuella modulobjektet för REPL genom att skriva modulen vid uppmaningen. Observera att det finns ett snabbt attribut begravt några nivåer djupt i vårt modulobjekt? Det här kontrollerar prompten som vi ser när i REPL. Låt oss bara ändra det till något lite annorlunda och se vad som händer. Där har vi en helt ny prompten.

En annan skillnad mellan Node JavaScript och webbläsare JavaScript är att i webbläsaren har du ett globalt fönsterobjekt som i huvudsak binder dig till webbläsarmiljön.

I Node finns det ingen webbläsare, och därmed ingen sådan sak som en fönster objekt. Noder har dock en motsvarighet som hakar dig i arbetsmiljön som är det processobjekt som vi kan se genom att helt enkelt skriva in processen i REPL. Här hittar du flera användbara funktioner och information som listan över miljövariabler.

En likhet som är viktig att nämna här är funktionen setTimeout. Om du är bekant med klientsidan JavaScript har du utan tvekan använt den här funktionen en eller två gånger. Det låter i princip att du ställer in en funktion som ska ringas vid en senare tidpunkt. Låt oss fortsätta och försöka det nu.

> funktion sayHello (sekunder) ? console.log ('Hello') ;? setTimeout (funktion () ? console.log ('World');?, sekunder * 1000) ;? 

Detta kommer att skapa en funktion som när den kallas, skriver ut strängen "Hej" och sedan några sekunder senare skriver strängen "World". Låt oss nu utföra funktionen för att se den i aktion.

> SayHello (2);

Det finns några viktiga idéer att ta märke till här. För det första har Ryan Dahl, skaparen av Node, gjort sitt bästa för att miljön ska bli så bekant som möjligt för alla med JavaScript-upplevelse på klientsidan. Så användningen av namn som setTimeout och setInterval istället för att sova och upprepa, var till exempel ett medvetet beslut att göra serverns miljö matchar, varhelst det är vettigt, webbläsarmiljön.

Det andra konceptet som jag vill att du ska vara medveten om är den riktigt viktiga. Observera att när vi ringer Säg hej, strax efter det att den första strängen skrivits ut, ges kontrollen omedelbart tillbaka till REPL. I tiden mellan när den första strängen skrivs ut och återuppringningsfunktionen körs kan du fortsätta att göra vad som helst som du vill ha vid REPLs prompten. Detta beror på den händelsebaserade naturen hos Node. I Node är det nästan omöjligt att ringa någon funktion som blockerar någon anledning, och detta gäller för setTimeout-funktionen. Låt oss ringa Säg hej funktionen igen, men den här gången går vi över ett något längre timeoutintervall för att ge oss tillräckligt med tid att spela lite och bevisa vår punkt. Jag tror att 10 sekunder ska göra tricket.

Där ser vi den första strängen. Låt oss fortsätta och springa någon egen kod, vad sägs om 2 + 2. Bra vi ser att svaret är 4 och? Det är vår andra sträng som skrivs ut nu.


Slutsats

Så det tar oss till slutet av det första avsnittet i denna serie. Jag hoppas att det här har varit en ganska informativ introduktion till Node för dig, och jag hoppas jag har gjort ett anständigt jobb för att förklara varför det är så spännande, vad det har att erbjuda, och hur roligt och enkelt det är att använda. I nästa avsnitt börjar vi faktiskt skriva några av koden för vår bloggmotor; så jag hoppas att du kommer alla att bli med mig igen när sakerna blir lite fler händer. Vi ses då!