Chrome Dev-verktøy JavaScript og ytelse

I denne tredje delen av vår Chrome Utviklerverktøy-serie, vurderer vi hvordan du endrer og feilsøker JavaScript. Optimalisering er en viktig del av utviklingsprosessen, spesielt for ytelseskritiske applikasjoner. Vi diskuterer også teknikker for å identifisere potensielle flaskehalser i vår kode.

Som i de to foregående artiklene vil jeg fokusere på funksjonene som finnes i Chrome Canary-bygningen (versjon 26.0, av denne artikkelen). Jeg vil dekke kildene og tidslinjepanelene.


Kilder Panel

Kilden panelet er go-to plass for JavaScript feilsøking. Dette panelet, kombinert med konsollpanelet, gir et ekstremt kraftig verktøy! Det er et punkt-og-klikk-grensesnitt som lar deg pause JavaScript-kjøring og inspisere alle variablene og objektene i det nåværende omfanget.

  1. Kilden panelet. Hvis du ikke ser så mange skript som du forventer, oppdater siden med Kilder-panelet åpent.
  2. Denne ruten kan enten være skjult, auto-skjult eller fast. Klikk på det lille ikonet til høyre for "Innholdsskript" for å bytte mellom disse statene. Denne ruten kan endres.
  3. Kategorien Kilder i venstre rute; du vil sannsynligvis få denne kategorien åpen mesteparten av tiden. Ressursene som er listet, skilles fra underdomenet, og du kan forvente å se CSS, JavaScript og HTML i kategorien.
  4. Du kan finne det nyttig å redigere CSS og JavaScript i Developer Tools.

  5. Innholdsskript-kategorien (ikke aktiv i skjermbildet) kan ved første visning vise mange merkelige navngitte skript. Disse er faktisk Chrome-utvidelser som lastes på siden. Dette er nyttig for feilsøking av faktiske utvidelser. Ellers kan du unngå å se dem ved å åpne siden i et inkognito-vindu; De fleste utvidelser er deaktivert som standard i inkognitomodus.
  6. Hovedinnholdsruten viser innholdet i det valgte skriptet. Hvis du velger flere skript, opprettes et grensesnitt som ligner på en IDE.
  7. Denne ruten inneholder underpaneler som gir nyttige verktøy for feilsøking av JavaScript. Øverst i ruten er ikonene å gå gjennom koden din.
  8. Watch Expressions gjør akkurat det, det "klokka" uttrykkene du har skrevet inn. Hvis du finner deg selv som vil vite verdien av dette søkeord på de ulike stadiene av et JavaScript-program, kan du se de dette søkeord for å se sine forskjellige verdier over tid. Klikk på add-knappen for å legge til et uttrykk, og hvis et uttrykk ikke oppdateres, klikk på knappen for liten oppdatering ved siden av tilleggsknappen.
  9. XHR Breakpoints gjør at vi kan stoppe JavaScript-kjøring når du lager en Ajax-forespørsel. Vi får enda mer kontroll over denne oppførselen ved å levere en verdi i feltet "Break when URL contains", som dukker opp når du klikker på add-knappen. Å gi ingen verdi får debuggeren til å bryte på noen XHR be om.
  10. Event Listener breakpoints gjør det mulig å sette brytepunkter for bestemte hendelser. Skjermbildet viser bare toppnivåkategorier. For eksempel har 'Timer' følgende bryterpunkter for individuelle hendelseslytter: 'Set Timer', 'Clear Timer' og 'Timer Fired'.
  11. Hvis du møter oppgradert kode, fungerer «Pretty Print» som en JavaScript-beautifier.

Kilder Tab

Kategorien Kilder viser ressurser gruppert av underdomenet de blir servert fra. Hver ressurs har en kontekstmeny (avslørt ved å høyreklikke på ressursen) med et sett med vanlige alternativer. Ett alternativ er imidlertid veldig interessant: Lokale modifikasjoner, som vi ser på senere.

