Experiență modernă de depanare Partea 2


În partea 1, am văzut cum să scriem și să executam JavaScript folosind DevTools. În partea 2, vom analiza depanarea JavaScript și adoptarea unui flux de lucru astfel încât rezolvarea erorilor JavaScript și diagnosticarea problemelor devin mai eficiente.

Depistarea JavaScript folosind DevTools

Cuvânt cheie pentru depanator

Puteți utiliza cuvântul cheie de depanare direct în codul dvs. pentru a invoca capacitățile de depanare (dacă există) ale runtime-ului JavaScript. Efectul adăugării cuvântului cheie debugger în codul dvs. este identic cu setarea manuală a punctului de întrerupere prin interfața DevTools. În Chrome, debugger cuvântul cheie nu are efect în timp ce DevTools este închis.

Instrumente de depanare

Controalele de depanare oferă un control cu ​​granulație fină asupra debitului. Folosiți-le atunci când ați întrerupt la un punct de întrerupere pentru a vă naviga eficient prin codul JavaScript. Fiecare control de depanare enumerat în această secțiune corespunde unui buton din DevTools pe care îl puteți selecta în timp ce întrerupeți la un punct de întrerupere.

Continua

Lăsăm punctul de întrerupere curent și reluați executarea codului ca în mod normal. Acest lucru nu afectează alte întreruperi care nu au fost încă întrerupte.

Utilizare Continua când punctul curent de întrerupere nu este util și doriți ca execuția codului să fie reluată în mod normal.

Pas peste

Pas prin linie de linie (câte o linie pe clic) până la atingerea unui apel de funcție. În acest moment, apelul pentru funcții este pasul "peste" și nu intrați în apelul respectiv.

Utilizare Pas peste când ceea ce încercați să rezolvați este cuprins în funcție de funcția curentă și nu aveți nevoie să vă uitați la apelurile pentru funcții externe.

Pășește înăuntru

Similar cu Pas peste, cu excepția faptului că, în acest caz, navigați la apelurile externe de funcții accesând prima lor linie.

Utilizare Pășește înăuntru atunci când vă interesează linia de execuție a liniei, precum și orice apeluri de funcții externe.

Iesi afara

Când intri într-o funcție, Iesi afara va continua să execute restul care codifică funcțiile, cu toate acestea nu este depanat.

Utilizare Iesi afara când nu aveți niciun interes pentru restul funcției actuale și doriți să continuați depanarea în afara acesteia.

The Stack Call

Stivă de apel este activă când este întreruptă la un punct de întrerupere. Calea de execuție care duce la punctul de întrerupere curent este prezentată în stiva de apel, apelul de sus fiind cel mai recent.

Fiecare apel din stack conține:

  • numele funcției
  • numele fișierului care conține funcția
  • linia de cod în care funcția există

Faceți clic pe orice apel din interiorul stivei pentru a naviga până la punctul din codul sursă cu linia relevantă evidențiată. Pentru a copia o urmă de stivă în clipboard, Click dreapta la un apel și selectați Trasați urmărirea stivei. În meniul contextual al stivei de apel, puteți de asemenea să selectați Restartați cadrul.

Funcțiile de rescriere în timp ce sunt întrerupte la un punct de întrerupere

Luați în considerare cazul de utilizare că debuggerul a întrerupt la jumătatea distanței printr-o funcție de apel invers declanșată de un handler de evenimente de tip clic și încercați să depanați motivul pentru care recuperarea ţintă nu pare să funcționeze așa cum era de așteptat. 

Vedeți că a fost făcută o încercare de a accesa proprietatea țintă ca parte din acest cuvânt cheie, dar vă reamintesc că este o parte proprietate a obiectului eveniment trecut ca un argument la funcția de apel invers. 

Puteți rescrie funcția utilizând Live Edit pentru a verifica dacă modificările dvs. funcționează și JavaScript nou este injectat în motorul V8.

monitorEvents

Când scrieți un handler de evenimente pentru un eveniment, cum ar fi defilarea, puteți începe prin utilizarea console.log pentru a vedea ce arată argumentul trecut (obiectul evenimentului). Un sfat rapid pentru a realiza acest lucru este de a utiliza monitorEvents comenzi rapide. Lipiți următorul cod în Panoul consolei apoi parcurgeți pagina:

monitorEvents (fereastră, "redimensionare");

Observați că obiectul evenimentului este înregistrat în consola gata pentru inspecție.

debug

Când doriți ca depanatorul să întrerupă pe prima linie a unei funcții în timpul executării, puteți face una dintre următoarele acțiuni:

  • Adăugați un punct de întrerupere prin interfața DevTools.
  • Adăugați o declarație de depanator la această funcție.

