Chrome Dev Tools JavaScript en prestaties

In dit derde deel van onze Chrome Developer Tools-reeks zullen we bekijken hoe JavaScript moet worden aangepast en foutopsporen. Optimalisatie is een belangrijk onderdeel van het ontwikkelingsproces, vooral voor prestatie-kritische toepassingen. We zullen ook technieken bespreken om potentiële knelpunten in onze code te identificeren.

Net als in de vorige twee artikelen, zal ik me concentreren op de functies in de Chrome Canary-build (versie 26.0, vanaf dit schrijven). Ik behandel de Bronnen en Tijdlijn-panelen.


Bronnenpaneel

Het bronnenvenster is de beste plek voor JavaScript-foutopsporing. Dit paneel, in combinatie met het consolepaneel, zorgt voor een extreem krachtig hulpmiddel! Het is een point-and-click-interface waarmee u de JavaScript-uitvoering kunt onderbreken en alle variabelen en objecten in de huidige scope kunt inspecteren.

  1. Het bronnenpaneel. Als u niet zoveel scripts ziet als u verwacht, vernieuwt u de pagina met het Bronnenpaneel geopend.
  2. Dit deelvenster kan het ook zijn verborgen, -Auto verborgen of vast. Klik op het kleine pictogram rechts van 'Inhoudsscripts' om tussen deze statussen te schakelen. Dit formaat kan worden aangepast.
  3. Het tabblad Bronnen in het linkerdeelvenster; waarschijnlijk is dit tabblad meestal geopend. De bronnen die worden vermeld, zijn gescheiden door een subdomein en u kunt CSS, JavaScript en HTML binnen het tabblad verwachten.
  4. Misschien vindt u het handig om uw CSS en JavaScript in de Developer Tools te bewerken.

  5. Het tabblad Inhoudscripts (niet actief in de schermafbeelding) kan aanvankelijk veel vreemd geschreven scripts weergeven. Dit zijn in feite Chrome-extensies die op de pagina zijn geladen. Dit is handig voor het opsporen van fouten in werkelijke uitbreidingen. Anders kunt u voorkomen dat u ze ziet door uw pagina in een incognitovenster te openen; de meeste extensies zijn standaard uitgeschakeld in de incognitomodus.
  6. Het hoofdvenster van de inhoud geeft de inhoud van het geselecteerde script weer. Door meerdere scripts te selecteren, wordt een interface met tabbladen gemaakt die lijkt op een IDE.
  7. Dit paneel bevat subpanelen die nuttige JavaScript-foutopsporingshulpprogramma's bieden. Aan de bovenkant van het venster staan ​​de pictogrammen om door uw code te bladeren.
  8. Watch Expressions doet precies dat, het 'let op' uitdrukkingen die je hebt ingetypt. Als je merkt dat je de waarde van de deze sleutelwoord in de verschillende stadia van een JavaScript-programma, dat kan kijk maar de deze sleutelwoord om de verschillende waarden in de loop van de tijd te zien. Klik op de knop Toevoegen om een ​​expressie toe te voegen. Als een expressie niet wordt bijgewerkt, klikt u op de kleine vernieuwingsknop naast de knop Toevoegen.
  9. XHR-onderbrekingspunten stellen ons in staat om de uitvoering van JavaScript-code te stoppen bij het doen van een Ajax-aanvraag. We krijgen nog meer controle over dit gedrag door een waarde op te geven in het veld 'Onderbreking wanneer URL bevat', dat wordt weergegeven wanneer u op de knop Toevoegen klikt. Als u geen waarde opgeeft, wordt de foutopsporing geactiveerd elke XHR verzoek.
  10. Gebeurtenissen voor gebeurtenisbelemmeringen stellen u in staat om onderbrekingspunten in te stellen voor specifieke gebeurtenissen. De schermafbeelding bevat alleen de categorieën op het hoogste niveau. 'Timer' heeft bijvoorbeeld de volgende afzonderlijke luisterbreekpunten voor gebeurtenissen: 'Timer instellen', 'Timer wissen' en 'Timer geactiveerd'.
  11. Als u geminificeerde code tegenkomt, fungeert 'Pretty Print' als een JavaScript-beautifier.

Bronnen Tab

Op het tabblad bronnen worden bronnen weergegeven die zijn gegroepeerd in het subdomein waar ze worden weergegeven. Elke resource heeft een contextmenu (onthuld door rechts te klikken op de resource) met een reeks veelgebruikte opties. Eén optie is echter erg interessant: Lokale aanpassingen, waar we later naar zullen kijken.

