Event-driven programmering kan vara överväldigande för nybörjare, vilket kan göra Node.js svårt att komma igång med. Men låt inte det avskräcka dig; I den här artikeln kommer jag att lära dig några av grunderna i Node.js och förklara varför det har blivit så populärt.
Om du behöver hjälp kan du alltid kontakta en av JavaScript-experterna på Envato Studio. Oavsett om du behöver en buggfixad eller en ny funktion läggs till, hittar du en erfaren JavaScript-utvecklare som hjälper dig.
Vi har byggt en komplett guide för att hjälpa dig att lära dig JavaScript, oavsett om du precis börjat som webbutvecklare eller vill utforska mer avancerade ämnen.
För att börja använda Node.js måste du först förstå skillnaderna mellan Node.js och traditionella skriptmiljöer på serversidan (t.ex.: PHP, Python, Ruby, etc).
Node.js använder en modularkitektur för att förenkla skapandet av komplexa applikationer.
Chansen är bra att du är bekant med asynkron programmering; det är ju "A" i Ajax. Varje funktion i Node.js är asynkron. Därför kommer allt som normalt blockerar tråden i stället att exekveras i bakgrunden. Det här är det viktigaste att komma ihåg om Node.js. Om du till exempel läser en fil på filsystemet måste du ange en återuppringningsfunktion som körs när läsoperationen har slutförts.
Node.js är bara en miljö - vilket betyder att du måste göra allt själv. Det finns inte en standard HTTP-server, eller någon server för den delen. Detta kan vara överväldigande för nya användare, men utbetalningen är en webbapplikation med hög prestanda. Ett skript hanterar all kommunikation med klienterna. Detta minskar avsevärt antalet resurser som används av ansökan. Till exempel, här är koden för en enkel Node.js-applikation:
var jag, a, b, c, max; max = 1000000000; var d = Date.now (); för (i = 0; i < max; i++) a = 1234 + 5678 + i; b = 1234 * 5678 + i; c = 1234 / 2 + i; console.log(Date.now() - d);
Och här är motsvarande som skrivs i PHP:
$ a = null; $ b = null; $ c = null; $ i = null; $ max = 1000000000; $ start = mikrotime (true); för ($ i = 0; $ i < $max; $i++) $a = 1234 + 5678 + $i; $b = 1234 * 5678 + $i; $c = 1234 / 2 + $i; var_dump(microtime(true) - $start);
Låt oss nu titta på referensnumren. I följande tabell visas svarstiderna i millisekunder för dessa två enkla applikationer:
Antal iterationer | Node.js | PHP |
100 | 2,00 | 0,14 |
10'000 | 3,00 | 10,53 |
1'000'000 | 15,00 | 1119,24 |
10'000'000 | 143,00 | 10621,46 |
1'000'000'000 | 11118,00 | 1036272,19 |
Jag utförde de två programmen från kommandoraden så att ingen server skulle fördröja appens körning. Jag sprang varje test tio gånger och i genomsnitt resultat. PHP är särskilt snabbare med en mindre mängd iterationer, men den fördelen löses snabbt som antalet iterationer ökar. När allt är sagt och gjort är PHP 93% långsammare än Node.js!
Node.js är snabb, men du måste lära dig några saker för att kunna använda det ordentligt.
Node.js använder en modularkitektur för att förenkla skapandet av komplexa applikationer. Moduler är relaterade till bibliotek i C eller enheter i Pascal. Varje modul innehåller en uppsättning funktioner relaterade till modulens "ämne". Till exempel, http modulen innehåller funktioner som är specifika för HTTP. Node.js ger några kärnmoduler ur rutan för att hjälpa dig att komma åt filer på filsystemet, skapa HTTP- och TCP / UDP-servrar och utföra andra användbara funktioner.
Inklusive en modul är lätt; ring bara fordra()
funktion, så här:
var http = kräver ('http');
Node.js är bara en miljö; du måste göra allt själv.
De fordra()
funktionen returnerar referensen till den angivna modulen. I fallet med denna kod, en hänvisning till http modulen lagras i http
variabel.
I ovanstående kod passerade vi namnet på en modul till fordra()
fungera. Detta gör att noden söker efter en node_modules mapp i vår programkatalog och leta efter http modul i den mappen. Om Node inte hittar node_modules mapp (eller http modulen inom den), ser den sedan igenom den globala modulens cache. Du kan också ange en faktisk fil genom att skicka en relativ eller absolut väg, som så:
var myModule = kräver ('./ myModule.js');
Moduler är inkapslade kodstycken. Koden inom en modul är mestadels privat - vilket betyder att de funktioner och variabler som definieras inom dem endast är tillgängliga från insidan av modulen. Du kan dock avslöja funktioner och / eller variabler som ska användas utanför modulen. För att göra det, använd export
objekt och befolka dess egenskaper och metoder med de kodstycken som du vill avslöja. Tänk på följande modul som ett exempel:
var PI = Math.PI; exports.area = function (r) return PI * r * r; ; exports.circumference = function (r) return 2 * PI * r; ;
Denna kod skapar en PI
variabel som endast kan nås med kod som finns i modulen; Det är inte tillgängligt utanför modulen. Därefter skapas två funktioner på export
objekt. Dessa funktioner är tillgängliga utanför modulen eftersom de är definierade på export
objekt. Som ett resultat, PI
är helt skyddad mot yttre störningar. Därför kan du vara säker på det område()
och omkrets()
kommer alltid att uppträda som de borde (så länge som ett värde tillhandahålls för r
parameter).
Node är en JavaScript-miljö som körs i Googles V8 JavaScript-motor. Som sådan bör vi följa de bästa praxis som vi använder för utveckling av kundsidor. Vi bör till exempel undvika att sätta någonting i det globala räckviddet. Det är dock inte alltid möjligt. Det globala räckviddet i Node är GLOBAL
(i motsats till fönster
i webbläsaren), och du kan enkelt skapa en global variabel av funktion genom att utelämna var
sökord, så här:
globalVariabel = 1; globalFunction = function () ...;
Återigen bör globals undvikas när det är möjligt. Så var försiktig och kom ihåg att använda var
när deklarerar en variabel.
Naturligtvis behöver vi installera Node innan vi kan skriva och exekvera en app. Installation är rakt fram, om du använder Windows eller OS X; Nodejs.org hemsida erbjuder installatörer för de operativsystemen. För Linux, använd någon pakethanterare. Öppna din terminal och skriv:
sudo apt-get uppdatering sudo apt-get installera nod
eller:
sudo aptitude update sudo aptitude install node
Node.js finns i sidrepositioner; Du kan behöva lägga till dem i din källlista:
sudo echo deb http://ftp.us.debian.org/debian/sid main> /etc/apt/sources.list.d/sid.list
Men var medveten om att installera sidpaket på äldre system kan bryta ditt system. Var försiktig och ta bort /etc/apt/sources.list.d/sid.list
efter att du har slutfört installation av nod.
Node.js har en pakethanterare, kallad Node Package Manager (NPM). Den installeras automatiskt med Node.js, och du använder NPM för att installera nya moduler. För att installera en modul, öppna din terminal / kommandorad, navigera till önskad mapp och kör följande kommando:
npm installera modulnamn
Det spelar ingen roll vilken operativsystem du har; ovanstående kommando kommer att installera modulen du anger istället för modul.
Naturligtvis kommer vårt första Node.js-skript att skriva ut texten 'Hej världen!'
till konsolen. Skapa en fil som heter hello.js, och skriv följande kod:
console.log ('Hello World!');
Låt oss nu utföra skriptet. Öppna terminalen / kommandoraden, navigera till den mapp som innehåller hello.js, och kör följande kommando:
nod hello.js
Du borde se 'Hej världen!'
visas i konsolen.
Låt oss gå vidare till en mer avancerad applikation; det är inte så komplicerat som du kanske tror. Låt börja med följande kod. Läs kommentarerna och sedan förklaringen nedan:
// Inkludera http-modulen. var http = kräver ("http"); // Skapa servern. Funktion som passeras som parameter kallas på varje förfrågan. // request variabel håller alla begäran parametrar // svarsvariabel kan du göra något med svar skickat till klienten. http.createServer (funktion (förfrågan, svar) // Bifoga lyssnare vid sluthändelsen. // Den här händelsen heter när kunden skickade all data och väntar på svar. request.on ("end", function () // Skriv rubriker till svaret. // 200 är HTTP-statuskod (det här betyder framgång) // Andra parametern innehåller rubrikfält i objekt // Vi skickar vanlig text, så innehållstypen ska vara text / vanlig respons.writeHead (200 , 'Content-Type': 'text / plain'); // Skicka data och slutsvar. Response.end ('Hej HTTP!');); // Lyssna på 8080-porten.) (8080);
Koden är väldigt enkel. Du kan skicka mer data till klienten med hjälp av Response.Write ()
metod, men du måste ringa det innan du ringer response.end ()
. Spara den här koden som http.js och skriv in det i konsolen:
nod http.js
Öppna din webbläsare och navigera till http: // localhost: 8080
. Du borde se texten "Hej HTTP!" på sidan.
Som jag nämnde tidigare måste vi göra allt själva i Node, inklusive analyseringsbegäran. Detta är dock ganska enkelt. Ta en titt på följande kod:
// Inkludera http-modulen, var http = kräver ("http"), // och url-modulen, vilket är mycket användbart vid analysering av förfrågningsparametrar. url = kräver ("url"); // Skapa servern. http.createServer (funktion (förfrågan, svar) // Bifoga lyssnare vid slut händelse. request.on ('end', function () // Parse förfrågan på argument och lagra dem i _get-variabel. // Denna funktion parser url från begäran och returnerar objektrepresentation. var _get = url.parse (request.url, true) .query; // Skriv rubriker till svaret. response.writeHead (200, 'Content-Type': 'text / plain ; // Skicka data och slutsvar. Response.end ('Här är dina data:' + _get ['data']);); // Lyssna på 8080-porten ;
Den här koden använder parse ()
metod för url modulen, en core Node.js-modul, för att konvertera begäran till URL till ett objekt. Det returnerade objektet har a fråga
egendom, som hämtar URL: ns parametrar. Spara den här filen som get.js och kör det med följande kommando:
node get.js
Gå sedan till http: // localhost: 8080 / data = put_some_text_here
i din webbläsare. Naturligtvis, ändra värdet av data
parameteren kommer inte att bryta skriptet.
För att hantera filer i Node använder vi fs modul (en kärnmodul). Vi läser och skriver filer med hjälp av fs.readFile ()
och fs.writeFile ()
metoder. Jag kommer att förklara argumenten efter följande kod:
// Inkludera http-modulen, var http = kräver ("http"), // och mysql-modulen du just har installerat. fs = kräver ("fs"); // Skapa http-servern. http.createServer (funktion (förfrågan, svar) // Bifoga lyssnare vid sluthändelsen. request.on ("end", function () // Läs filen. fs.readFile ("test.txt", "utf- 8 ', funktion (fel, data) // Skriv rubriker. Response.writeHead (200, ' Content-Type ':' text / plain '); // Öka numret från filen. Data = parseInt ) + 1; // Skriv ökat nummer till fil. Fs.writeFile ('test.txt', data); // Avsluta svar med något bra meddelande. Response.end ('Denna sida uppdaterades' + data + 'gånger! '););; // Lyssna på 8080-porten.). Lyssna (8080);
Node.js har en pakethanterare, kallad Node Package Manager (NPM). Den installeras automatiskt med Node.js
Spara detta som files.js. Innan du kör det här skriptet skapar du en fil med namnet test.txt i samma katalog som files.js.
Denna kod visar fs.readFile ()
och fs.writeFile ()
metoder. Varje gång servern tar emot en begäran läser skriptet ett nummer från filen, ökar numret och skriver det nya numret till filen. De fs.readFile ()
Metoden accepterar tre argument: namnet på filen som ska läsas, den förväntade kodningen och återuppringningsfunktionen.
Att skriva till filen, åtminstone i det här fallet, är mycket enklare. Vi behöver inte vänta på några resultat, även om du söker efter fel i en riktig applikation. De fs.writeFile ()
Metoden accepterar filnamnet och data som argument. Den accepterar också tredje och fjärde argument (båda är valfria) för att ange kodnings- respektive återuppringningsfunktionen.
Nu, låt oss köra det här skriptet med följande kommando:
node files.js
Öppna den i webbläsare (http: // localhost: 8080
) och uppdatera det ett par gånger. Nu kanske du tror att det finns ett fel i koden eftersom det verkar öka med två. Detta är inte ett fel. Varje gång du begär denna webbadress skickas två förfrågningar till servern. Den första förfrågan görs automatiskt av webbläsaren, som begär det favicon.ico, och naturligtvis är den andra förfrågan för URL-adressen (http: // localhost: 8080
).
Även om detta beteende är tekniskt inte ett fel, är det beteende som vi inte vill ha. Vi kan åtgärda det här enkelt genom att kolla förfrågningsadressen. Här är den reviderade koden:
// Inkludera http-modulen, var http = kräver ("http"), // och mysql-modulen du just har installerat. fs = kräver ("fs"); // Skapa http-servern. http.createServer (funktion (förfrågan, svar) // Bifoga lyssnare vid sluthändelsen. request.on ('end', function () // Kontrollera om användarbegäran / if (request.url == '/') // Läs filen. Fs.readFile ('test.txt', 'utf-8', funktion (fel, data) // Skriv rubriker. Response.writeHead (200, 'Content-Type': 'text / plain; // Öka numret som erhållits från filen. data = parseInt (data) + 1; // Skriv ökat antal till fil. fs.writeFile ('test.txt', data); // Avsluta svaret med vissa trevligt meddelande. response.end ('Denna sida uppdaterades' + data + 'tider!');); else // Anger att den begärda filen inte hittades. response.writeHead (404); // Och slutförfrågan utan att skicka några data. response.end ();); // Lyssna på 8080-porten.). Lyssna (8080);
Testa det nu; Det ska fungera som förväntat.
De flesta traditionella serverns tekniker har ett inbyggt sätt att ansluta till och fråga en databas. Med Node.js måste du installera ett bibliotek. För denna handledning har jag valt stallet och lätt att använda nod-mysql. Det fullständiga namnet på denna modul är [email protected] (allt efter @ är versionsnumret). Öppna din konsol, navigera till katalogen där du har sparat dina skript och kör följande kommando:
npm installera [email protected]
Detta hämtar och installerar modulen, och det skapar också node_modules mappen i den aktuella katalogen. Låt oss nu titta på hur vi kan använda detta i vår kod; se följande exempel:
// Inkludera http-modulen, var http = kräver ('http'), // och mysql-modulen du just har installerat. mysql = kräver ("mysql"); // Skapa anslutningen. // Data är standard för ny mysql-installation och bör ändras enligt din konfiguration. var connection = mysql.createConnection (användare: "root", lösenord: "", databas: "db_name"); // Skapa http-servern. http.createServer (funktion (förfrågan, svar) // Bifoga lyssnare vid sluthändelsen. request.on ('end', function () // Fråga databasen. connection.query ('VÄLJ * FROM your_table;', funktion (fel, rader, fält) response.writeHead (200, 'Content-Type': 'x-application / json'; // Skicka data som JSON-sträng. // Rader variabel håller resultatet av frågan. response.end (JSON.stringify (rader));;;); // Lyssna på 8080-porten.). Lyssna (8080);
Att fråga databasen med det här biblioteket är enkelt. Ange helt enkelt frågesträngen och återuppringningsfunktionen. I en riktig applikation bör du kontrollera om det fanns fel ( fel
parametern kommer inte att vara odefinierad
om fel inträffade) och skicka svarkoder beroende på att sökningen lyckades eller misslyckades. Observera också att vi har ställt in Innehållstyp
till x-application / json
, vilket är den giltiga MIME-typen för JSON. De rader
parametern innehåller resultatet av frågan och vi konverterar helt enkelt data i rader
till en JSON struktur med hjälp av JSON.stringify ()
metod.
Spara den här filen som mysql.js, och kör det (om du har MySQL installerat, det är):
nod mysql.js
Navigera till http: // localhost: 8080
i din webbläsare, och du bör uppmanas att hämta den JSON-formaterade filen.
Varje funktion i Node.js är asynkron.
Node.js kräver extra arbete, men utbetalningen av en snabb och robust applikation är värt det. Om du inte vill göra allt på lägsta nivå kan du alltid välja några ramar, t.ex.> Express, för att göra det lättare att utveckla applikationer.
Node.js är en lovande teknik och ett utmärkt val för en högbelastad applikation. Det har bevisats av företag, som Microsoft, eBay och Yahoo. Om du är osäker på att vara värd för din webbplats / applikation kan du alltid använda en billig VPS-lösning eller olika molnbaserade tjänster, till exempel Microsoft Azure och Amazon EC2. Båda dessa tjänster ger skalbara miljöer till ett rimligt pris.
Glöm inte att kommentera om du har några frågor!