O altă tehnică este de a executa debug (fn) care face parte din API-ul de linie de comandă. Funcția are funcția pe care doriți să o depanați drept argument și veți rupe pe prima linie a executării acelei funcții.

Întrerupeți accesul proprietății

Această tehnică vă permite să întrerupeți depanatorul atunci când o proprietate a unui obiect care vă interesează este accesat în orice mod (o citire sau scriere). Pentru a rupe atunci când o proprietate a unui obiect este citită sau scrisă, executați următoarele (prin Panoul consolei sau Snippeturi):

Object.defineProperty (document.body, 'scrollTop', get: function () debugger;, set: function (val) debugger;);

Se aplică un getter și un setter la scrollTop proprietate a document.body obiect. În introducerea și setterul personalizat, instrucțiunea de depanare există. Puteți utiliza, de asemenea Object.observe pentru a sparge adăugările de proprietăți pentru un anumit obiect:

var ceasMe = ; Object.observe (watchMe, funcția () debugger;);

Condiționate puncte de blocare Utilizând console.log

Cuvinte cheie de depanare deoparte, pentru a seta un breakpoint prin DevTools, puteți face clic pe linia de cod pe care doriți să o rupeți în cadrul jgheabului de linie. Această metodă de setare a punctului de întrerupere are funcționalitate suplimentară: ați setat un punct de întrerupere condiționat care va instrui DevTools să întrerupă la un punct de întrerupere numai dacă o anumită expresie este evaluată la adevărat. De exemplu, puteți seta un pauză condiționată pentru a întrerupe numai dacă există un argument de eroare.

Pentru a seta un punct de întrerupere condițional:

  1. Click dreapta în jgheabul de linie.
  2. Selectați Adăugați punct de întrerupere condiționat.
  3. Introduceți expresia pe care doriți să o evaluați pe DevTools.
  4. presa introduce.

De asemenea, puteți utiliza tehnica de întrerupere condiționată pentru a introduce rapid o console.log ca expresie de evaluat. De cand console.log evaluează pentru nedefinit, DevTools nu se oprește, dar din moment ce expresia este încă executată, puteți verifica valoarea variabilelor în acest fel.

Utilizarea expresiilor de vizionare

Când instrumentul de depanare este întrerupt la un punct de întrerupere, puteți să aduceți mesajul Panoul consolei în modul Drawer folosind Evadare cheie. Codul pe care îl introduceți este evaluat în același context ca și punctul în care sunteți întrerupt, ceea ce înseamnă că variabilele care sunt în scop vor fi accesibile pentru dvs..

O expresie de ceas este un instrument pentru a simplifica tehnica inspecției periodice (prin console.log de exemplu) de variabile scop. Expresiile de ceas este un panou din panoul Surse. Puteți adăuga sau elimina expresii de vizionare folosind La care se adauga și Minus butoane. Un obiect tipic de urmărit este acest obiect; Observați cum se referă la un obiect fereastră globală atunci când nu sunteți întrerupt la un punct de întrerupere.

Uita-te la Expresii va actualiza, de obicei, în timp ce pas cu cod. Cu toate acestea, dacă nu faceți clic pe Reîmprospăta buton.

excepţii

Luați în considerare următorul script:

funcția a () return b ();  funcția b () return c ();  funcția c () console.trace ('The Trace'); return 42;  A();

Există trei funcții declarate. Funcţie A funcția de apeluri b, apoi funcția b funcția de apeluri c. Scriptul inițiază lanțul cu un apel pentru a funcționa A.  console.trace declarați jurnalele în consolă o urmă de stivă din punctul în care a fost apelată metoda. Utilizând console.trace afișează ieșirea de utilizare console.trace.

Rețineți că numele mesajelor și liniile în care sunt denumite sunt afișate în mesajul de urmărire. Puteți să faceți clic pe numărul liniei care urmează să fie luată până la punctul său din Codul sursă, prin panoul Surse. Această tehnică funcționează și pentru fragmente.

Debuggerul oferă diferite moduri de abordare a excepțiilor:

  • Întrerupeți-vă pe excepții necontrolate.
  • Întrerupeți-vă de excepții prinse și neîncetate.
  • Nu întrerupeți excepțiile.

2. Depanarea din exterior în

Atunci când trebuie să depanați un site pe care nu îl cunoașteți, puteți utiliza o altă tehnică de depanare. În această abordare, vă alăturați evenimentelor pe care credeți că le va declanșa și cereți DevTools să întrerupă astfel de evenimente dacă și când apar. Există două categorii de puncte de intrare în afara:

  • Modificări DOM
  • Event Breaker de ascultare a evenimentelor