Opmerking: u kunt de bronbestandlijst weergeven als een platte lijst (dus niet opgenomen in mappen gegroepeerd op subdomein) door 'Toon mappen' uit te schakelen in Instellingen> Algemeen.

Als u op een resource klikt, wordt deze in het hoofdvenster van de inhoud weergegeven. Vergeet niet de mooie afdrukmodus in te schakelen voor geminimaliseerde bronnen, omdat sommige minifiers variabelen hernoemen om de code moeilijker te begrijpen. Hopelijk zullen meer ontwikkelaars in de toekomst bronkaarten genereren, waardoor het gemakkelijker wordt om met verkleinde code te werken.

U kunt de meeste bestanden in het hoofdvenster van de inhoud bewerken en die wijzigingen worden onmiddellijk in de browser weergegeven. Nadat u wijzigingen in een resource hebt aangebracht, biedt het contextmenu u de mogelijkheid om te Opslaan (hoewel niet permanent) of Opslaan als (slaat een nieuwe versie lokaal op). Wanneer u met uw eigen lokale sites werkt, is het misschien handig om uw CSS en JavaScript in de Developer Tools te bewerken in plaats van met uw IDE. Wijzigingen opslaan, in dit geval, wijzigt het daadwerkelijke bronbestand. Hulpprogramma's zoals Tincr of chrome-devtools-autosave kunnen helpen bij het automatiseren van deze workflow.

Het contextmenu van de resource biedt ook de optie om de resource in het netwerkpaneel te onthullen.

herzieningen

Een revisie is een nieuw punt binnen de levensduur van een resource, waarop deze is aangepast. Door code te bewerken en op te slaan in het bronpaneel, wordt een nieuwe revisie gemaakt en wijzigingen in de stijl die in het paneel Elementen zijn aangebracht, activeren feitelijk een nieuwe revisie!

Nadat u een paar wijzigingen hebt aangebracht, kunt u met de rechtermuisknop op de resource klikken en Lokale wijzigingen selecteren. Hiermee wordt een nieuw deelvenster Lokale modificaties geopend met een diff van de originele en bewerkte bestanden. In het deelvenster Lokale modificaties kunnen we een gewijzigd bronbestand in zijn geheel terugdraaien (handig voor wanneer u een groot aantal ongewenste wijzigingen hebt aangebracht) door op 'terugzetten' naast de bestandsnaam te klikken.

Hoofddeelvenster

Developer Tools is zo vriendelijk om ons te attenderen op mogelijke optimalisaties.

Het hoofdvenster van de inhoud bevat veel van de functies die u zou vinden in bewerkers van basiscodes: regelnummers, accentuering van syntaxis, de mogelijkheid om tabbladen te maken en functies voor 'ongedaan maken'. Hoewel het niet overeenkomt met een volwaardige IDE, is het niet slecht voor snelle bewerking.

breekpunten

Met onderbrekingspunten kunnen we de uitvoering van JavaScript-code stoppen en de huidige omgeving inspecteren. Bijvoorbeeld: neem aan dat we een simpele hebben voor lus die items op een array duwt. Ons doel is om de innerlijke werking binnen elke iteratie van de lus precies te begrijpen. We kunnen heel gemakkelijk gebruiken console.log om de variabelen te loggen die we willen inspecteren. Hoewel deze techniek u de gewenste resultaten zou geven, is het zeker niet de meest efficiënte foutopsporingstechniek. Door gebruik te maken van onderbrekingspunten, kunnen we de uitvoering van de code onderbreken in de voor loop en inspecteer alle variabelen binnen het bereik van de context.

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

Om een ​​breekpunt toe te voegen, klikt u op het regelnummer; u kunt ook met de rechtermuisknop op het regelnummer klikken en de optie "Breekpunt toevoegen" kiezen. Stel na het instellen van uw onderbrekingspunt de pagina opnieuw in en merk op dat onderbrekingen blijven bestaan ​​tussen het laden van de pagina. Als de code nog moet worden uitgevoerd (het onderbrekingspunt is bijvoorbeeld ingesteld in een gebeurtenishandler voor klikken), kunt u de code uitvoeren zonder een pagina te vernieuwen.

