Koa.js er et uttrykksfulle neste generasjons webramme skrevet for Node.js av folkene bak Express og Connect-rammene. Koa.js utnytter generatorer, som er en blødende kant funksjon av JavaScript, og har ennå ikke blitt gjort i stabile versjoner av Node.js. Koa tar sikte på å bruke generatorer for å redde utviklere fra spaghetti av tilbakeringinger, noe som gjør det mindre feilaktig og dermed mer overkommelig.
Med bare 550 kodelinjer er Koa et ekstremt lett rammeverk. Selv etter det pakker Koa seg i en elegant pakke med metoder som innholdsforhandlinger, omdirigeringer, proxy-support etc., noe som gir deg enkel og rask utvikling sammen med den granulære kontrollen over noden din.
Nå før vi begynner, må du ha minst Node-versjon 0.11.x
eller større.
Du kan installere den nyeste versjonen av Node ved hjelp av N-modulen:
sudo npm installere -g n sudo n stable
Du kan også bruke andre fellesskapsmoduler som nvm eller bygge den fra kilden. Vær oppmerksom på at N er også en fellesskapsmodul.
For å kjøre en JS-fil som bruker generatorer, må du oppgi --harmoni
flagg når du kjører den.
For eksempel å kjøre app.js
, skriv inn følgende kommando:
node --harmony app.js
Eller for å redde deg fra å skrive inn dette flagget hver gang, kan du opprette et alias ved hjelp av følgende kommando:
alias node = "node --harmony"
Nå for å kjøre din søknad ved hjelp av generatorer, bare skriv inn:
node app.js
Veldig bra! Vær også oppmerksom på at all koden i denne artikkelen er tilgjengelig på GitHub. Ta gjerne gaffel og lek med den.
For å forstå Koa må du først forstå generatorer som danner rammenes ryggrad.
Med ES-6 har generatorer endelig landet i det magiske landet til JavaScript. Hvis du har tidligere erfaring med generatorer i Lua, Python, Scheme, Smalltalk etc., så vil du være glad for å vite at en veldig lignende ting er implementert i JavaScript.
Generatorer er førsteklasses samrutiner i JavaScript som, enkelt sett, introduserer et pause og spillgrensesnitt på språket. Før generatorer brukte hele skriptet til som oftest Kjør i topp til nederst, uten en enkel måte å stoppe kodekjøring og gjenoppta med samme stabel senere. Nå kan vi få våre hender skitne med noen eksempler.
I henhold til dagens utkast til ES-6-spesifikasjon, må vi bruke en annen versjon av funksjonsdefinisjonen for å opprette en generatorfunksjon. Det ser slik ut:
var generator_func = funksjon * () ;
Her generator_func
er bare en tom generatorfunksjon.
Så hva vi kan gjøre er å bruke utbytte
søkeord i funksjonen for å stoppe kjøringen og lagre den nåværende stakken.
Her er et enkelt eksempel som viser summen av en uendelig AP:
var r = 3; funksjon * uendelig_ap (a) for (;;) a = a + r; gi a; var sum = uendelig_ap (5); console.log (sum.next ()); // returnerer verdi: 8, ferdig: false console.log (sum.next ()); // returnerer verdi: 11, ferdig: falsk
I den ovennevnte koden oppretter vi i utgangspunktet en iterator-instans som heter infinite_ap
som inkluderer en uendelig løkke og kan kjøre under normale forhold, kan fryse utførelsen.
Deretter lagrer vi en iterator forekomst i sum
variabel.
Nå når vi ringer sum.next ()
, det kommer tilbake verdi: 8, ferdig: false
noe som betyr at den stoppet utførelsen på utbytte
uttalelse som returnerer verdi
som 'a' og ferdig
som "falsk" .
Her ferdig
returnerer falsk til utførelsen er uferdig. Når utførelsen er fullført (i det nevnte tilfellet, skjer det aldri) funksjonen returnerer verdi: undefined, ferdig: true
.
Her er en liten endring av den forrige koden for å demonstrere slutten av utførelsen:
var r = 3; funksjon * uendelig_ap (a) for (var i = 0; i < 3 ; i++) a = a + r ; yield a; var sum = infinite_ap(5); console.log(sum.next()); // returns value : 8, done : false console.log(sum.next()); // returns value : 11, done: false console.log(sum.next()); // returns value : 14, done: false console.log(sum.next()); //return value: undefined, done: true
I mer komplekse programmer, vil du sjekke og bruke verdiene returnert og ferdig
status.
Merk: Ved hjelp av utbytte
uten funksjon*
ville føre til en tidlig feil.
Her er noen vanlige metoder som kommer til nytte når du håndterer vanilje generatorer.
Hver av metodene nedenfor er bare tilgjengelig i en generatorfunksjon og vil kaste en feil ellers.
neste ()
Dette brukes til å gjenoppta utførelsen sammen med å sende et argument. Hvis ingenting er bestått, blir udefinert passert som det første argumentet.
Eksempel: sum.next (5);
kaste()
Dette brukes til å kaste en feil eller et unntak på et hvilket som helst trinn. Det gjør feilhåndtering mye enklere. Å kaste en feil kan resultere i å stoppe utførelsen av filen, hvis den ikke håndteres et sted. Den enkleste måten å håndtere en feil på er å bruke et forsøk og få tak i det. Denne metoden tar et enkelt argument som kan være noe.
Eksempel: sum.throw (ny feil ("dette er en feil"));
utbytte
Generator delegasjon brukes til å gi en generator fra en eksisterende generator og kan brukes til å komponere generatorer eller til og med deterere over en generator.
Ved å delegere til en annen generator, stopper den nåværende generatoren å produsere en verdi selv og begynner å gi verdier av den delegerte generatoren til den er oppbrukt. Ved utmattelse av den delegerte generatoren fortsetter generatoren å returnere sin egenverdi.
Det er veldig mye som å bruke a for i
sløyfe over en generator, men unntakene fra den delegerte generatoren blir forplantet og kastet via den ytre generatorens kaste
metode og bør håndteres på samme måte. Her er et eksempel:
var consoleLogThunk = funksjon (msg) return function () console.log (msg); var generator = funksjon * () yield consoleLogThunk ("Yo"); gi konsollLogThunk ("Dawg"); gi konsollLogThunk ("!!!"); var delegator_function = funksjon * () yield consoleLogThunk ("Jeg ga før delegert utbytte"); utbytte * generator (); gi konsollLogThunk ("Jeg ga etter delegert avkastning"); var k = delegator_funksjon (); k.next () verdi (.); k.next () verdi (.); k.next () verdi (.); console.log (k.next ()); // Hvis du ringer k.next (), vil det kaste en Type-feil, da verdien er udefinert som ikke er en funksjon
Nå som du har en kort forståelse av generatorer i Javascript, kan du bruke dem til å skrive mye klarere og mindre feilkrevende applikasjoner der du kan blokkere på I / O, uten å blokkere prosessen faktisk..
La oss nå gå videre til installasjonen av Koa og en veldig enkel applikasjon basert på Koa.js.
Koa er et objekt som inneholder en rekke mellomvaregeneratorfunksjoner, som alle er sammensatt og utført på en stabelaktig måte ved hver forespørsel.
I prosjektkatalogen, kjør følgende kommando.
npm installere koa - save
Koa blir automatisk lastet ned og lagret i en package.json
fil, hvis den eksisterer.
Til tross for Koas meget små fotavtrykk, inneholder det metoder for oppgaver som cache friskhet, innholdsforhandlinger, omdirigeringer, proxy support etc., uten at middleware er pakket sammen.
Her er et eksempel hallo-verden program:
var koa = krever ('koa'); var app = koa (); app.use (funksjon * () this.body = "Hei verden!";); app.listen (3000);
Nå, Koa implementerer også downstreaming etterfulgt av oppstrømning av kontrollstrømmen. I begynnelsen kan det være vanskelig å gispe, men når du går gjennom eksemplet nedenfor, blir det tydeligere.
Her er et eksempel på kontrollflyten i Koa:
var koa = krever ('koa') (); koa.use (funksjon * (neste) // gjør noe før du gir / går videre til neste generatorfunksjon i kø som vil være første begivenhet i nedstrøms console.log ("A"); gi neste; // gjør noe når utførelsen returnerer oppstrøms, dette vil være siste hendelse i oppstrøms console.log ("B");); koa.use (funksjon * (neste) // gjør noe før du gir / går videre til neste generatorfunksjon i kø, dette skal være 2. begivenhet nedstrøms console.log ("C"); gi neste; // gjør noe når kjøringen returnerer oppstrøms, og dette ville være 2. begivenhet oppstrøms console.log ("D");); koa.use (funksjon * () // gjør noe før du gir / går videre til neste generatorfunksjon i kø. Her ville det være sist funksjon nedstrøms console.log ("E"); this.body = "hey guys"; konsoll .log ("F"); // Første forekomst av oppstrøms (fra siste til første)); koa.listen (3000);
Koden ovenfor er ganske enkel. Merk at ikke alle console.log
uttalelser er påkrevd, men de vil hjelpe deg å tydelig forstå den nedstrøms og oppstrøms utførelsesstrømmen til Koa.js .
Når vi kjører denne applikasjonen og åpner opp localhost: 3000
i nettleseren kan vi observere at console.logs
i terminalen er ikke i størrelsesorden A B C D E F. De er heller ikke i rekkefølge av A-C-E-B-D-F.
Ordren er faktisk A-----B C E F D som skildrer nedstrømmen av utbytter og oppstrøms oppførsel av utførelsen i en Koa-app.
Det kan hende du merker at den skrives ut to ganger. Dette skyldes en dobbel forespørsel sendt av nettleseren for å hente favicon.
Tips: Den koa.use (funksjon)
legger til mellomvarefunksjonen i programmet.
Så det er det for del 1 av denne opplæringen på JavaScript generatorer og Koa.js. Du har lært om de fleste forutsetningene, for eksempel hvilke generatorer, hvordan du bruker dem, hvordan du bruker delegerende avkastning og hvordan kontrollflyten fungerer i Koa.js.
I neste del av denne opplæringen vil vi dykke dypere inn i Koa og lære å bygge en CRUD-applikasjon. Hvis du har spørsmål eller kommentarer, kan du kontakte meg eller bare slippe en kommentar nedenfor.