Node.js for nybegynnere

Eventdrevet programmering kan være overveldende for nybegynnere, noe som kan gjøre Node.js vanskelig å komme i gang med. Men ikke la det frata deg; I denne artikkelen vil jeg lære deg noen grunnleggende om Node.js og forklare hvorfor det har blitt så populært.

Hvis du trenger hjelp, kan du alltid kontakte en av JavaScript-eksperter på Envato Studio. Enten du trenger en feil eller en ny funksjon, vil du finne en erfaren JavaScript-utvikler for å hjelpe deg.

Lær JavaScript: Den komplette veiledningen

Vi har bygget en komplett guide for å hjelpe deg med å lære JavaScript, enten du er bare i gang som webutvikler eller du vil utforske mer avanserte emner.

Introduksjon

For å begynne å bruke Node.js må du først forstå forskjellene mellom Node.js og tradisjonelle server-side scripting miljøer (for eksempel: PHP, Python, Ruby, etc).

Asynkron programmering

Node.js bruker en modularkitektur for å forenkle etableringen av komplekse applikasjoner.

Sjansene er gode at du er kjent med asynkron programmering; Det er tross alt "A" i Ajax. Hver funksjon i Node.js er asynkron. Derfor blir alt som vanligvis blokkerer tråden, i stedet henrettet i bakgrunnen. Dette er det viktigste å huske om Node.js. Hvis du for eksempel leser en fil på filsystemet, må du spesifisere en tilbakeringingsfunksjon som utføres når leseoperasjonen er fullført.

Du gjør alt!

Node.js er bare et miljø - noe som betyr at du må gjøre alt selv. Det er ikke en standard HTTP-server, eller en hvilken som helst server for den saks skyld. Dette kan være overveldende for nye brukere, men utbetalingen er en webapps med høy ytelse. Ett skript håndterer all kommunikasjon med klientene. Dette reduserer betydelig antall ressurser som brukes av søknaden. For eksempel, her er koden for en enkel Node.js-applikasjon:

var jeg, a, b, c, max; maks = 1000000000; var d = dato.now (); for (i = 0; i < max; i++)  a = 1234 + 5678 + i; b = 1234 * 5678 + i; c = 1234 / 2 + i;  console.log(Date.now() - d);

Og her er ekvivalentet skrevet i PHP:

$ a = null; $ b = null; $ c = null; $ i = null; $ max = 1000000000; $ start = mikrotime (sant); for ($ i = 0; $ i < $max; $i++)  $a = 1234 + 5678 + $i; $b = 1234 * 5678 + $i; $c = 1234 / 2 + $i;  var_dump(microtime(true) - $start);

La oss nå se på referansenumrene. Følgende tabell viser responstider, i millisekunder, for disse to enkle applikasjonene:

Antall iterasjoner 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 1.036.272,19

Jeg kjørte de to appene fra kommandolinjen, slik at ingen server ville utsette appenes utførelse. Jeg kjørte hver test ti ganger og gjennomsnittet resultatene. PHP er spesielt raskere med en mindre mengde iterasjoner, men den fordelen løses raskt ettersom antall iterasjoner øker. Når alt er sagt og gjort, er PHP 93% langsommere enn Node.js!

Node.js er rask, men du må lære noen ting for å kunne bruke det riktig.

moduler

Node.js bruker en modularkitektur for å forenkle etableringen av komplekse applikasjoner. Moduler er relatert til bibliotek i C, eller enheter i Pascal. Hver modul inneholder et sett med funksjoner relatert til modulens "emne". For eksempel, http Modulen inneholder funksjoner som er spesifikke for HTTP. Node.js gir noen kjernemoduler ut av boksen for å hjelpe deg med å få tilgang til filer på filsystemet, opprette HTTP- og TCP / UDP-servere, og utføre andre nyttige funksjoner.

Inkludert en modul er lett; bare ring kreve () funksjon, slik:

var http = krever ('http');

Node.js er bare et miljø; du må gjøre alt selv.

De kreve () funksjonen returnerer referansen til den angitte modulen. I tilfelle av denne koden, en referanse til http Modulen er lagret i http variabel.

I ovennevnte kode passerte vi navnet på en modul til kreve () funksjon. Dette fører til at noden søker etter en node_modules mappe i søknadens katalog, og søk etter http modul i den mappen. Hvis Node ikke finner node_modules mappe (eller http modul i den), ser den seg gjennom den globale modulbufferen. Du kan også angi en faktisk fil ved å sende en relativ eller absolutt bane, slik som:

var myModule = krever ('./ myModule.js');

Modulene er innkapslede kodenheter. Koden i en modul er for det meste privat - noe som betyr at funksjonene og variablene som er definert i dem, kun er tilgjengelige fra innsiden av modulen. Du kan imidlertid avsløre funksjoner og / eller variabler som skal brukes utenfor modulen. For å gjøre det, bruk eksport objekt og befolle sine egenskaper og metoder med koden du vil eksponere. Vurder følgende modul som et eksempel:

var PI = Math.PI; exports.area = funksjon (r) return PI * r * r; ; exports.circumference = funksjon (r) retur 2 * PI * r; ;

Denne koden oppretter en PI variabel som bare kan nås med kode inneholdt i modulen; Det er ikke tilgjengelig utenfor modulen. Deretter blir to funksjoner opprettet på eksport gjenstand. Disse funksjonene er tilgjengelige utenfor modulen fordi de er definert på eksport gjenstand. Som et resultat, PI er helt beskyttet mot utendørsforstyrrelser. Derfor kan du være trygg på det område() og omkrets() vil alltid oppføre seg som de burde (så lenge en verdi er levert for r parameter).

Globalt omfang

Node er et JavaScript-miljø som kjører i Googles V8 JavaScript-motor. Som sådan bør vi følge de beste praksiser som vi bruker til utvikling av kundesiden. For eksempel bør vi unngå å sette noe i det globale omfanget. Det er imidlertid ikke alltid mulig. Det globale omfanget i Node er GLOBAL (i motsetning til vindu i nettleseren), og du kan enkelt lage en global variabel av funksjon ved å utelate Var søkeord, slik:

globalVariabel = 1; globalFunction = funksjon () ...;

Igjen bør globals unngås når det er mulig. Så vær forsiktig og husk å bruke Var når de erklærer en variabel.

Installasjon

Naturligvis må vi installere Node før vi kan skrive og utføre en app. Installasjonen er rett fram, hvis du bruker Windows eller OS X; nodejs.org nettstedet tilbyr installatører for de operativsystemene. For Linux, bruk en hvilken som helst pakkebehandling. Åpne opp din terminal og skriv:

sudo apt-get oppdatering sudo apt-get install node

eller:

sudo aptitude update sudo aptitude installasjonskode

Node.js er i sid-repositories; Du må kanskje legge til dem i kildelisten din:

sudo echo deb http://ftp.us.debian.org/debian/ sid main> /etc/apt/sources.list.d/sid.list

Men vær oppmerksom på at installering av sidepakker på eldre systemer kan ødelegge systemet. Vær forsiktig, og fjern /etc/apt/sources.list.d/sid.list etter at du er ferdig med å installere Node.

Installere nye moduler

Node.js har en pakkebehandling, kalt Node Package Manager (NPM). Den installeres automatisk med Node.js, og du bruker NPM til å installere nye moduler. For å installere en modul, åpne din terminal / kommandolinje, naviger til ønsket mappe og utfør følgende kommando:

npm installasjonsmodulnavn

Det spiller ingen rolle hvilken OS du har; Kommandoen ovenfor vil installere modulen du angir i stedet for module_name.

Hello World App

Naturligvis vil vårt første Node.js-skript skrive ut teksten 'Hei Verden!' til konsollen. Opprett en fil, kalt hello.js, og skriv inn følgende kode:

console.log ('Hello World!');

La oss nå utføre skriptet. Åpne terminal / kommandolinjen, naviger til mappen som inneholder hello.js, og utfør følgende kommando:

node hello.js

Du bør se 'Hei Verden!' vises i konsollen.

HTTP-server

La oss gå videre til et mer avansert program; det er ikke så komplisert som du kanskje tror. La oss starte med følgende kode. Les kommentarene og deretter forklaringen nedenfor:

// Inkluder http-modulen. var http = krever ("http"); // Opprett serveren. Funksjon bestått som parameter blir kalt på hver forespørsel. // request variable inneholder alle forespørselsparametre // svarvariabelen lar deg gjøre noe med svar sendt til klienten. http.createServer (funksjon (forespørsel, svar) // Koble lytteren til slutthendelse. // Denne hendelsen kalles når klienten sendte alle data og venter på svar. request.on ("end", function () // Skriv overskriftene til svaret. // 200 er HTTP-statuskode (dette betyr suksess) // Andre parameteren holder toppfelter i objekt // Vi sender vanlig tekst, så innholdstype skal være tekst / vanlig respons.writeHead (200 , 'Content-Type': 'text / plain'); // Send data og sluttrespons. Response.end ('Hello HTTP!');); // Hør på 8080-porten.) (8080);