Merk: Du kan vise kildefillisten som en flat liste (dvs. ikke inneholdt i mapper gruppert av underdomene) ved å fjerne merket for "Vis mapper" i Innstillinger> Generelt.

Hvis du klikker på en ressurs, vises den i hovedinnholdsruden. Ikke glem å aktivere ganske utskriftsmodus for minifiserte ressurser, ettersom noen minifatorer omdøper variabler for å gjøre koden vanskeligere å forstå. Forhåpentligvis vil flere utviklere generere kildekart i fremtiden, noe som gjør det enklere å jobbe med minifisert kode.

Du kan redigere de fleste filer i hovedinnholdsruden, og disse endringene gjenspeiles umiddelbart i nettleseren. Når du har endret en ressurs, gir kontekstmenyen deg muligheten til å lagre (om ikke permanent) eller Lagre som (sparer en ny versjon lokalt). Når du arbeider med dine egne lokale nettsteder, kan det hende du finner det nyttig å redigere CSS og JavaScript i Developer Tools i stedet for IDE. Lagring av endringer, i dette tilfellet, endrer den faktiske kildefilen. Verktøy som Tincr eller Chrome-devtools-autosave kan hjelpe til med å automatisere denne arbeidsflyten.

Resursens kontekstmeny gir også muligheten til å avsløre ressursen i nettverkspanelet.

revisjoner

En revisjon er et nytt punkt innenfor en ressurs levetid, som den har blitt endret på. Redigering og lagring av kode fra kildepanelet skaper en ny revisjon, og stilendringer som gjøres i elementpanelet utløser faktisk en ny revisjon!

Etter at du har gjort noen endringer, kan du høyreklikke på ressursen og velge Lokale modifikasjoner. Dette åpner en ny lokal endringspanel som inneholder en diff av de opprinnelige og redigerte filene. I ruten Lokale modifikasjoner kan vi returnere en endret kildefil i sin helhet (nyttig for når du har gjort mange uønskede endringer) ved å klikke på "tilbakestill" ved siden av filnavnet.

Hovedinnholdspanel

Utviklerverktøy er snill nok til å varsle oss om potensielle optimaliseringer.

Hovedinnholdsruten har mange av funksjonene du vil finne i grunnleggende kodeditorer: linjenumre, syntaksutheving, muligheten til å lage tabulatorer og 'angre' funksjonalitet. Selv om det ikke samsvarer med en fullverdig IDE, er det ikke dårlig for rask redigering.

Brytningspunkter

Breakpoints lar oss stoppe JavaScript-kjøring og inspisere det nåværende miljøet. For eksempel: anta at vi har en enkel til sløyfe som skyver elementer på en matrise. Vårt mål er å nøyaktig forstå de indre arbeidene innen hver iterasjon av løkken. Vi kunne veldig enkelt bruke console.log å logge på variablene vi vil inspisere. Mens denne teknikken gir deg de ønskede resultatene, er det absolutt ikke den mest effektive feilsøkingen. Ved å bruke breakpoints kan vi stoppe kodekjøring mens du er inne i til loop og inspiser alle variabler innenfor kontekstens omfang.

var ar = []; for (var i = 0; i < 3; i++)  var num = i; arr.push(num); 

For å legge til et brytepunkt, klikk på linjenummeret; Du kan også høyreklikke på linjenummeret og velge alternativet "Add Breakpoint". Etter at du har satt inn brytpunktet, oppdater siden og legg merke til at brytepunktene varer mellom sidelaster. Hvis koden ennå ikke skal utføres (for eksempel ble bruddpunktet satt inn i en klikkhendelseshåndterer), så kan du starte kodekjøringen uten en sideoppdatering.

Du kan vanskelig kode et brytepunkt i koden din ved å bruke debugger; uttalelse i koden din. Utviklerverktøy (og de fleste JavaScript-debuggere) gjenkjenner dette som et bruddpunkt.