Pauză pe modificările DOM

Aveți sarcina de a depana o pagină web, în ​​special DOM. Nodurile sunt adăugate și eliminate în timpul ciclului de viață al paginii și trebuie să inspectați JavaScript care face acest lucru. Setați un breakpoint DOM cu următorii pași:

  • Faceți clic dreapta pe un nod DOM din panoul Elemente.
  • Selectați un punct de întrerupere DOM preferat din Opriți-vă meniul contextual.
  • În timp ce sunteți întrerupt la un punct de întrerupere, puteți vedea un mesaj care explică motivul pentru care debuggerul a întrerupt, după cum se arată în Expunere de motive pentru întreruperea la un punct de întrerupere.

De fiecare dată când setați un breakpoint DOM, îl puteți porni și opri cu ușurință la DOM punct de intersecție în panoul din Panoul elementelor. În acest panou, fiecare punct de întrerupere pe care l-ați setat este listat și puteți interacționa cu acest panou în următoarele moduri:

  • Schimbați și dezactivați caseta de selectare pentru a activa sau a dezactiva punctul de întrerupere.
  • Faceți clic pe numele nodului (care este subliniat) pentru a naviga la el în vizualizarea arborelui DOM.
  • Click dreapta și selectați Eliminați toate punctele de interferență DOM pentru a dezactiva și elimina toate punctele de interferență DOM.

Modificări subtree 

Descriere: O modificare a subtreei apare atunci când arborele unui nod rădăcină (care are setul de puncte de întrerupere) este modificat. Aceasta poate include adăugarea sau eliminarea nodurilor.

Utilizare caz: Un gol div containerul este prezent în DOM, iar o solicitare Ajax se întâmplă la încărcarea paginii care adaugă noduri noi containerului original. Adăugați un punct de întrerupere a modificării Subtree pe container pentru a vedea punctul exact în codul care adaugă noi noduri la DOM.

Exemple de mesaje: Întrerupt la a Subtree Modificat punct de pornire setat pe corp, deoarece descendentul său p a fost eliminat. Sau: Întreruptă pe Subtree Modificat punct de pornire setat pe div # părinte, deoarece un nou copil a fost adăugat la acel nod.

Modificări ale atributelor 

Descriere: Modificarea unui atribut declanșează când un nume sau o valoare de atribut pe un nod este adăugat, eliminat sau modificat. Aceasta include toate atributele, cum ar fi clasădate-*, sau stil.

Utilizare caz: O schimbare vizuală se întâmplă pe pagină într-un punct aparent aleatoriu în timp și tu restrângeți acest lucru într-o clasă care este setată dinamic pe elementul corpului. Doriți să investiga cauza acestei adăugări de clase dinamice.

Exemplu de mesaj: Întreruptă pe un Atributul modificat punct de pornire setat pe p.

Îndepărtarea nodului 

Descriere: Un punct de întrerupere a nodului declanșează în punctul în care un nod este îndepărtat de la părinte care conține punctul de întrerupere stabilit.

Utilizare caz: Construiți o aplicație de listă de sarcini și doriți să confirmați că atunci când un utilizator șterge un element de rezolvat, acesta este, de asemenea, eliminat din DOM. Puteți stabili un punct de întrerupere a nodului pentru a vă asigura că acest comportament are loc.

Exemplu de mesaj: Întrerupt la a Nod eliminat div # container.

Event Breaker de ascultare a evenimentelor

În DevTools, sunt disponibile un număr de puncte de așteptare predefinite pentru Listener de evenimente. Acestea oferă puncte de intrare în JavaScript care aparține unei pagini.

Luați în considerare un simplu about: blank pagină. Setați a clic eveniment punct de ascultare a evenimentului pe această pagină, cu următorii pași:

  • Navigați la Event Breaker de ascultare a evenimentelor în panoul din Panoul sursei.
  • Deschide Șoarece Categorie Listener de evenimente.
  • Activați Clic ascultător de evenimente.

Ați stabilit acum un punct de întrerupere. Dacă faceți clic pe pagină, observați că nu se întâmplă nimic. Acum executați următoarea bucată de cod JavaScript în Panoul consolei.

document.addEventListener ("clic", console.log.bind (consola))

Când setați un punct de întrerupere pentru același eveniment pe care l-ați înregistrat pentru un ascultare de evenimente, debuggerul se oprește înainte de punctul în care se execută apelul de ascultare al evenimentului.

Puteți înregistra puncte de întrerupere pentru mai multe tipuri de evenimente, cum ar fi cronometrele, evenimentele touch și multe altele, care sunt listate în tabelul de mai jos.