Denne koden er veldig enkel. Du kan sende flere data til klienten ved å bruke Response.Write () metode, men du må ringe det før du ringer response.end (). Lagre denne koden som http.js og skriv inn dette i konsollen din:

nod http.js

Åpne nettleseren din og naviger til http: // localhost: 8080. Du bør se teksten "Hei HTTP!" på siden.

Håndtere URL-parametere

Som jeg nevnte tidligere, må vi gjøre alt selv i Node, inkludert analyse av parsing request arguments. Dette er imidlertid ganske enkelt. Ta en titt på følgende kode:

// Inkluder http-modulen, var http = krever ("http"), // Og url-modulen, som er veldig nyttig i analysering av forespørselsparametere. url = krever ("url"); // Opprett serveren. http.createServer (funksjon (forespørsel, svar) // Fest lytteren på slutthendelse. request.on ('end', function () // Parse forespørselen for argumenter og lagre dem i _get-variabelen. // Denne funksjonen parser url fra forespørsel og returnerer objektrepresentasjon. var _get = url.parse (request.url, true) .query; // Skriv overskrifter til svaret. response.writeHead (200, 'Content-Type': 'text / plain '); // Send data og sluttrespons. Response.end (' Her er dataene dine: '+ _get [' data ']);); // Hør på 8080-porten.). Lytt (8080) ;

Denne koden bruker parse () metode av url modul, en kjerne Node.js-modul, for å konvertere forespørselsadressen til en gjenstand. Det returnerte objektet har a spørsmål eiendom, som henter nettadressens parametere. Lagre denne filen som get.js og kjør det med følgende kommando:

node get.js

Deretter navigerer du til http: // localhost: 8080 / data = put_some_text_here i nettleseren din. Naturligvis, endre verdien av data parameteren vil ikke bryte skriptet.

Lese og skrive filer

For å administrere filer i Node, bruker vi fs modul (en kjernemodul). Vi leser og skriver filer ved hjelp av fs.readFile () og fs.writeFile () metoder, henholdsvis. Jeg vil forklare argumentene etter følgende kode:

// Inkluder http-modulen, var http = krever ("http"), // Og mysql-modulen du nettopp har installert. fs = krever ("fs"); // Opprett http-serveren. http.createServer (funksjon (forespørsel, svar) // Bifør lytteren på slutthendelse. request.on ("end", funksjon () // Les filen. fs.readFile ("test.txt", "utf- 8 ', funksjon (feil, data) // Skriv overskrifter. Response.writeHead (200, ' Content-Type ':' text / plain '; // Øk tallet fra filen. Data = parseInt ) + 1; // Skriv økt nummer til fil. Fs.writeFile ('test.txt', data); // Avslutt svar med litt fin melding. Response.end ('Denne siden ble oppdatert' + data + 'ganger! '););; // Hør på 8080-porten.). Lytt (8080);

Node.js har en pakkebehandling, kalt Node Package Manager (NPM). Den installeres automatisk med Node.js

Lagre dette som files.js. Før du kjører dette skriptet, opprett en fil som heter test.txt i samme katalog som files.js.

Denne koden demonstrerer fs.readFile () og fs.writeFile () metoder. Hver gang serveren mottar en forespørsel, leser skriptet et nummer fra filen, øker nummeret og skriver det nye nummeret til filen. De fs.readFile () Metoden aksepterer tre argumenter: navnet på filen som skal leses, den forventede kodingen og tilbakeringingsfunksjonen.

Å skrive til filen, i det minste i dette tilfellet, er mye enklere. Vi trenger ikke å vente på noen resultater, selv om du vil sjekke om feil i en reell applikasjon. De fs.writeFile () Metoden aksepterer filnavnet og dataene som argumenter. Den aksepterer også tredje og fjerde argument (begge er valgfrie) for å angi henholdsvis kodings- og tilbakeringingsfunksjonen.

La oss nå kjøre dette skriptet med følgende kommando:

node files.js