Når du når et brytepunkt, teller siden grå og linjen med kode lyser blå. På dette punktet kan vi treffe escape-tasten for å vise konsollpanelet. Det som er interessant er at koden som er skrevet og utført i konsollen (mens den er pauset på et pausepunkt), faktisk utføres i den nåværende pausede konteksten! Vanligvis er dette søkeord refererer til den globale vindu gjenstand; mens visning dette i en klikk Hendelseshåndterer viser verdien som hendelsesmålet (et element).

I skjermbildet over er den grå delen selve dokumentet, og Utviklerverktøy markerte gjeldende linje med JavaScript. I konsollen ser du resultatene av inspeksjon av noen få variabler. Og til høyre for innholdsruten er "Scope Variables" -ruten, hvor du kan inspisere alle variablene og objektene i det nåværende omfanget.

Betingede bruddpunkter

Betingede bruddpunkter lar deg bryte når en viss tilstand er sant.

I ruten til høyre i panelet Kilder merker du XHR-brytepunkt-fanen. Klikk på "Add XHR Breakpoint" på ditt favoritt Ajax-aktiverte nettsted. Hvis du forlater feltet "URL inneholder", er tomme pauser på noen XHR be om.

Dette gir utviklere nye og kraftige muligheter. Vi kan navigere til et nettsted vi ikke har bygget, eller har hatt noe med, og bare start feilsøkingskode basert på visse hendelser og kriterier. Så pauser på Ajax-forespørsler er fint, men hvilke andre hendelser kan vi bryte på?

Event Listener Breakpoints

Kilden panelet har et pek og klikk-grensesnitt for å sette breakpoints som matcher bestemte hendelse lyttere. Vær oppmerksom på at brudd på en bestemt hendelse bare virker når den aktuelle siden lytter etter den hendelsen. Hvis vi bryter på Kontroll> Endre størrelse arrangement, som har kode som følgende, sikrer at koden bryter når hendelsen brenner:

window.onresize = funksjon (e) console.log (e); ;

Så, når bryter på bestemte hendelser som er nyttige?

Breakpoints fortsetter mellom sidelaster.

  • Når du spiller det nye HTML5-spillet, og du vil vite hva som skjer i hovedspillet. Prøv å sette inn Be om animasjonsramme og Timer hendelse lyttere og sjekk ut hva som skjer i hver hendelse.
  • At det nye, lydløse JavaScript-pluginet som legger ut siden på en vinduesformat, virker ganske kult. Men som utviklere ønsker vi å vite hva koden gjør når vi endrer størrelsen på vinduet. Prøv å sette Control> Resize event listener breakpoint, og du kan bare gjøre det. Merk: Du må nok sannsynligvis gå gjennom en masse bibliotekskode. Prøv det på jQuery-versjonen av Masonry-pluginet, og legg merke til hvordan du går gjennom koden på et resize-brytepunkt, ender opp med å ta deg gjennom mange jQuery-internaler.
  • Mange nettsteder, inkludert GMail, lar brukeren lime inn innhold. Utklippstavlen> Paste breakpoint vil være nyttig i dette tilfellet.
  • Andre nyttige bruddpunktsalternativer inkluderer: skjemainnsending, kopieringsdata, DOM-mutasjonshendelser, enhetsorientering, nøkkelpresser, Ajax-forespørsler, museventiler (svever, flytter, klikker osv.), SetInterval, touchstarts og mer.

DOM Breakpoints

DOM Breakpoints-fanen viser breakpoints for DOM. En enkel måte å se dette på, er å finne et element som for eksempel når det er klikket, har det klassenavn eiendom endret. Finn elementet i element-panelet, høyreklikk det og gå til Bryt på> Egenskaper Modifikasjoner. Koden vil nå brytes når elementets attributters verdier endres.

document.querySelector ('# button'). onclick = funksjon () this.setAttribute ('noen', 'ting'); ;

De ved trykk Hendelseshåndterer over teller som en attributtmodifisering, noe som presenterer noe som ligner dette:

