>> Så med dette er sagt,
bare slags en simpel introduktion til prototyper
og JavaScript-objekt model.
Vi kommer ikke til at flytte gearer lidt at snakke
om mere JavaScript til serveren og boghylde Bibliotek
og forbindelsen Knex Bibliotek.
Så kan du faktisk bare -
hvis du søger efter Bookshelf.js det skal være temmelig nemt
at finde, bør først resultat, og bogreol
David nævnt netop giver en masse struktur
omkring JavaScript objekter, og arbejde med dem relationelt
i relationsdatabaser.
Så en masse af lignende funktioner der er faktisk stærkt inspireret
af Laravel s ORM som samt Backbone.js,
som er en forende MVC bibliotek, som giver dig mulighed for
at strukturere din kode, svarer til, hvad jeg var viser
med eksempler på prototyper Hvor du kan -
i stedet for bare vilkårligt kaste klasser
på dine synspunkter her og der.
Det giver dig modeller og samlinger af de modeller
som formodes at virke som sortering af en enkelt sandhed
om data for din ansøgning.
Og så du lytter til, som de modeller ændringer, du siger, OK,
re-gengive denne skabelon her, og det ene herovre
og ikke bare tilføje klasse her, tilføje klasse der og slags pick
om vælgere og gøre spindelvæv af jQuery kode.
Det giver mere af en klasse-baserede struktur til enkelte stykker,
men en vigtig bestanddel af at biblioteket er modellerne
som har en lignende struktur hvad Bookshelf modeller gør.
Så hvis du er fortrolig med Boghylde du er smuk også
temmelig bekendt med Backbone.js modeller
og jeg vil anbefale tage et kig på dette.
Så nogle af de vigtigste funktioner
at det giver dig er bare evne til at lagre data på et objekt
at kalde hente, som returnerer en individuel rekord
fra databasen, skal du oprette relationer som tilsvarende
til, hvad du behandlet inden i Laravel
hvor man kan sige en patient sat en rekord metode
og sige dette har vundet rekord
hvor dokumentationen objektet tabelnavnet patientjournaler.
Lad os se.
Har mange - det hører til -
bare ting, som du er temmelig ens -
temmelig bekendt med allerede, men i JavaScript.
Og under kølerhjelmen, for bogreol
det bruger en forespørgsel bygmester kaldet Knex.js.
Så det er Knex, knexjs.org.
Det er en henvisning til legetøjet, hvis nogen nogensinde har leget med dette.
Men det giver dig mulighed for at - i et lignende måde, at jQuery,
du bare slags skaber en kæde af forskellige metoder
at du ringer på din database række, så du kan -
du startede ud med at sige Knex og tabelnavnet.
Så for eksempel, Knex brugere, vælge, hvilke kolonner, du gerne vil,
hvor og have anderledes, når betingede, og du kan have
Eller hvor og hvor, hvor imellem, hvor ikke
du nu ned på linjen.
Du kan angive forskellige slutter mellem dine databasetabeller
som Bookshelf anvender internt at etablere en slags magi
omkring hasOne, hasMany, belongsTo, belongsToMany.
Og så kombinationen
af de to lade dig gøre temmelig meget, hvad du ville blive brugt
til i ramme som Laravel i form
funktionalitet arbejde med databaser.
Så lad os gå videre og tage et kig på et simpelt eksempel
for en Express app, som gør brug af disse modeller
og samlinger af Boghylde jazz [fonetisk].
Så har jeg oprettet bare en simpel anvendelse her.
Jeg strippet ud nogle af de ting der blev initialisering udtrykkelig
og flytte det ind i en init bibliotek, som jeg har oprettet.
En af de gode ting ved arbejder med Express som formodes
til Laravel er, at der er virkelig ikke meget håndhævet
på dig konventionaliseret.
Så du kan oprette mapper -
det ikke rigtig give dig en hel masse at arbejde ud fra.
Du har bare slags nogle grundlæggende indstillinger og derefter -
men det er ligeglad hvor du lægger dem.
Du behøver ikke at have controllerens bibliotek.
Du behøver ikke at have en modeller bibliotek, en config mappe.
Du kan sortere i skabe dem som dit projekt behov
og sætte tingene op vejen der giver mening mest for dig.
Så i stedet for at have alle denne udtrykkelige standardtekst
i de vigtigste app.js jeg lige sagde app ligemænd kræver init / express.
Og så i init,
initialiseringsskærmens mappe Jeg har bare Express her,
og dette kræver Express, opkald setup-funktionen, kalder -
opstiller visningen motor, JSON parser, alt det der.
Så nu, lad os fortsætte ned.
Så jeg kræver kursusleder møde
og krav modeller.
Så disse er i en mappe, Jeg har lige besluttet at navngive modeller.
Det behøver ikke at være, at måde, men det giver mening,
men modellerne er bare smuk fælles, så jeg vil anbefale den.
Men - Så lad os gå for kurset.
Jeg tror, ​​jeg bruger - yeah, og eksemplerne
hernede er alle baseret omkring løbet model.
Så lad os bare tage et kig på det.
Så nu, bare for første linje i denne model,
Jeg er allerede kræver noget andet.
Så hvis du lægger mærke til i node du skal kræve
eller du kommer til at ende op kræver en hel flok
af forskellige filer der er placeret
forskellige steder i din ansøgning.
Og de relative stier til uanset hvor du er
i dit nuværende program,
medmindre det er en top niveau allerede defineret som i du installere det
med MPM ligesom Reol eller Knex eller Express eller noget,
de er ikke relativ.
Ja? Zoom ind mere?
OK. OK. Så er du nødt til ender kræver en hel flok
af bare forskellige filer på din kode, som er gode og dårlige.
På en god måde, du ved, hvor tingene er, og det er ikke slags
af magi, hvad er foregår under kølerhjelmen,
som virkelig kan være forvirrende
når du har en meget tung Java -
eller meget tung ramme som Laravel, hvilken slags siger,
vi kommer til at passe af dette, så du ikke behøver
at kræve alt men du har
at vide, hvordan det hele arbejder med henblik på at bruge det.
Når som i dette tilfælde er det meget ligetil, som til
hvor alt er, de er bare ender
at blive lidt mere at skrive.
Ligesom i den side jeg gerne at bruge, der er et plugin
hvis du bruger en blind tekst
hvor du kan installere node moduler hjælper og du kan begynde
at skrive ligesom instruktør og det skaber den relative sti
til, hvor du er til det kode fil, form for nyttig.
Så kurset model er at kræve base her
og derefter basen praktikant kræver init / bogreol
og derefter bogreol det kræver det øverste niveau bogreol
og derefter initialisere den med den initialiserede Knex eksempel
der sætter kunden navn
og forbindelsen indstillinger for databasen.
Så jeg bare bruge en simpel forekomst af Sequel Pro, som -
MySQL, jeg adgang til det med Sequel Pro, og det har bare slags
en tilsvarende database setup som vi havde
i den første prøve ansøgning med kursuskataloget.
Så jeg satte min forbindelse indstillingerne her,
og disse er alle dokumenteret på Knex.js projektside
om, hvordan man setup disse forbindelser.
Så jeg har nu min base model.
Og som jeg nævnte med prototypen forandring,
så kan faktisk være slags en masse at -
tilføjer en masse standardteksten til din kode, så konvention
der er blevet tilpasset af Backbone.js
og nu Bookshelf.js er at tilføje dette udvide metode
som en statisk ejendom på dine JavaScript objekter,
hvilket giver det en slags næsten klasse-baserede arv natur
hvor hvis du ringer udvide kan du nedsætte
af prototypen metoder at du gerne vil her
Og så kan du - enhver ekstra statiske metoder
at du måske ønsker, du kan bare sætte dem selv
ud her, så jeg kan udvide det med - så hvis for eksempel,
flere modeller nødvendige vise navn og det får navn.
Så her, jeg siger display navn til model
som standard er, hvad dens navn Ejendommen er ellers tilbagevenden
intet navn.
Og nu på hver model, der er en -
der udvider denne base model, jeg nu har et visningsnavn metode
på prototypen kæde eller andet sted.
Og hvis jeg ønsker at overskrive det Jeg kan bare sætte det - set hvad -
getNavn ville være her.
Og det giver dig mulighed for at efterligne klassisk arv
i JavaScript, som kan være dejligt især for ting
, der egner sig at være klasse bygger ligesom objekt modeller.
Så lad os hoppe tilbage ind ansøgningen kode.
Så jeg har fået en rute til blot slash, bare for min indeks
og derefter skråstreg kurser.
Og begge disse ringer den renderCourses metode.
Så igen, funktioner første klasse og kan overføres
som argumenter til metoder.
Så i denne app.get, Jeg ringer -
Jeg passerer renderCourses som argument.
Og gøre - eller funktioner kan være setup som var -
som jeg gjorde tidligere var renderCourses lig funktion
eller de kan være lige funktion renderCourses.
Det gør ikke alt meget af en forskel.
Du kan faktisk få hvad kaldes navn funktion
udtryk, der VaR renderCourses ligemænd
funktion renderCourses.
Og grunden til at ønsker at have navngive funktioner især
i knudepunkt er, at det giver dig et renere -
mere læsbar Stakundersøgelsen.
Så hvis du har en hel flok
anonyme funktioner det vil sige -
når du har en fejl i din kode Du skal nok -
vil du ikke vide, hvilken funktion det kalder du nødt til at kigge
ved kodenummer og linjenummer
og det er nogle gange lettere bare visuelt parse
når du rent faktisk har navne
for de funktioner sig på serveren side.
Så dette renderCourses, lad os kalde node apps -
så jeg lytter på Core 3000 [fonetisk].
Og så alt dette er at gøre det rigtige her er bare at få alle
kurser fra databasen.
Jeg er ikke engang at begrænse det så det gør et stort antal
rækker det at vende tilbage.
Og for at gøre dette,
på kurset model der er et statisk egenskab
kaldet samling.
Og så jeg bare kalde det - jeg sagde oprette en ny samling
til dette kursus, og derefter hente det,
og derefter vende tilbage kurserne samling her i løftet.
Så internt, David i - den sidste halvdel lærte en lille smule
om løfter og løfter er bruges meget kraftigt i både Knex
og boghylde fordi det giver den -
det giver dig evnen til at have en masse
forskellige asynkrone opkald og sortering af slutte sig derefter sammen
eller hente noget, og så
med denne opfordring anden asynkron database opkald
og returnere denne værdi og derefter hoppe til den næste, så
og næste så og så have en fangst til allersidst at sortere
af efterligner asynkron try catch adfærd med asynkron kode,
fordi du ser det nu
men det er endnu sværere, når du begynder at beskæftige sig med det.
Asynkron kode er bare overalt
i server side JavaScript og virkelig i langt højere grad
end du er vant til, hvis du har gjort JavaScript
på klientsiden.
Så det virkelig, virkelig hjulpet dig derude.
Men bare for at vise dig debugger erklæring
at jeg talte om i node inspektør værktøjer,
Jeg har tænkt mig at gå videre og smide en debugger linje her
i renderCourses funktion og se, hvor det fører mig
når jeg - så node inspektør kan installeres
ved at gøre NPM Install med en G flag
hvilket betyder Global Node Inspector.
Og det vil hente det for NMP og installere det på globalt plan
til dine applikationer så du kan bare kalde det
fra kommandolinjen.
Jeg har allerede installeret det så jeg vil gå videre og -
faktisk kan det have at vente det vil bare tage,
tage to sekunder.
Og hvad node inspektør igen giver dig mulighed for
at gøre, er at have denne hovedløse version af debugger konsol
at du er vant til, når man arbejder på klientsiden og være i stand
at stoppe, bare tilføje specificeret peger på din kode.
Stop udførelse og tage et se på, hvad der foregår,
som ville virkelig komme i handy, hvis funktionen
ligesom der var til rådighed
når fejlfindingen PHP kode jeg sikker på.
Så lad os bare tage et kig på det.
Så jeg kan bare ringe node inspektør
og det vil sige at besøge denne URL port 5858 for at starte debugging,
det er bare standard for, hvordan det starter op.
Så har jeg nu fået - der er intet foregår her
fordi jeg har brug for at starte.
Så node dødvande [fonetisk] den debug flag og derefter app.js.
Så det siger debugger lytter på port 5858,
Express-server lytter på 3000.
Så vi er gode til at gå.
Lad mig bare opdatere denne.
Og nu kan jeg se app.js kode, som jeg var bare at kigge på
men her i konsollen.
Så nu, hvis jeg prøver at køre dette, du kan se det, det stopper.
Det er bare at vente, fordi dens Hele kode er nu
stoppede på denne debugger linje, som jeg har sat i der.
Og jeg kan nu server -
[Lydløs Bemærkning]
Åh, ja. Hvad er nøgleordet genvej til at zoome skærmen?
Åh der er.
Fik det. OK.
[Pause]
Åh, det er ikke på udkig [Fonetisk] der.
Så kurser er virkelig store
fordi jeg ikke gør en begrænse klausul eller noget,
det er bare henter hele databasen af ​​kurser
der er en masse af dem.
Og så - som er genstand
der rent faktisk kan gå ned noten inspektør instans.
Det er - OK.
Lad mig gøre en grænse, og så kan vi tage et kig
når det ikke er at hente hundredvis af kurser.
Så dræbe serveren og inspektør
og jeg vil gøre kursus samling query limit 20.
Så i bogreol i modsætning Laravel
hvor du kan bare ringe begrænse direkte eller ringe til nogen
af disse SQL-metoder at du bruger
til direkte på ORM instans.
Anytime, at du bruger bare SQL-metode, som er forsynet
i Knex, du har til kalder forespørgslen til at sortere
af indpasses i forespørgslen kæden.
Og dette kan påberåbes med enten en funktion,
så du kan sige, funktion denne grænse 10 eller du kalder det
ved at angive hvilke metode, du vil gerne indkalde
på Knex eksempel og hvilken værdi.
Så vi vil gøre begrænse 20 og derefter indstille.
Vi har faktisk ikke brug debugger her
fordi vi kan bare sætte breakpoints
og det gør det nemmere.
Ok.
Så lad os sætte et breakpoint lige her og forsøger at indlæse den.
Forkerte linje.
Lige her.
[Pause]
OK. Så det stoppede igen.
Så nu kurser er en objekt med længde på 20
og vi kan se alle de forskellige modeller, det er hentet
fra databasen lige her så jeg har fået en model objekt
som har inde i attributter ejendom
af objekt er alle de ting at det er fundet i databasen.
Eventuelle begivenheder, der blevet registreret
så du kan registrere forskellige begivenheder,
for eksempel når model bliver slettet
eller når det bliver hentet,
Du kan indstille forskellige egenskaber eller ændre ting.
Der er en masse forskellige kroge og disse er alle dokumenteret
i Bookshelf.js dokumentation, der giver dig mulighed
at gøre slags noget at du virkelig ønsker at gøre
med dine modeller og samlinger.
Du kan - de er beregnet at være virkelig tilpasses
og virkelig let for dig at tilpasse dem
til behovene i din ansøgning.
Men bare at kigge igennem her,
Jeg kan se, hvad de forskellige kurser er tilgængelige.
Og i dette tilfælde, jeg faktisk ikke hente
med andre, bortset data kun de kurser, selv.
Men på lignende måde veltalende ORM du kan indstille
relationer, så kurset tilhører mange instruktør.
Så hvis jeg går videre og standse anvendelsen,
springe til dette hente opkald, du kan angive forskellige indstillinger
at du gerne vil passerer langs til det.
Og en af ​​dem er evne til at indlæse relaterede kode
ved at angive withRelated instruktører derefter kurser.
Så lad os gå tilbage og frisk dette her og stoppe igen.
Så nu, objekt kurserne, samme antal modeller,
men nu hver model har en relations hash
som har de instruktører at det er relateret til.
Så dette kursus for eksempel
der er selvfølgelig 082 har to relaterede instruktør modeller.
Og du kan allerede nu se, hvordan meget lettere det er at sortere
visuelt arbejde med end når du beskæftiger sig med ting
at du slags ændre koden og derefter prøve det igen i PHP.
Det faktum, at du kan bare stoppe henrettelse helt
og vurdere, hvad der er her, og det - i konsollen, den -
zoome ud, kurser er, du ved,
hvad det lokale anvendelsesområde variablerne er tilgængeligt
og det er i øjeblikket den globale objekt, fordi som du så det,
medmindre du ringer med en specifik kontekst, er det ikke kommer
at have noget relevant her.
Og så det - lad mig vise nogle flere eksempler
gennemføre løfter.
Så i stedet for at gøre dette withRelated instruktører her er jeg
kommer til at gå videre og flytte denne at hente og derefter kurser
Jeg har tænkt mig at vende tilbage courses.load instruktører.
Og så - så du ringer derefter.
[Pause]
Så på dette tidspunkt kurser skal indlæses
med instruktører, der er asynkron handling.
Men fordi vi returnere det fra et løfte den næste værdi
for så er, hvad dette asynkrone opkald returnerer
som i dette tilfælde belastning er en metode bogreol
der faktisk returnerer indsamling selv.
Så det er at indlæse instruktører på der
og derefter kan du angive - hvis det er bare en ejendom,
du kan angive denne som snor, ellers
du kan gøre instruktører og krav
som en metode - undskyld, som en matrix.
Og hvis du ønsker at få virkelig fancy og begrænse eventuelle
af disse givet FETCH, du kan angive det som en hash
med instruktører og hvad du kan lide at begrænse forespørgslen på.
Så vil jeg gerne til at indlæse alle instruktører på kurser, hvor -
så QB for forespørgsel bygmester hvor status er aktiveret.
Og du kan få virkelig fancy med nogen
af de relaterede forespørgsler du gerne vil bygge.
Men, bare for nu, vi skal at holde sig til bare instruktører
og vi returnere denne værdi
så så den næste så bør har alle de kurser læsset
ordentligt op.
Og hvis der var en fejl på ethvert skridt i den kæde,
det ville springe ned til fangsten.
Så lad os gå videre og køre det.
Så hver gang - i modsætning til PHP, en Ulempen er
"Fordi node" er en lang kører proces, du faktisk har brug
at stoppe node proces som du opdaterer din kode,
fordi den version, at det er kører i køretid er,
den version af kode, der var indlæst
når den startes ikke hvad du har slags
af opdateret din kode med siden da.
OK. Vi vil sætte et breakpoint her, her og refresh.
[Pause]
Åh, jeg rent faktisk gjorde ikke opdatere denne side enten
så det var på den gamle proces.
Så du opdatere både denne og knudepunktet inspektøren.
Så nu ser vi kurser.
Hvis vi bare tage prøven en af ​​disse modeller
Vi kan se, at forholdet objekt er tomt, men nu -
og grunden til, at du har brug for at sætte breakpoints er, ja,
Jeg nævnte, at du kan hoppe ind staksporingen
og se dig vide, hvor det går i app.
Så nu kan jeg se, hvad der er sker i belastningen metode,
som jeg har defineret på samlingerne.
Den slags "Eager belastninger relationer ud på en allerede ".
Og du kan gå gennem og se linje for linje
hvor det her er går som er stor.
Hvis du har noget der er brudt i din kode,
det er at smide nogle fejl og du er ligesom, jeg virkelig ønsker
for at se, hvor dette foregår.
Men så snart du løber ind i noget asynkron, den -
det går til den næste kryds af begivenheden loop
og du mister din - du mister din plads
i noden inspektøren.
Så du er nødt til at sige, "OK, når jeg taber denne,
det skal stoppe nu på linie igen. "
For hvis jeg holdt rammer ned, ned i stakken,
det ville have i sidste ende bare gået væk jeg ikke havde sat dette
linje 22 blå brudlinje.
Så nu, hvis jeg ser ved kurser her,
det skal på forhold instruktører
og derefter har den instruktører vedhæfte dem.
Så kan du se, at jeg vendte tilbage et løfte fra den første løfte
Og så kan du hele tiden gøre det ned på linjen.
Så de forskellige løfte, lover biblioteker
Jeg brugte en kaldet Bluebird som er virkelig nyttige.
Det tilføjer en masse pænt af dette til at ændre asynkron -
skiftende ringe tilbage basen kode i ting
der fungerer godt med løfter.
Men - undskyld [uhørligt] hvad Jeg skulle til at sige det der.
Lad os tage et kig selv på -
så lad os sige, at der var en problem, når hentning noget.
Så jeg har denne anden rute at finde kaldes naturligvis id.
Så lad os gøre kurset 2.
Kan jeg få - JSON kursus.
Og det gør [uhørligt].
[Pause]
Jeg kan lugte noget galt her.
Ikke på 3000, jeg var på fanen Chrome inspektøren.
OK. Så lad os gå til kursus - JSON kursus 1.
Og det vender lige i JSON format, kurset indlæst
op med nogle instruktører.
Men det eksempel jeg ønskede at give her er,
Jeg gør JSON kursus ID.
Og i de hente parametre Jeg specificerer kræve sandt,
hvilket er en mulighed, der er dokumenteret i Bookshelf
hvor det er at sige, at: "Hvis, Jeg prøver og finde dette kursus
og det er der ikke, derefter kaste en fejl. "
Og der bør være omfattet af fangsten blokere hernede.
Så lad os gå videre og hoppe tilbage i knuden inspektør og prøv
og bryde dette og se, hvad vi fik.
Så lad os sætte en pause her på JSON kurset.
Ok.
Jeg vil gå til JSON kursus og Jeg ville bare sætte i nogle -
[Pause]
Det kan være lidt tricky nogle gange, når du forsøger
at styre hvilken er blevet opdateret
og som ikke har - lad os se.
Så det kalder fejl tomme svar.
[Pause]
Lad os kaste et debugger i her.
På grund af, hvordan node faktisk optimerer
for JavaScript runtime at være så hurtig på serveren,
undertiden node debugger har nogle fejl, når du forsøger
og sætte breakpoints dynamisk og du faktisk har brug for
at bruge en debugger og ikke line-by-line.
Så lad os se, om dette får os hvad vi ønsker.
Så jeg satte, app.get JSON-kursus-id,
og jeg har sat min debugger der
i fangsten erklæring nederst.
Fetch kræve sandt, det skal - okay, der går vi, brød.
Så nu kan jeg se at den stoppede
i denne sidste catch-blok fordi withRelated -
eller fordi kræve sande specificeret, og der er ingen naturligvis
med ID af denne store nummer via en undtagelse
som nu Emessage.
Og hver fejl i JavaScript har en stak ejendom
der kommer sammen med den.
Så det er ofte nyttigt til for eksempel
trøste logge ud e.stack.
Og jeg kan faktisk se når jeg ramte en fejl.
Så jeg får fejl tom svar, der er budskabet
, der blev sendt via boghylden.
Men nu kan jeg tage et kig ved på kaldstakkens og se
at bogreol dialekter SQL model 83,
denne tomme svar fejl blev kastet.
Og det er her, jeg nævnt, er det dot anonym
fordi det er en anonym funktion.
Hvis det var et navn funktion du ville have bedre ideer
som fungerer faktisk igennem uden at skulle gå
i model.js kode.
Selvom det er beregnet til at blive retfærdigt, temmelig læsbare,
så jeg kan se, at online.
Hvad gjorde de fortælle mig var linie 83.
Så hvis options.require og svaret ikke fandtes
det nu kaster en ny tom fejlmeddelelse.
Så du kan se temmelig ligetil, hvordan det fungerer.
Og internt i bogreol
der er bare en hel bundt af brug af løfter.
Så du kan angive Promise.method
med Bluebird bibliotek som holder den rette sammenhæng
af denne samtidig vender tilbage et løfte.
Og så har jeg - Jeg bindende værdien af ​​denne lignende
til, hvad jeg havde nævnt tidligere, men under anvendelse af løfter
og så kan jeg - er ny.
Det kan være asynkron eller ej, hvis jeg vil.
Og så gør jeg nogle andre ting, som kan
eller måske ikke være asynkrone og så mulige hopper ned dette.
Så Promise.all er en hjælper, der en masse af de populære biblioteker har
hvor du kan have en vifte af potentielt kan
eller måske ikke være løfter.
Og når alle disse er færdig, vender du tilbage at
og så er det springer til næste linje
og du kan se, hvordan det virkelig flader ud pyramiden
at du får den tilbagekald helvede som dets kendte
hvis du laver alt med tilbagekald linje for linje.
Der er måder at komme rundt det, men løfter er en
af de bedste måder efter min mening
til virkelig at holde din kode ren og let at læse.
Så det er kun en kort introduktion til JavaScript
og at bogreol og Knex generelt.
Og hvis der er nogen spørgsmål, Jeg ved det er et væld af materiale
at slags forsøge at dække især da de sprog,
modsætning til de fleste, at du er bekendt med, så jeg ville bare
at gøre det så, at mindst hvis du har problemer
med din kode, skal du slags kan hoppe i -
det er hvad jeg kan lide at gøre, er slags hoppe ind bibliotekerne
at jeg bruger og se hvordan tingene er struktureret.
Der er en, som jeg havde nævnt tidligere kaldet Backbone.js
og det er faktisk [Uhørligt] på klientsiden
at hjælpe med at give model view controller struktur
til din kode.
Men det har faktisk kommenteret dokumentation kilde
som giver dig mulighed for at slags se.
Det er virkelig godt dokumenteret, hvad der foregår,
hvordan det forstærke Ajax-funktionalitet
eller begivenhed funktionalitet eller modeller og samlinger slags
for at forklare, hvad der er foregår i processen.
Og hvis du forstår det grundlæggende i JavaScript
ligesom prototypal arv og bare hvordan funktioner anvendes
som begge objekter og værdier og klasser og alting.
Det gør det meget lettere at forstå, hvad der foregår
om potentielt i biblioteker, som du bruger
og debugger kode og være i stand for ikke banke hovedet
mod væggen, fordi du ikke forstår, hvordan
forskellige stykker arbejder, så.