Åpne den i nettleseren (http: // localhost: 8080) og oppdatere det noen ganger. Nå kan du tenke at det er en feil i koden fordi det ser ut til å øke med to. Dette er ikke en feil. Hver gang du ber om denne nettadressen, sendes to forespørsler til serveren. Den første forespørselen gjøres automatisk av nettleseren, som ber om det favicon.ico, og selvfølgelig er den andre forespørselen for nettadressen (http: // localhost: 8080).

Selv om denne oppførselen teknisk sett ikke er en feil, er det atferd som vi ikke vil ha. Vi kan løse dette enkelt ved å sjekke forespørselsadressen. Her er den reviderte koden:

// Inkluder http-modulen, var http = krever ("http"), // Og mysql-modulen du nettopp har installert. fs = krever ("fs"); // Opprett http-serveren. http.createServer (funksjon (forespørsel, svar) // Fest lytteren på sluttbegivenhet. request.on ('end', funksjon () // Sjekk om brukerforespørsler / hvis (request.url == '/')  // Les filen. Fs.readFile ('test.txt', 'utf-8', funksjon (feil, data) // Skriv overskrifter. Response.writeHead (200, 'Content-Type': 'text / plain '); // Øk tallet fra filen. data = parseInt (data) + 1; // Skriv økt nummer til fil. fs.writeFile (' test.txt ', data); // Slutt svar med noen god melding. response.end ('Denne siden ble oppdatert' + data + 'ganger!');); else // Angi at forespurt fil ikke ble funnet. response.writeHead (404); // Og sluttforespørsel uten å sende noen data. response.end ();; // Hør på 8080-porten.). lytt (8080);

Test det nå; det skal fungere som forventet.

Tilgang til MySQL-databaser

De fleste tradisjonelle server-side teknologier har en innebygd måte å koble til og spørre en database. Med Node.js må du installere et bibliotek. For denne opplæringen har jeg plukket stabilen og enkel å bruke node-mysql. Det fulde navnet på denne modulen er [email protected] (alt etter @ er versjonsnummeret). Åpne konsollen din, naviger til katalogen hvor du har lagret skriptene dine, og utfør følgende kommando:

npm installere [email protected]

Dette laster ned og installerer modulen, og det skaper også node_modules mappe i gjeldende katalog. La oss se på hvordan vi kan bruke dette i vår kode; se følgende eksempel:

// Inkluder http-modul, var http = krever ('http'), // og mysql-modulen du nettopp har installert. mysql = krever ("mysql"); // Opprett tilkoblingen. // Data er standard for ny mysql-installasjon og bør endres i henhold til konfigurasjonen. var forbindelse = mysql.createConnection (bruker: "root", passord: "", database: "db_name"); // Opprett http-serveren. http.createServer (funksjon (forespørsel, svar) // Bifør lytteren på sluttbegivenhet. request.on ('end', function () // Spør databasen. connection.query ('VELG * FROM your_table;', funksjon (feil, rader, felt) response.writeHead (200, 'Content-Type': 'x-application / json'; // Send data som JSON-streng. // Rader-variabel inneholder resultatet av spørringen. response.end (JSON.stringify (rader));;;; // Hør på 8080-porten.). lytt (8080);

Å spørre databasen med dette biblioteket er enkelt; bare skriv inn forespørselsstrengen og tilbakeringingsfunksjonen. I en ekte applikasjon bør du sjekke om det var feil (the feil parameteren vil ikke være udefinert hvis feil oppstod) og send svarkoder avhengig av suksessen eller feilen i spørringen. Vær også oppmerksom på at vi har satt Innholdstype til x-applikasjon / .json, som er gyldig MIME-type for JSON. De rader parameter inneholder resultatet av spørringen, og vi konverterer bare dataene i rader til en JSON struktur ved hjelp av JSON.stringify () metode.

Lagre denne filen som mysql.js, og utfør det (hvis du har MySQL installert, er det):

node mysql.js

Navigere til http: // localhost: 8080 i nettleseren din, og du bør bli bedt om å laste ned JSON-formatert fil.

Konklusjon

Hver funksjon i Node.js er asynkron.

Node.js krever ekstra arbeid, men utbetalingen av en rask og robust applikasjon er verdt det. Hvis du ikke vil gjøre alt på laveste nivå, kan du alltid velge noen rammer, for eksempel> Express, for å gjøre det lettere å utvikle applikasjoner.

Node.js er en lovende teknologi og et utmerket valg for en høy belastnings applikasjon. Det har blitt bevist av selskaper, som Microsoft, eBay og Yahoo. Hvis du er usikker på at du er vert for nettstedet ditt, kan du alltid bruke en billig VPS-løsning eller ulike skybaserte tjenester, for eksempel Microsoft Azure og Amazon EC2. Begge disse tjenestene gir skalerbare miljøer til en rimelig pris.

Ikke glem å kommentere hvis du har noen spørsmål!