W tym samouczku poznasz podstawowy proces debugowania problemów z JavaScriptem w DevTools. Przeczytaj lub obejrzyj filmową wersję tego samouczka.
Odtworzenie błędu
Znalezienie sekwencji działań, które konsekwentnie powodują błąd, to zawsze pierwszy krok w procesie debugowania.
- Otwórz ten pokaz demo w nowej karcie.
- W polu Numer 1 wpisz
5
. - W polu Numer 2 wpisz
1
. - Kliknij Dodaj numer 1 i numer 2. Etykieta pod przyciskiem to
5 + 1 = 51
. Wynik powinien wynosić6
. To jest błąd, który chcesz naprawić.
W tym przykładzie wynik działania wyrażenia 5 + 1 wynosi 51. Powinien wynosić 6.
Poznawanie interfejsu panelu Źródła
Narzędzia deweloperskie zawierają wiele różnych narzędzi do różnych zadań, takich jak zmiana CSS, profilowanie szybkości wczytywania strony i monitorowanie żądań sieciowych. W panelu Źródła możesz debugować kod JavaScript.
Otwórz Narzędzia deweloperskie i otwórz panel Źródła.
Panel Źródła składa się z 3 sekcji:
- Karta Strona z drzewem plików. Tutaj znajduje się lista wszystkich plików, których potrzebuje strona.
- Sekcja Edytor kodu. Po wybraniu pliku na karcie Strona wyświetla się jego zawartość.
Sekcja Debuger. różne narzędzia do sprawdzania kodu JavaScript strony.
Jeśli okno Narzędzi deweloperskich jest szerokie, domyślnie Debugger znajduje się po prawej stronie Edytowania kodu. W tym przypadku karty Zakres i Obserwuj dołączają do sekcji Punkty przerwania, Stos wywołania i innych jako sekcje, które można zwinąć.
Wstrzymanie kodu za pomocą punktu przerwania
Typową metodą debugowania takiego problemu jest wstawianie do kodu wielu instrukcji console.log()
, aby sprawdzać wartości podczas wykonywania skryptu. Na przykład:
function updateLabel() {
var addend1 = getNumber1();
console.log('addend1:', addend1);
var addend2 = getNumber2();
console.log('addend2:', addend2);
var sum = addend1 + addend2;
console.log('sum:', sum);
label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
}
Metoda console.log()
może się sprawdzić, ale punkty zerwania mogą przyspieszyć ten proces. Punkt przerwania umożliwia wstrzymanie kodu w środku jego wykonywania i sprawdzenie wszystkich wartości w danym momencie. Punkty kontrolne mają kilka zalet w porównaniu z metodą console.log()
:
- W przypadku
console.log()
musisz ręcznie otworzyć kod źródłowy, znaleźć odpowiedni kod, wstawić instrukcjeconsole.log()
, a następnie ponownie załadować stronę, aby zobaczyć komunikaty w konsoli. Dzięki punktom przerwania możesz wstrzymać działanie programu w odpowiednim miejscu kodu, nawet nie znając jego struktury. - W instrukcjach
console.log()
musisz wyraźnie określić każdą wartość, którą chcesz sprawdzić. Dzięki punktom kontrolnym DevTools wyświetla wartości wszystkich zmiennych w danym momencie. Czasami na kod wpływają zmienne, o których nawet nie wiesz.
Krótko mówiąc, punkty przerwania mogą pomóc Ci znaleźć i naprawić błędy szybciej niż metoda console.log()
.
Jeśli zastanowisz się nad działaniem aplikacji, możesz założyć, że nieprawidłowa suma (5 + 1 = 51
) jest obliczana w słuchaczu zdarzeń click
powiązanym z przyciskiem Dodaj liczbę 1 i 2. Dlatego warto wstrzymać kod w okresie, w którym wykonywany jest odbiorca click
. Punkty przerwania detektora zdarzeń umożliwiają to:
- W sekcji Debugger kliknij Przystanki detektora zdarzeń, aby rozwinąć tę sekcję. Narzędzia deweloperskie wyświetlają listę rozwijanych kategorii zdarzeń, takich jak Animacja i Schowek.
- Obok kategorii zdarzeń Mysz kliknij Rozwiń. Narzędzia deweloperskie wyświetlają listę zdarzeń myszy, takich jak click i mousedown. Obok każdego zdarzenia znajduje się pole wyboru.
Zaznacz pole Klik. Narzędzia deweloperskie są teraz skonfigurowane tak, aby automatycznie się wstrzymywać, gdy zostanie wykonany dowolny detektor zdarzeń
click
.W wersji demonstracyjnej ponownie kliknij Dodaj numer 1 i numer 2. Narzędzia deweloperskie wstrzymuje demonstrację i wyróżnia wiersz kodu w panelu Źródła. Narzędzia deweloperskie powinny być wstrzymane na tym wierszu kodu:
function onClick() {
Jeśli masz wstrzymany kod na innym wierszu, naciśnij
(w tłumaczeniu „wznów”) Resume Script Execution (w tłumaczeniu „Wznów wykonywanie skryptu”) do momentu, aż wstrzymasz kod na właściwym wierszu.
Punkty przerwania detektora zdarzeń to tylko jeden z wielu typów punktów przerwania dostępnych w DevTools. Warto zapoznać się ze wszystkimi typami, ponieważ każdy z nich pomaga jak najszybciej debugować różne scenariusze. Aby dowiedzieć się, kiedy i jak używać poszczególnych typów punktów przerwania, przeczytaj artykuł Wstrzymywanie kodu za pomocą punktów przerwania.
Przeglądanie kodu
Jedną z częstych przyczyn błędów jest nieprawidłowa kolejność wykonywania skryptów. Dzięki tej funkcji możesz krok po kroku śledzić wykonywanie kodu, wiersz po wierszu, i dowiedzieć się, gdzie dokładnie jest on wykonywany w innej kolejności niż oczekiwałeś/oczekiwałaś. Wypróbuj tę funkcję już teraz:
W panelu Źródła w DevTools kliknij
Przejdź do następnego wywołania funkcji, aby krok po kroku sprawdzać wykonywanie funkcjionClick()
. Narzędzia deweloperskie podświetlają ten wiersz kodu:if (inputsAreEmpty()) {
Kliknij
Pominij następne wywołanie funkcji.Narzędzia deweloperskie wykonują
inputsAreEmpty()
bez wchodzenia do nich. Zauważ, że Narzędzia deweloperskie pomijają kilka wierszy kodu. Dzieje się tak, ponieważ wartość zwracana przez instrukcjęinputsAreEmpty()
to „fałsz”, więc blok kodu instrukcjiif
nie został wykonany.
To podstawowa koncepcja przechodzenia przez kod. Jeśli spojrzysz na kod w funkcji get-started.js
, zobaczysz, że błąd występuje prawdopodobnie w funkcji updateLabel()
. Zamiast przechodzić przez każdy wiersz kodu, możesz użyć innego typu punktu przerwania, aby wstrzymać kod bliżej prawdopodobnego miejsca błędu.
Ustawianie punktu przerwania w kodzie
Punkty przerwania w kodzie to najczęstszy typ punktu przerwania. Jeśli chcesz wstrzymać odtwarzanie w określonym miejscu w kodzie, użyj punktu przerwania w kodzie:
Sprawdź ostatni wiersz kodu w pliku
updateLabel()
:label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
Po lewej stronie kodu widać numer tego konkretnego wiersza kodu, którym jest 32. Kliknij 32. Narzędzia deweloperskie umieszczają niebieską ikonę nad 32. Oznacza to, że na tej linii znajduje się punkt przerwania kodu. Narzędzie DevTools zawsze wstrzymuje działanie przed wykonaniem tego wiersza kodu.
Kliknij wyświetlają wartości zmiennych
Wznów wykonywanie skryptu. Skrypt będzie się wykonywać, dopóki nie dotrze do wiersza 32. W wierszach 29, 30 i 31 Narzędzia deweloperskieaddend1
,addend2
isum
w pobliżu ich deklaracji.
W tym przykładzie DevTools zatrzymuje się na punkcie kontrolnym w wierszu kodu na linii 32.
Sprawdzanie wartości zmiennych
Wartości addend1
, addend2
i sum
wyglądają podejrzanie. Są ujęte w cudzysłowie, co oznacza, że są to ciągi znaków. To dobra hipoteza wyjaśniająca przyczynę błędu. Teraz czas na zebranie dodatkowych informacji. W DevTools znajdziesz wiele narzędzi do analizowania wartości zmiennych.
Metoda 1. Sprawdź zakres
Gdy wstrzymasz działanie w danym wierszu kodu, na karcie Zakres zobaczysz, jakie zmienne lokalne i globalne są zdefiniowane w tym momencie wykonania, wraz z wartością każdej z nich. W razie potrzeby wyświetla też zmienne zamknięcia. Gdy nie wstrzymasz działania żadnego wiersza kodu, karta Zakres będzie pusta.
Aby edytować wartość zmiennej, kliknij ją dwukrotnie.
Metoda 2. Obserwowanie wyrażeń
Za pomocą karty Obserwuj możesz sprawdzać wartości zmiennych na przestrzeni czasu. Watch nie ogranicza się tylko do zmiennych. Na karcie Obserwuj możesz zapisać dowolne poprawne wyrażenie JavaScript.
Wypróbuj tę funkcję już teraz:
- Kliknij kartę Oglądaj.
- Kliknij Dodaj wyrażenie do obserwacji.
- Wpisz
typeof sum
. - Naciśnij Enter. Narzędzia deweloperskie wyświetlają
typeof sum: "string"
. Wartość po prawej stronie dwukropka to wynik wyrażenia.
Zrzut ekranu pokazujący kartę Oglądaj (w prawym dolnym rogu) po utworzeniu wyrażenia typeof sum
.
Jak podejrzewaliśmy, zmienna sum
jest interpretowana jako ciąg znaków, podczas gdy powinna być liczbą. Potwierdziłeś/Potwierdziłaś, że jest to przyczyna błędu.
Sposób 3. Konsola
Oprócz wyświetlania wiadomości console.log()
możesz też używać konsoli do wykonywania dowolnych instrukcji JavaScript. Jeśli chodzi o debugowanie, możesz używać konsoli do testowania potencjalnych poprawek błędów. Wypróbuj tę funkcję już teraz:
- Jeśli panel konsoli nie jest otwarty, naciśnij Escape, aby go otworzyć. Otworzy się ono u dołu okna narzędzi dla deweloperów.
- W Konsoli wpisz
parseInt(addend1) + parseInt(addend2)
. To polecenie działa, ponieważ jesteś wstrzymany(-a) na wierszu kodu, w którym są dostępne zmienneaddend1
iaddend2
. - Naciśnij Enter. Narzędzie DevTools ocenia instrukcję i wypisuje
6
, czyli oczekiwany wynik.
Zrzut ekranu pokazujący panel Konsoli po ocenie parseInt(addend1) + parseInt(addend2)
.
Stosowanie poprawki
Znaleziona została poprawka błędu. Teraz wystarczy wypróbować rozwiązanie, edytując kod i ponownie uruchamiając demonstrację. Aby zastosować poprawkę, nie musisz opuszczać DevTools. Kod JavaScriptu możesz edytować bezpośrednio w interfejsie DevTools. Wypróbuj tę funkcję już teraz:
- Kliknij Wznów wykonywanie skryptu.
- W Edytorze kodu zastąp wiersz 31,
var sum = addend1 + addend2
, wierszemvar sum = parseInt(addend1) + parseInt(addend2)
. - Aby zapisać zmiany, naciśnij Command + S (Mac) lub Control + S (Windows, Linux).
- Kliknij Wyłącz punkty przerwania. Jego kolor zmieni się na niebieski, co oznacza, że jest aktywny. Gdy to ustawienie jest włączone, Narzędzia deweloperskie ignorują wszystkie ustawione przez Ciebie punkty kontrolne.
- Wypróbuj wersję demonstracyjną z różnymi wartościami. Demo oblicza teraz poprawnie.
Dalsze kroki
W tym samouczku pokazaliśmy tylko 2 sposoby ustawiania punktów przerwania. Narzędzia deweloperskie oferują wiele innych sposobów, m.in.:
- Warunkowe punkty przerwania, które są uruchamiane tylko wtedy, gdy podany przez Ciebie warunek jest spełniony.
- punkty przerwania w przypadku wykrytych lub niewykrytych wyjątków.
- punkty kontrolne XHR, które są uruchamiane, gdy żądany adres URL pasuje do podanego przez Ciebie podciągu.
Aby dowiedzieć się, kiedy i jak używać poszczególnych typów punktów przerwania, przeczytaj artykuł Wstrzymywanie kodu za pomocą punktów przerwania.
W tym samouczku nie omówiliśmy kilku opcji sterowania krokami kodu. Więcej informacji znajdziesz w artykule Przejdź kursorem nad linią kodu.