Categorie Eveniment Exemple de evenimente

Animaţie

requestAnimationFrame, cancelAnimationFrame, animationFrameFired

Control

redimensiona, derulați, măriți, focalizați, estompați, selectați, schimbați, expediați, resetați

Clipboard

copiați, tăiați, lipiți, înainte de copiere, înainte, înainte de paste

Mutația DOM

DOMActivate, DOMFocusIn, DOMFocusOut, DOMAttrModified, DOMCharacterDataModificat, DOMNodeInserat, DOMNodeInsertedIntoDocument, DOMNodeRemoved, DOMNodeRemovedFromDocument, DOMSubtreeModified, DOMContentLoaded

Dispozitiv

dispozitivul de orientare, devicemotion

Trage si lasa

dragonter, dragover, dragleave, drop

Tastatură

tastatura, tastarea, apăsarea de taste, introducerea

Sarcină

încărcare, înainte de descărcare, descărcare, anulare, eroare, schimbare, popstate

Șoarece

clic, dblclick, mouse-ul, mouseup, mouseover, mouse-ul, mouseout, mouse-ul, roata

Cronometrul

setTimer, clearTimer, timerFired

Atingere

touchstart, touchmove, touchend, touchcancel

WebGL

webglErrorFired, webglWarningFired


Tehnica "depanare din exterior în" poate fi utilă atunci când trebuie să depanați un site web al cărui funcționalitate a fost spart sau chiar dacă sunteți curios în legătură cu modul în care lucrează ceva pe o pagină pe care o vizualizați.

3. Extensii

Există un număr de extensii Chrome, dintre care multe îmbunătățesc funcționalitatea DevTools. O listă cu caracteristici este găsită în Galeria de extensii DevTools.

Pre-procesare JavaScript DevTools

Pentru autorii programului DevTools Extension, caracteristica de preprocesare JavaScript este un subiect util pentru a afla despre. Preprocesorul poate intercepta codul sursă JavaScript înainte de a intra în motorul V8, ceea ce înseamnă că codul sursă JavaScript poate fi modificat prin intermediul DevTools înainte de a intra în VM, toate dintr-o extensie. 

Pe lângă capabilitățile de interceptare, API-ul de preprocesare are acces programatic pentru reîncărcarea surselor de script. O extensie poate, în orice moment al ciclului de viață, să reîncarce o sursă JavaScript fără a reîncărca pagina web originală.

4. Nod

Această secțiune acoperă câteva instrumente care oferă un anumit nivel de integrare între Node.js și DevTools Chrome.

Inspector nod

Există două părți la DevTools:

  • În față: Cu asta folosiți și interacționați. Acesta este compus din HTML, CSS și JavaScript.
  • Back-end: În cazul inspectării unei pagini în Google Chrome, back-end-ul se află în interiorul Chrome. Mesajele sunt transmise înapoi și înapoi prin intermediul Protocolului de depanare la distanță.

Orice aplicație poate implementa comunicarea prin intermediul protocolului de depanare la distanță și permite utilizatorilor săi să depaneze prin intermediul DevTools. Node Inspector este un astfel de instrument. După instalare, puteți rula orice script de nod folosind Node Inspector. Instrumentul pornește un server web care găzduiește front-ul DevTools. Această versiune specială a dispozitivului DevTools nu utilizează back-end-ul Chrome, ci mai degrabă propriul Node Inspector.

După cum puteți vedea în Node Inspector, DevTools este întrerupt la un punct de întrerupere. Stivă de apel se referă la apelurile executate în Node.js. Singura implicare a browserului este aici pentru interfața DevTools.

Nod Heapdump

Utilizați Node Heapdump pentru a face un instantaneu al heapului V8 la un moment dat în codul dvs. Starea curentă a heapului V8 este serializată și se transmite într-un fișier.

Comparați două instantanee de heap pentru a descoperi care obiecte nu sunt colectate de gunoi. Acest lucru este util pentru capturarea scurgeri de memorie.

Concluzie

Asta este pentru această serie din două părți despre o experiență modernă de depanare. Sperăm că în acest moment vă permiteți să creați și să depanați JavaScript în cadrul Chrome DevTools. Sunteți familiarizați cu fluxurile de lucru care pot ajuta la depanare și cunoașteți câteva sfaturi și trucuri atunci când vă ocupați de un site de producție pe care nu ați mai lucrat până acum. Asigurați-vă că ați încercat unele dintre tehnicile pe care le-ați învățat aici data viitoare când trebuie să depanați.

Mulțumesc că ați citit!

Cod