Node.js er en fantastisk ny teknologi, men med mindre du er spesifikt en JavaScript-utvikler, kan prosessen med å bli kjent med det raskt bli litt overveldende. Men det er derfor vi er her! Hvis du vil egentlig lær hvordan du bruker Node.js, vil dette settet med artikler og screencasts gjøre trikset.
Hei folkens, jeg heter Christopher Roach, og jeg vil være din guide gjennom hele denne serien av screencasts på Node.js. I denne serien bruker vi Node til å lage en enkel bloggmotor, som den som ble kjent i den populære Ruby on Rails introduksjonsvideoen. Målet med denne serien er å gi deg seeren en ekte følelse av hvordan Node fungerer slik at du, selv når du arbeider med noen av de populære webutviklingsrammene der ute, som Express eller Getty, vil føle deg komfortabel nok med Nodes indre virkninger for å kunne falle ned i sin kilde og gjøre endringer som passer dine behov etter behov.
Før vi kommer inn i noen detaljer om hva Node er, og hvorfor du vil bruke det, vil jeg gjerne fortsette å komme i gang med installasjonen av Node, siden det kan ta litt tid, selv om det er veldig enkelt..
Node er fortsatt veldig ung, og er i aktiv utvikling, så det er best å installere fra kilden.
Node er fortsatt veldig ung, og er i aktiv utvikling, så det er best å installere fra kilden. Når det er sagt, har Node svært få avhengigheter, og så er kompilering ikke så nær så komplisert som andre prosjekter du kanskje har kjempet med tidligere. For å få koden, besøk nettstedet Node.js. Hvis du ruller ned siden til nedlastingsseksjonen, finner du et par valg. Hvis du har Git installert, kan du gjøre en klon i depotet og installere derfra. Ellers er det en link til en tarball som du kan laste ned i stedet. I denne videoen holder jeg ting enkelt og installerer fra tarballen.
Mens dette lastes ned, er det nå en god tid å nevne at det er anstrengelser for å levere en port for Node for Windows, og det er instruksjoner for installering på Windows for Cygwin eller MinGW. Jeg tror det er enda noen binære pakker der ute som du kan installere fra, men når dette skrives, er det primære miljøet Unix og Linux-baserte plattformer. Hvis du er på en Windows-maskin, kan du klikke på koblingen for å bygge instruksjoner og følge settet med instruksjoner der for en Windows-installasjon, eller du kan installere en versjon av Linux, for eksempel Ubuntu, og installere Node der.
Når det er ferdig med nedlasting, bare untar og pakke ut pakken med tar -xvf
og cd
inn i katalogen den opprettet. Først må vi gjøre en ./ configure
, deretter gjøre
, og endelig gjør installasjonen
. Det skal ta litt tid å bygge, så jeg lar det gå i bakgrunnen og benytte anledningen til å snakke litt mer om Node, og hvorfor det forårsaker en slik røre i webutviklingssamfunnet.
node er JavaScript på serveren.
Så hvis denne artikkelen og videoen er din første introduksjon til Node, lurer du sikkert på hva det er og hva som gjør det verdt å lære når det allerede er så mange andre webutviklingsrammer der ute å velge mellom. Vel, for det første, en grunn du burde bry deg om er at Node er JavaScript på serveren, og la oss innse det, hvis du jobber på nettet, elsker det eller hater det, må du jobbe med JavaScript på et tidspunkt . Bruke JavaScript som backend-språk, så vel som på klientsiden, betyr mye mindre kontekstbytte for hjernen din.
Åh, jeg vet hva du tenker: "så Node er JavaScript på serveren, det er bra, men det har vært andre JavaScript på serverforsøkene tidligere som i utgangspunktet bare har fizzled."
Vel, det korte svaret er: Node er server-side JavaScript endelig gjort riktig. Hvor andre forsøk i utgangspunktet har vært havner i tradisjonelle MVC-webrammer til JavaScript-språket, er Node noe helt annet. Ifølge nettsiden er Node hendelsen I / O for V8 JavaScript, men hva betyr det egentlig? La oss starte med V8.
V8 er Googles super raske JavaScript-implementering som brukes i Chrome-nettleseren.
Gjennom noen veldig genialt bruk av "Just in Time" -samling, kan V8 oppnå hastigheter for JavaScript som gjør brukere av andre dynamiske språk, for eksempel Python og Ruby, grønt av misunnelse. Ta en titt på noen av referansene, og jeg tror du vil bli overrasket. V8 JavaScript er oppe med mange JVM-baserte språk som Clojure og Java og kompilerte språk, for eksempel Go i mange tilfeller.
JavaScripts evne til å passere rundt lukninger gjør hendelsesbasert programmering død enkel.
Den andre nøkkel setningen i denne utsagnet er begiven I / O. Denne er biggie. Når det gjelder å opprette en webserver, har du i utgangspunktet to valg å gjøre når det gjelder flere samtidige tilkoblingsforespørsler. Den første, som er den mer tradisjonelle ruten tatt av webservere som Apache, er å bruke tråder til å håndtere innkommende tilkoblingsforespørsler. Den andre metoden, den som er tatt av Node og noen ekstremt raske moderne servere som Nginx og Thin, er å bruke en enkelt ikke-blokkerende tråd med en hendelsesløkke. Det er her beslutningen om å bruke JavaScript skinner virkelig, siden JavaScript ble utviklet for å brukes i et sløyfebasert miljø med en gjenget hendelse: nettleseren. JavaScripts evne til å passere rundt lukninger gjør hendelsesbasert programmering død enkel. Du kaller i utgangspunktet bare en funksjon for å utføre en type I / O, og sende den en tilbakeringingsfunksjon, og JavaScript oppretter automatisk en lukning, og sørger for at den korrekte tilstanden blir bevart selv etter at ringesignalet lenge siden har gått utenfor omfanget. Men dette er bare teknisk jargong, og jeg er sikker på at du dør for å se noen kode i aksjon. Jeg kommer til å spole litt fram til slutten av denne installasjonen, så vi kan begynne å leke med vår splitter nye, nyverdige kopi av Node.
Så, det ser ut til at bygningen min endelig er ferdig; Jeg vil raskt sjekke og forsikre deg om at alt gikk bra med installasjonen. For å gjøre det, bare kjør node - versjon
fra kommandolinjen, og du bør se en indikasjon på at du kjører den nyeste versjonen av Node som på dette tidspunktet er versjon 0.4.5. Hvis du ser en versjon ut, kan du være trygg på at alt gikk svømmende, og du er klar til å skrive din første Node-app. Så la oss cd
tilbake til vår hjemmekatalog og opprett en ny mappe for å holde alt vårt arbeid i løpet av denne serien av screencasts. Her skal jeg bare ringe til min 'blog
'og la oss cd
inn i det for å komme i gang.
I motsetning til andre rammer er Node ikke strengt for webutvikling. Faktisk kan du tenke på Node som et rammeverk for serverutvikling av noe slag. Med Node kan du bygge en IRC-server, en chat server, eller som vi ser i dette settet av opplæringsprogrammer, en http-server. Så siden vi ikke kan ha en innledende opplæring uten obligatorisk 'Hei Verden
'søknad, vil vi begynne med det.
La oss lage en ny fil som heter app.js
. Nå kommer Node med en håndfull biblioteker for å gjøre utviklingen av eventbaserte servere enkle. For å bruke en av de tilgjengelige bibliotekene, inkluderer du bare modulen sin med behovsfunksjonen. Kreverfunksjonen returnerer et objekt som representerer modulen du passerer inn i, og du kan fange det objektet i en variabel. Dette skaper effektivt et navneområde for funksjonaliteten til enhver nødvendig modul. For å opprette en HTTP-server, gir Node http-biblioteket. Så la oss gå videre og kreve det nå og tilordne det returnerte objektet til http-variabelen.
Deretter må vi faktisk opprette serveren vår. Http-biblioteket gir en funksjon som kalles createServer
som tar en tilbakeringingsfunksjon og returnerer et nytt serverobjekt.
Tilbakeringingsfunksjonen er hva Node kaller en lytterfunksjon, og det kalles av serveren når en ny forespørsel kommer inn.
Når en HTTP-forespørsel blir gjort, vil lytterfunksjonen bli kalt og objekter som representerer HTTP-forespørselen og responsen, vil bli overført til funksjonen. Vi kan da bruke responsobjektet inne i vår lytterfunksjon for å sende et svar tilbake til nettleseren. For å gjøre dette må vi først skrive de riktige HTTP-overskriftene, så la oss ringe writeHead
fungere på vårt responsobjekt.
De writeHead
funksjonen tar et par argumenter. Den første er et heltall som representerer statuskoden til forespørselen, som for oss vil være 200, med andre ord, OK. Den andre verdien er et objekt som inneholder alle svarhodene som vi vil sette inn. I dette eksemplet vil vi ganske enkelt sette innholdstypen til "tekst / vanlig" for å sende vanlig tekst.
Når vi har satt topptekstene, kan vi sende dataene. For å gjøre det, ringer du til skrive
fungere og passere i dataene du ønsker å sende. Her, la oss ringe skrive
fungere på vårt responsobjekt og passere i strengen "Hei Verden
".
For å sende svaret, må vi signalere til serveren at vi er ferdige med å skrive inn svaret vårt. det kan vi gjøre ved å ringe response.end
. De slutt
funksjonen tillater oss også å sende inn data, så vi kan forkorte serverkoden ved å kvitte seg med anropet til skrivefunksjonen som vi laget tidligere og i stedet passerer i strengen "Hei Verden
"til sluttfunksjonen, som så.
Nå som vi har opprettet vår server, må vi sette den opp for å lytte etter nye forespørsler. Det er lett nok å gjøre: ring på lyttefunksjonen på serverobjektet og send inn et portnummer for at det skal lytte på; i dette tilfellet bruker jeg port 8000
. Lyttingsfunksjonen tar også en valgfri andre parameter som er vertsnavn-URL, men siden vi bare kjører dette lokalt, kan vi trygt hoppe over denne parameteren for nå.
Til slutt, la oss skrive ut en melding for å fortelle oss at serveren vår kjører, og i hvilken port den lytter etter nye forespørsler. Du kan gjøre det ved å ringe console.log
, akkurat som vi ville i nettleseren, og passerer i strengen "Lytter på http://127.0.0.1:8000
". Der vi går, la oss nå kjøre vår app ved å ringe node og sende den navnet på filen vi vil at den skal utføre.
Før vi tar denne første artikkelen og videoen i serien til slutt, la vi vende tilbake til terminalen og raskt ta en titt på Node's REPL.
En REPL, for de som ikke er kjent med akronymet, står for Read-Eval-Print-Loop som ikke er noe mer enn et enkelt program som aksepterer kommandoer, evaluerer dem og skriver ut resultatene sine.
Det er i hovedsak en interaktiv spørring som gjør at du kan gjøre stort sett alt du kan gjøre med vanlig knutepunkt, men uten all overhead å lage en egen fil, og det er flott for eksperimenter, så la oss spille litt med REPL og lære en litt mer om Node.
Vi må først stoppe serverprogrammet vårt ved å trykke Ctrl-C
. Kjør deretter noden igjen, denne gangen, uten filnavn. Running node uten noen argumenter vil gi opp REPL, som vi kan se her ved endringen i spørringen. REPL er veldig enkelt: i utgangspunktet kan du skrive JavaScript-kode og se evalueringen av den koden. Til tross for sin enkelhet, har REPL imidlertid få kommandoer som kan komme til nytte, og du kan se på hver av disse ved å ringe .hjelp-kommandoen ved spørringen. Her (se screencast) ser vi en liste over fire kommandoer, hvorav den første er .gå i stykker
kommando. Hvis du skriver noen kode som strekker seg over flere linjer, og du finner ut at du har gjort en eller annen type feil, og trenger å bryte ut uansett grunn, .gå i stykker
kommandoen kan brukes til å gjøre det. La oss prøve det nå?
Jeg skal lage en funksjon her, og jeg skal bare ringe den foo
og åpne funksjonen kroppen og deretter treffe Tast inn
. Legg merke til at på neste linje, i stedet for å se den typiske større enn symbolet, ser vi nå et sett med tre prikker eller en ellipsis. Dette er Node's måte å indikere for oss at vi ennå ikke har fullført kommandoen på den forrige linjen, og at Node fortsatt forventer mer fra oss før det evaluerer koden vi har skrevet inn. Så la oss fortsette og legge til en linje av kode nå: vi skal gjøre det console.log
og vi vil skrive ut navnet på funksjonen. La oss nå slå inn, og igjen, legg merke til at ellipsis karakteren blir vist igjen. Node forventer fortsatt at vi skal fullføre funksjonen på et tidspunkt. La oss nå anta at jeg har gjort en feil, og jeg vil bare komme tilbake til en vanlig ledetekst. Hvis jeg fortsetter å trykke inn, fortsetter Node å vise ellipsis-tegnet. Men hvis jeg ringer til .gå i stykker
kommando, vil node bryte oss ut av den nåværende kommandoen og tar oss tilbake til den normale spørringen.
Deretter har vi .klar
kommando. Denne vil fjerne vår nåværende kontekst. Så hvis du har rotet miljøet med opprettelsen av flere variabler og funksjoner, og du vil ha en ren skifer, kjør du bare .klar
kommando og Voila, forsvinner alt magisk.
.exit
og .hjelp
Til slutt er det .exit
og .hjelp
kommandoer. De .hjelp
kommandoen er ganske åpenbar, siden det er kommandoen vi pleide å se listen over kommandoer i utgangspunktet. De .exit
kommandoen er like åpenbar: du kaller i utgangspunktet bare for å avslutte REPL, slik som det.
Så, det dekker stort sett all funksjonalitet som REPL gir utenfor evalueringen av koden du skriver inn. Men før vi forlater REPL helt, vil jeg gjerne benytte anledningen til å diskutere noen forskjeller og likheter mellom JavaScript i nettleseren og Node smaken av JavaScript. Så la oss kjøre Node igjen og hoppe tilbake til REPL.
Den første forskjellen mellom JavaScript-siden og klienten på klientsiden er at i en nettleser er enhver funksjon eller variabel som er opprettet utenfor en funksjon eller objekt, bundet til det globale omfanget og tilgjengelig overalt. I Node er dette imidlertid ikke sant. Hver fil, og til og med REPL, har sitt eget modulnivå omfang som alle globale deklarasjoner tilhører. Vi ser dette bli brukt senere i serien når vi diskuterer moduler og lager noen av våre egne. Men for nå kan du se det aktuelle modulobjektet for REPL ved å skrive modulen ved spørringen. Legg merke til at det er et raskt attributt begravet noen få nivåer dypt i modulobjektet? Dette styrer spørringen som vi ser når i REPL. La oss bare endre det til noe litt annerledes og se hva som skjer. Der nå har vi en helt ny ledetekst.
En annen forskjell mellom Node JavaScript og nettleseren JavaScript er at i nettleseren har du et globalt vinduobjekt som i hovedsak knytter deg til nettlesermiljøet.
I Node er det ingen nettleser, og dermed ikke noe som en vindu
gjenstand. Node har imidlertid en motstykke som knytter deg til driftsmiljøet som er prosessobjektet som vi kan se ved ganske enkelt å skrive prosessen inn i REPL. Her finner du flere nyttige funksjoner og informasjon som listen over miljøvariabler.
En likhet som er viktig å nevne her er setTimeout-funksjonen. Hvis du er kjent med klientsiden JavaScript, har du uten tvil brukt denne funksjonen en eller to ganger. Det lar oss i utgangspunktet sette opp en funksjon som skal ringes på et senere tidspunkt. La oss gå videre og prøve det ut nå.
> funksjon sayHello (sekunder) ? console.log ('Hello') ;? setTimeout (funksjon () ? console.log ('World');?, sekunder * 1000) ;?
Dette vil skape en funksjon som når den kalles, skriver ut strengen "Hei" og deretter et par sekunder senere skriver strengen "Verden". La oss utføre funksjonen nå for å se den i aksjon.
> sayHello (2);
Det er et par viktige ideer å ta vare på her. For det første har Ryan Dahl, skaperen av Node, gjort sitt beste for å gjøre miljøet så kjent som mulig for alle som har JavaScript-opplevelse på klientsiden. Så bruk av navn som setTimeout
og settInterval i stedet for å sove og gjenta, for eksempel, var en bevisst beslutning om å få server-side miljøet til å passe, hvor det er fornuftig, nettlesermiljøet.
Det andre konseptet som jeg vil at du skal være klar over er den virkelig viktige. Legg merke til det når vi ringer si hei
, Straks etter utskrift av den første strengen, blir kontrollen umiddelbart gitt tilbake til REPL. I tiden mellom når den første strengen skrives ut og tilbakeringingsfunksjonen utføres, kan du fortsette å gjøre alt du vil ha ved REPLs spørsmål. Dette skyldes den hendelsesbaserte naturen til Node. I Node er det nesten umulig å ringe noen funksjon som blokkerer av hvilken som helst grunn, og dette gjelder for setTimeout-funksjonen. La oss ringe vår si hei
funksjonen igjen, men denne gangen lar vi passere litt lengre timeoutintervall for å gi oss nok tid til å leke litt og bevise vårt poeng. Jeg tror 10 sekunder skal gjøre trikset.
Der ser vi den første strengen. La oss fortsette å kjøre en egen kode, hva med 2 + 2
. Flott, vi ser at svaret er 4
og? Det er vår andre streng som skrives ut nå.
Så det bringer oss til slutten av den første episoden i denne serien. Jeg håper dette har vært en ganske informativ introduksjon til Node for deg, og jeg håper jeg har gjort en anstendig nok jobb med å forklare hvorfor det er så spennende, hva det har å tilby, og bare hvor morsomt og enkelt det er å bruke. I neste episode begynner vi faktisk å skrive noen av koden for vår bloggmotor; så jeg håper du kommer til å bli med meg igjen når ting blir litt flere hender på. Ser deg da!