U kunt een breekpunt in uw code hard coderen met behulp van de debugger; verklaring in uw code. Developer Tools (en de meeste JavaScript-foutopsporingsprogramma's) herkennen dit als een onderbrekingspunt.

Wanneer een breekpunt wordt bereikt, wordt de pagina grijs en de coderegel blauw. Op dit punt kunnen we op de escape-toets drukken om het consolepaneel weer te geven. Wat interessant is, is dat de code geschreven en uitgevoerd in de console (terwijl gepauzeerd op een breekpunt) daadwerkelijk wordt uitgevoerd in de momenteel gepauzeerde context! Typisch, de deze sleutelwoord verwijst naar het globale venster voorwerp; terwijl het bekijken deze in een Klik gebeurtenishandler toont de waarde als het gebeurtenisdoel (een element).

In de bovenstaande schermafbeelding is het grijze gedeelte het document zelf en hebben Developer Tools de huidige regel JavaScript gemarkeerd. In de console ziet u de resultaten van het inspecteren van een paar variabelen. Rechts van het inhoudvenster bevindt zich het deelvenster "Scope Variables", waar u alle variabelen en objecten in het huidige bereik kunt inspecteren.

Voorwaardelijke breekpunten

Voorwaardelijke breekpunten laten je breken wanneer een bepaalde voorwaarde waar is.

In het rechterdeelvenster van het paneel Bronnen ziet u het tabblad XHR-onderbrekingspunten. Klik op 'Add XHR Breakpoint toevoegen' op uw favoriete Ajax-site. Als u in het veld 'URL bevat' lege pauzes opgeeft elke XHR verzoek.

Dit biedt ontwikkelaars nieuwe en krachtige mogelijkheden. We kunnen navigeren naar een site die we niet hebben gebouwd, en we hebben er geen betrokkenheid bij gehad en we beginnen met het debuggen van code op basis van bepaalde gebeurtenissen en criteria. Dus pauzeren op Ajax-verzoeken is leuk, maar met welke andere gebeurtenissen kunnen we doorbreken?

Gebeurtenisbelemmeringsbreekpunten

Het bronnenpaneel heeft een point-and-click-interface voor het instellen van onderbrekingspunten die overeenkomen met bepaalde gebeurtenislisteners. Merk op dat het doorbreken van een bepaalde gebeurtenis alleen werkt wanneer de betreffende pagina naar die gebeurtenis luistert. Als we breken op de Controle> Formaat wijzigen gebeurtenis, met code zoals het volgende zorgt ervoor dat de code breekt wanneer het evenement vuurt:

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

Dus wanneer is het nuttig om bepaalde gebeurtenissen te doorbreken?

Breekpunten blijven bestaan ​​tussen het laden van pagina's.

  • Bij het spelen van dat nieuwe HTML5-spel en je wilt weten wat er speelt in de hoofdgame-loop. Probeer het Vraag animatiekader aan en timer gebeurtenis luisteraars en bekijk wat er gaande is in elk evenement.
  • Die nieuwe responsieve JavaScript-plug-in die de pagina mooi weergeeft na het resizen van een venster lijkt best cool. Maar als ontwikkelaars willen we weten wat de code doet wanneer we het formaat van het venster wijzigen. Probeer het breekpunt Controle> Formaat gebeurtenislistener in te stellen, en u kunt precies dat doen. Notitie: U zult hoogstwaarschijnlijk veel bibliotheekcode moeten doorlopen. Probeer het in de jQuery-versie van de Masonry-plug-in en merk op hoe het doorlopen van de code bij een breekpunt met nieuwe grootte uiteindelijk een heleboel van de jQuery-internals doorloopt.
  • Op veel websites, waaronder GMail, kan de gebruiker inhoud plakken. Het breekpunt Klembord plakken is in dit geval handig.
  • Andere handige onderbrekingspunten zijn onder meer: ​​formulierinzending, kopieergegevens, DOM-mutatiegebeurtenissen, apparaatoriëntatie, toetsaanslagen, Ajax-verzoeken, muisgebeurtenissen (zweven, verplaatsen, klikken enz.), SetInterval, aanraakstappen en meer.

DOM-breekpunten

Op het tabblad DOM-onderbrekingspunten worden onderbrekingspunten voor de DOM weergegeven. Een eenvoudige manier om dit in actie te zien is om een ​​element te vinden dat, bijvoorbeeld wanneer erop wordt geklikt, het element heeft naam van de klasse eigendom veranderd. Zoek het element in het deelvenster Elementen, klik er met de rechtermuisknop op en ga naar Break On> Attributen wijzigen. De code zal nu breken wanneer de waarden van de attributen van dat element veranderen.

document.querySelector ('# knop'). onclick = function () this.setAttribute ('some', 'thing'); ;

De bij klikken gebeurtenishandler hierboven telt als een attribuutwijziging, die iets soortgelijks vertoont als dit:

Andere opties zijn:

  • Subtree-aanpassingen Ophouden wanneer een knoop in de boom wordt ingevoegd of verwijderd.
  • Kenmerken Modificaties Ophouden bij het wijzigen van het attribuut van een element.
  • Knooppuntverwijdering vuurt bij het verwijderen van een element; bijvoorbeeld: element.remove ().

Notitie: Chrome lijkt de methode remove () te hebben geïmplementeerd. Sommige browsers ondersteunen deze methode niet; dus, removeChild () moet in plaats daarvan worden gebruikt.


Tijdlijnpaneel

In het deelvenster Tijdlijn onderzoekt u de prestatieproblemen van uw webtoepassing. Het primaire doel van het tijdlijnpaneel is (op het moment van schrijven) voor het bekijken van informatie, in tegenstelling tot de andere panelen waarmee u destructieve acties op de pagina kunt uitvoeren.

Tijden die u mogelijk wilt gebruiken in het tijdlijnpaneel zijn:

  • Onderzoek naar de schuifprestaties van uw pagina.
  • Probeert de FPS van je animatie te verbeteren.
  • Mobiele webpagina's bouwen die waarschijnlijk op verschillende oude en nieuwe apparaten worden bekeken.
  • Het web jankvrij maken!
  1. Deze drie items (Gebeurtenissen, Frames en Geheugen) presenteren verschillende weergaven, die elk verschillende stukjes prestatiegerelateerde informatie illustreren.
  2. In deze frames weergave, vertegenwoordigt elke balk een frame dat wordt weergegeven door de browser. Hoe meer 'vol' elke verticale balk is, hoe slechter de prestaties en de gekleurde gedeelten in de balk worden uitgelegd in de legenda onder aan het deelvenster Tijdlijn.
  3. U kunt een breekpunt in uw code hard coderen met behulp van de debugger; verklaring in uw code.

  4. EEN popover voor individuele records, met details over hoe lang een record nam om uit te voeren. De popover zal in sommige gevallen verwijzen naar de regel met code die de record heeft uitgevoerd (dit gebeurt waarschijnlijker met op script gebaseerde records).
  5. De lijst van archief. Sommige records worden geactiveerd door onze code; andere records kunnen worden veroorzaakt door de acties van de gebruiker. Als u bijvoorbeeld door de pagina scrolt, wordt een 'Paint'-gebeurtenis veroorzaakt.
  6. Elke record heeft een bijbehorende rij die de duur van het voltooien illustreert. Zoals in de schermafbeelding wordt getoond, kunt u enkele balken openen door op de vervolgkeuzepijl te klikken.
  7. Filteropties die bepalen welke records moeten worden weergegeven. Alle records worden standaard getoond. Als u een bepaald type prestatieprobleem onderzoekt, kunt u de opgenomen records opschonen door de filteropties te gebruiken.
  8. Standaard worden alle records weergegeven, ongeacht hoe lang ze hebben geduurd om te voltooien. Als u die ongewoon lange records wilt uitvissen, wijzigt u van 'Alles' naar een van de vooraf gedefinieerde opties (zoals 15ms).
  9. Hiermee start de opname (net als in het paneel Netwerk). Wees op je hoede als je het voor een lange periode laat opnemen; je wordt bestookt met data! Wanneer ik scrolproblemen bekijk, druk ik op opnemen, scrol de pagina gedurende 2 seconden en stop dan met opnemen.

opname

In deel 2 herinnert u zich misschien hoe we begonnen met het vastleggen van netwerkinformatie voordat de pagina werd geladen om zo veel mogelijk netwerkverzoeken vast te leggen. We doen dat niet in het Tijdlijn-paneel; we kunnen beter korte en specifieke evenementen opnemen. We hoeven niet noodzakelijk iets te doen. We kunnen de opname laten staan ​​om te kijken wat er gebeurt als de gebruiker inactief is of als er timers op de achtergrond actief zijn.

De tabbladen Events, Frames en Memory worden gevuld tijdens het opnemen; dus, kijk zeker door ze om de gegevens te vinden die u nodig heeft. De geheugensectie kan u helpen potentiële geheugenlekken op te vangen.

Records op het tabblad Frames

Records worden weergegeven tijdens en na opnames. Een redelijke hoeveelheid gegevens wordt vastgelegd in de records, zoals weergegeven in de volgende afbeelding.

Dit screenshot toont enkele netwerkverzoeken (blauw) en een paar 'herbereken stijlen' (paars). Herberekeningen van stijl kunnen om een ​​aantal redenen plaatsvinden. De gele records zijn scripts en groen staat voor paginaweergave.

Klikken op of zweven boven een record geeft meer informatie weer. Als u bijvoorbeeld boven een 'verf'-record zweeft, wordt mogelijk het gedeelte van de pagina dat is geverfd weergegeven.

Ontwikkelaarstools koppelen soms een record aan een ander paneel. De koppeling van een afbeelding leidt u bijvoorbeeld naar het Resources-venster met die afbeelding in focus en een XHR-record kan een koppeling bevatten naar het overeenkomstige item in het netwerkpaneel.

Developer Tools is zo vriendelijk om ons te attenderen op mogelijke optimalisaties. Let op het kleine meldingspictogram rechts van een aantal records in de volgende afbeelding. Als deze is vervaagd, moet u een analyse uitvoeren om het daadwerkelijke record te vinden dat de nuttige informatie bevat.

Popovers bevatten soms een link naar de regel code die ervoor zorgde dat de record werd weergegeven. Maar een woord van waarschuwing: mooi afdrukken zal niet altijd helpen - vooral als je kijkt naar code van derden. Een optie is om een ​​onderbrekingspunt in te stellen op de regel waar je naartoe wordt gebracht. Nadat de foutopsporing is onderbroken, kunt u de inhoud van de variabele bekijken om de intentie van de code beter te begrijpen.

filtering

Als je op mij lijkt, eindig je altijd meer gegevens dan je nodig hebt, maar je kunt een selectie vormen over de verticale balken (frames) die alleen de records weergeeft die overeenkomen met het geselecteerde deel.

Als u alleen om langdurige records geeft, stel dan een filter in om alleen die lange records weer te geven. U kunt dit onderaan in het tijdlijnpaneel doen.

Als het scrollen niet zo soepel aanvoelt als het zou moeten, overweeg dan het 'Laden' (bijvoorbeeld netwerkrecords) uit te sluiten. Dat gezegd hebbende, als u weet dat netwerkverzoeken worden gebruikt om gegevens in een pagina te laden zodat gebruikers oneindig kunnen scrollen, moet u 'Laden' ingeschakeld houden.

Pas het filteren niet toe alleen omdat de gegevens aanvankelijk te intens lijken. Neem de tijd om te begrijpen en te onderzoeken wat de hulpmiddelen voor ontwikkelaars je laten zien. U zult de tijdlijn willen gebruiken om te bevestigen waar de vertragingen plaatsvinden en ernaar streven om die verticale balken zo leeg mogelijk te krijgen (witruimte / niet-actieve tijd).


Verder lezen

Het hoofdvenster van de inhoud bevat veel van de functies die u zou vinden in bewerkers van basiscodes.

  • De officiële documentatie voor Chrome-ontwikkelaarstools bevat documentatie voor elk panel. Merk op dat veel van de documentatie rond april 2012 werd geschreven en dat sommige van de schermafbeeldingen verouderd zijn.
  • Chrome-ontwikkelaarstools: zoeken of navigeren naar bestanden, methoden of regelnummers. Snelkoppelingen voor tekst zoeken en verder is een korte, maar nuttige, bericht door @addyosmani.
  • Modern Web Development is een lang en interessant bericht geschreven door @jtaby dat veel van de panels van de dev tools beslaat.
  • Mijn workflow: nooit meer DevTools verlaten (door Remy Sharp) toont de functionaliteit voor het opslaan van bestanden in het bronnenpaneel.
  • Google I / O 2012 - Chrome Developer Tools Evolution is een video van een uur waarop de ontwikkelaarstools worden getoond. Het is zeer praktisch en informatief (door Sam Dutton en Pavel Feldman).
  • Wacht, kan Chrome Dev Tools DAT? Enkele geweldige tips over geheugen en prestaties, door @igrigorik
  • Het breekpunt is een interessante nieuwe videoserie van leden van het Chrome-team. Een paar afleveringen staan ​​al op YouTube! Aflevering # 1, Aflevering # 2, Aflevering # 3 en Aflevering # 4 .. Het wordt gepresenteerd door verschillende leden waaronder: Paul Irish, Paul Lewis, Addy Osmani & Sindre Sorhus.
  • Record, Examine, Fix is ​​een gedetailleerde kijk in het Tijdlijn-paneel, door Addy Osmani

Kent u nog andere nuttige bronnen? Noem het in de comments!