Andre alternativer inkluderer:

  • Subtree modifikasjoner forekommer når noen knutepunkt i treet settes inn eller fjernes.
  • Egenskaper Modifikasjoner forekommer når du endrer et elements attributt.
  • Nodfjerning branner når du fjerner et element; for eksempel: element.remove ().

Merk: Chrome ser ut til å ha implementert fjernmetoden (). Noen nettlesere støtter ikke denne metoden. så, removeChild () må brukes i stedet.


Tidslinjepanel

Tidslinjepanelet er hvor du undersøker webappens ytelsesproblemer. Tidslinjepanelets primære formål er (når det skrives) for visning av informasjon, i motsetning til de andre panelene som lar deg utføre ødeleggende handlinger på siden.

Tider du kanskje vil bruke Timeline-panelet inkluderer:

  • Undersøker rullingsytelsen til siden din.
  • Prøver å forbedre animasjonens FPS.
  • Bygg mobile websider som sannsynligvis vises på en rekke gamle og nye enheter.
  • Gjør nettet jankfritt!
  1. Disse tre elementene (arrangementer, rammer og minne) presenterer forskjellige visninger, som hver illustrerer ulike biter av ytelsesrelatert informasjon.
  2. I dette rammer se, hver linje representerer en ramme gjengitt av nettleseren. Jo mer "full" hver vertikal bar er, jo verre ytelse, og de fargede delene i linjen forklares i legenden nederst på tidslinjepanelet.
  3. Du kan vanskelig kode et brytepunkt i koden din ved å bruke debugger; uttalelse i koden din.

  4. EN stikke innom for individuelle poster, og angir hvor lenge a ta opp tok for å utføre. Popover vil i noen tilfeller lenke til linjen med kode som forårsaket at posten skal utføres (dette er mer sannsynlig å skje med skriptbaserte poster).
  5. Listen over poster. Noen oppføringer utløses av vår kode; Andre poster kan skyldes brukerens handlinger. For eksempel rulle på siden forårsaker en "Paint" -hendelse.
  6. Hver plate har en tilsvarende rad som illustrerer hvor lang tid det tok å fullføre. Som vist på skjermbildet, kan du åpne noen barer ved å klikke på rullegardinpilen.
  7. Filtreringsalternativer som dikterer hvilke poster som skal vises. Alle poster vises som standard. Hvis du undersøker en bestemt type ytelsesproblem, kan du rydde opp registrerte poster ved hjelp av filtreringsalternativene.
  8. Som standard vises alle poster uansett hvor lenge de tok for å fullføre. Hvis du vil fiske ut de uvanlig lange postene, skift fra 'Alle' til en av de forhåndsdefinerte alternativene (for eksempel 15ms).
  9. Dette starter opptak (akkurat som i nettverkspanelet). Vær forsiktig med å la den spille inn i lang tid; du blir bombardert med data! Når jeg ser på rullingsproblemer, treffer jeg rekord, ruller siden i 2 sekunder og stopper deretter opptaket.

Innspilling

I del 2 kan du huske hvordan vi begynte å ta opp nettverksinformasjon før siden lastet for å fange så mange nettverksforespørsler som mulig. Vi gjør det ikke i tidslinjepanelet; Det er bedre å registrere korte og spesifikke hendelser. Vi trenger ikke nødvendigvis * gjøre * noe. Vi kunne legge det innspillingen for å se hva som skjer når brukeren er inaktiv, eller om noen timere kan kjøre i bakgrunnen.

Hendelsene, rammene og minnekortene er fylt under opptak; så vær sikker på å se gjennom dem for å finne de dataene du trenger. Minneseksjonen kan hjelpe deg med å fange potensielle minnelekkasjer.

Poster i rammen rammer

Opptak vises under og etter opptak. En god del data blir tatt inn i postene, som vist i det følgende bildet.

Dette skjermbildet viser noen nettverksforespørsler (blå), og noen "omberegne stiler" (lilla). Style omberegninger kan skje av en rekke årsaker. De gule postene er skript, og den grønne representerer sidegengivelse.

Hvis du klikker på eller svever over en plate, vises mer informasjon. For eksempel kan sveve over en "maling" -plate vise deg den delen av siden som ble malt.

Utviklerverktøy vil noen ganger koble en plate til et annet panel. For eksempel leder et bildes kobling til ressurspanelet med bildet i fokus, og en XHR-plate kan knytte til den tilsvarende oppføringen i nettverkspanelet.

Utviklerverktøy er snill nok til å varsle oss om potensielle optimaliseringer. Legg merke til det lille varselikonet til høyre for noen av postene i bildet nedenfor. Hvis det er bleknet, må du bore ned for å finne den faktiske platen som inneholder den nyttige informasjonen.

Popovers inneholder noen ganger en kobling til linjen med kode som forårsaket at posten skal vises. Men et advarselsvarsel: pen utskrift vil ikke alltid hjelpe - spesielt når man ser på tredjepartskode. Et alternativ er å sette et bruddpunkt på linjen du er tatt til. Når debuggeren har stoppet, kan du se variabelenes innhold for bedre å forstå kodeksens hensikt.

filtrering

Hvis du er som meg, ender du alltid med å fange opp mer data enn du trenger, men du kan danne et valg over de vertikale linjene (rammer) som bare viser postene som svarer til den valgte delen.

Hvis du bare bryr deg om lange poster, så sett et filter for å bare vise de lange postene. Du kan gjøre dette nederst på tidslinjepanelet.

Hvis rulling ikke føles så glatt som det burde, bør du vurdere å ekskludere 'Loading' (for eksempel nettverksposter). Når det blir sagt, hvis du vet at nettverksforespørsler brukes til å laste inn data på en side som brukerne uendelig ruller, vil du holde 'Laste inn' merket.

Ikke bruk filtrering bare fordi dataene vises for intense først. Ta deg tid til å forstå og undersøke hva dev-verktøyene viser deg. Du vil bruke tidslinjen for å bekrefte hvor avmatningene forekommer og sikte på å få de vertikale strekkene så tomme som mulig (hvitt mellomrom / tomgangstid).


Videre lesning

Hovedinnholdsruten har mange av funksjonene du vil finne i grunnleggende kodeditorer.

  • Den offisielle dokumentasjonen for Chrome Developer Tools inneholder dokumentasjon for hvert panel. Merk at mye av dokumentasjonen ble skrevet rundt april 2012, og noen av skjermbildene er utdaterte.
  • Utviklerverktøy for Chrome: Søk eller naviger til filer, metoder eller linjenumre. Snarveier for tekstsøk og utover er en kort, men nyttig, innlegg av @addyosmani.
  • Moderne webutvikling er et langt og interessant innlegg skrevet av @jtaby som dekker mange av dev-verktøyets paneler.
  • Min arbeidsflyt: Aldri å måtte forlate DevTools (av Remy Sharp) demonstrerer filsparingsfunksjonaliteten i kilden panelet.
  • Google I / O 2012 - Chrome Developer Tools Evolution er en time lang video som demonstrerer utviklerverktøyene. Det er veldig praktisk og informativt (av Sam Dutton og Pavel Feldman).
  • Vent, Chrome Dev Tools kan gjøre det? Noen gode tips om minne og ytelse, ved @igrigorik
  • The Breakpoint er en interessant ny videoserie av medlemmer av Chrome-teamet. Noen få episoder er allerede på YouTube! Episode # 1, Episode # 2, Episode # 3 og Episode # 4 .. Det presenteres av ulike medlemmer, inkludert: Paul Irish, Paul Lewis, Addy Osmani og Sindre Sorhus.
  • Record, Examine, Fix er et detaljert utseende i Timeline-panelet, av Addy Osmani

Vet du om andre nyttige ressurser? Nevn det i kommentarene!