Jak debugować kod JavaScript w przeglądarce?

Lucjan Michałowski

Wprowadzenie

Debugowanie jest niezbędną umiejętnością dla każdego programisty JavaScript. Obejmuje ono proces identyfikowania i naprawiania błędów, bugów i nieoczekiwanych zachowań w kodzie. Skuteczne techniki debugowania nie tylko oszczędzają czas, ale także poprawiają jakość kodu i zwiększają ogólną produktywność rozwoju. W tym artykule omówię kilka technik ułatwiających debugowanie kodu JavaScript.

Jak efektywnie korzystać z console.log()?

Jeśli chodzi o debugowanie kodu JavaScript, console.log() jest nieocenionym narzędziem w arsenale programisty. Umożliwia ona wysyłanie informacji do konsoli przeglądarki, zapewniając wgląd w stan kodu i pomagając w skutecznym identyfikowaniu i naprawianiu błędów. Najbardziej podstawowym zastosowaniem console.log() jest wysyłanie prostych komunikatów do konsoli. Umieszczając instrukcje console.log() w strategicznych miejscach kodu, można śledzić przepływ wykonania i monitorować wartości zmiennych i obiektów:

console.log("Hello, world!");
console.log(variableName);

let price = 9.99;
console.log("Price:", price);

Rejestrując wartość zmiennej price, można łatwo zweryfikować jej aktualny stan podczas wykonywania. Zwróć uwagę na brak spacji po Price:, zostanie ona automatycznie dodana przez console.log().

console.log() obsługuje użycie symboli zastępczych formatowania ciągów znaków, umożliwiając wyświetlanie wartości dynamicznych z dodatkowym kontekstem. Można dołączyć symbole zastępcze, takie jak %s dla ciągów znaków, %d dla liczb, %o dla obiektów:

let name = "John";
let age = 30;
console.log("Name: %s, Age: %d", name, age);

Spowoduje to sformatowanie danych wyjściowych poprzez zastąpienie %s wartością name i %d wartością age, zapewniając bardziej opisowy wpis do logów.

Jako alternatywę można również użyć ciągów szablonów:

let name = "John";
let age = 30;
console.log(`Name: ${name}, Age: ${age}`);

let name = „John”; let age = 30; console.log(`Name: ${name}, Age: ${age}`);

const employee = {
    firstName: "John",
    lastName: "Doe",
    address: {
        city: "London",
        country: "United Kingdom"
    }
};
console.log("Employee:", employee);

Rejestrując obiekt employee, można rozszerzyć dane wyjściowe w konsoli, aby łatwiej zbadać jego właściwości i zagnieżdżone obiekty.

Poziomy błędów

W konsoli dostępnych jest kilka metod, które umożliwiają rejestrowanie komunikatów o różnych poziomach ważności. Metody te obejmują:

  • console.debug(): Wyświetla komunikat na poziomie debugowania. Jest on zwykle używany do celów informacyjnych podczas programowania, aby zapewnić dodatkowe szczegóły.
  • console.log(): Wyświetla ogólny komunikat dziennika. Jest powszechnie używany do ogólnych informacji i celów debugowania.
  • console.info(): Wyświetla komunikat informacyjny. Służy do dostarczania ogólnych informacji o przebiegu wykonywania lub stanie programu.
  • console.warn(): Wyświetla komunikat ostrzegawczy. Wskazuje na potencjalny problem lub coś, czym należy się zająć, ale niekoniecznie powoduje awarię programu.
  • console.error(): Wyświetla komunikat o błędzie. Wskazuje on, że w programie wystąpił błąd, który może spowodować zakończenie programu lub jego nieprawidłowe działanie.

Korzystając z różnych poziomów, łatwiej jest filtrować i priorytetyzować komunikaty w oparciu o ich znaczenie podczas debugowania i rozwiązywania problemów.

Wyświetlanie obiektów w tabeli

Aby wyświetlić obiekt w formacie tabeli w konsoli przeglądarki, można użyć metody console.table(). Metoda ta pobiera tablicę lub obiekt jako dane wejściowe i wyświetla je jako tabelę w konsoli.

Oto przykład użycia funkcji console.table() do wyświetlenia obiektu w formacie tabeli:

const employee = {
    firstName: 'John',
    lastName: "Doe",
    position: 'Frontend Developer'
};
console.table(employee);

Po uruchomieniu tego kodu w konsoli przeglądarki, wyświetli on employee jako tabelę z kolumnami dla nazw właściwości (firstName, lastName, position) i odpowiadających im wartości.

Jeśli masz tablicę obiektów, możesz również użyć console.table(), aby wyświetlić ją jako tabelę:

const team = [
    { firstName: 'John', lastName: "Doe", position: 'Frontend Developer' },
    { firstName: 'Jane', lastName: "Doe", position: 'Graphic Designer' },
    { firstName: 'Bill', lastName: "Smith", position: 'Backend Developer' },
];
console.table(team);

Spowoduje to wyświetlenie obiektu team jako tabeli, z każdym obiektem reprezentowanym jako wiersz w tabeli. Dokładny wygląd tabeli w konsoli może się różnić w zależności od przeglądarki i implementacji konsoli.

Grupowanie wpisów console.log()

Aby pogrupować wpisy dziennika za pomocą console.log(), można użyć metod console.group() i console.groupEnd(). Metody te umożliwiają tworzenie oznaczonych grup wpisów dziennika w konsoli przeglądarki, zapewniając uporządkowany i zorganizowany sposób debugowania kodu:

  • otwarcie grupy logów:

Aby rozpocząć nową grupę wpisów logów, należy użyć metody console.group(). Możesz przekazać etykietę lub opis jako argument, aby określić nazwę grupy. Na przykład:

console.group("Customer Details");

Spowoduje to utworzenie w konsoli grupy o nazwie „Customer Details”.

  • dodawanie wpisów logów w ramach grupy:

W grupie logów można użyć console.log(), aby dodać indywidualne wpisy logów związane z określoną grupą. Na przykład:

console.log("Name: John Doe");
console.log("Age: 28");
console.log("Email: johndoe@example.com");

Te logi pojawią się w grupie „Customer Details” w konsoli.

  • zagnieżdżanie grup logów:

Można również zagnieżdżać grupy logów w innych grupach, aby utworzyć hierarchiczną strukturę. Jest to przydatne, gdy chcesz uporządkować i skategoryzować wpisy logów w oparciu o różne aspekty kodu. Aby utworzyć zagnieżdżoną grupę, wystarczy wywołać console.group() wewnątrz istniejącej grupy. Na przykład:

console.group("Customer Details");
console.log("Name: John Doe");
console.log("Age: 30");

console.group("Address");
console.log("1 Main St");
console.log("London");
console.log("United Kingdom");
console.groupEnd();

console.groupEnd();

W tym przykładzie grupa „Adress” jest zagnieżdżona w grupie „Customer Details”, tworząc strukturę hierarchiczną.

  • zamknięcie grupy logów:

Aby zamknąć grupę logów i wskazać koniec określonej sekcji, użyj metody console.groupEnd(). Spowoduje to wizualne wyróżnienie końca grupy w konsoli. Upewnij się, że wywołujesz console.groupEnd() dla każdej zagnieżdżonej grupy w odwrotnej kolejności, w jakiej zostały otwarte. Na przykład:

console.groupEnd(); // Closes the "Address" group
console.groupEnd(); // Closes the "Customer Details" group

Te wywołania zamkną odpowiednie grupy i zakończą grupowanie dziennika.

  • zwijanie i rozwijanie grup:

Większość konsol przeglądarek umożliwia zwijanie i rozwijanie grup dzienników w celu lepszej widoczności i organizacji. Możesz kliknąć etykietę grupy lub ikonę strzałki obok niej, aby zwinąć lub rozwinąć zawartość grupy. Jest to szczególnie przydatne, gdy mamy do czynienia z dużą ilością wpisów dziennika.

Efektywne wykorzystanie funkcji console.group() i console.groupEnd() pozwala uporządkować wpisy logów w logiczne grupy, ułatwiając nawigację i analizę informacji debugowania. Takie podejście pomaga poprawić czytelność i przejrzystość danych wyjściowych konsoli.

Pomiar czasu w konsoli

Aby zmierzyć czas wykonania określonego bloku kodu lub funkcji, można użyć console.log(). Te timery pozwalają śledzić czas, jaki upłynął między dwoma punktami w kodzie, pomagając zoptymalizować aplikację. Oto jak to zrobić:

  • uruchomienie timera:

Aby uruchomić timer, użyj metody console.time(), przekazując unikalną etykietę jako argument. Etykieta ta będzie identyfikować konkretny timer. Na przykład:

console.time("timer 1");

Spowoduje to uruchomienie timera oznaczonego jako „timer 1” i rozpoczęcie pomiaru upływającego czasu.

  • wykonanie kodu:

Następnie wykonaj blok kodu lub funkcję, dla której chcesz zmierzyć czas wykonania. Może to być określona sekcja kodu lub funkcja, która wykonuje określone zadanie.

  • zatrzymanie timera:

Aby zatrzymać timer i obliczyć czas, który upłynął, użyj metody console.timeEnd(), przekazując tę samą unikalną etykietę, która została użyta do uruchomienia timera. Na przykład:

```javascript
console.timeEnd("timer 1");
```

Spowoduje to wyświetlenie na konsoli czasu, który upłynął w milisekundach, z dokładnością co do milisekundy, wraz z etykietą.

  • Wiele timerów: Możesz używać wielu timerów jednocześnie, aby mierzyć czas wykonywania różnych sekcji lub funkcji w kodzie. Upewnij się tylko, że każdy timer ma unikalną etykietę podczas uruchamiania i zatrzymywania.

Dzięki strategicznemu wykorzystaniu timerów console.log można zebrać dokładne informacje o czasie i uzyskać wgląd w wydajność kodu, a także zwiększyć ogólną wydajność aplikacji.

Wypisanie stacktrace

Możesz natknąć się na sytuację, w której będziesz musiał podać informacje o wywołaniach funkcji, które doprowadziły do określonego punktu w kodzie. W większości nowoczesnych środowisk JavaScript, stacktraces są domyślnie przechwytywane. Jeśli jednak chcesz upewnić się, że stacktraces są dostępne, upewnij się, że wyłączyłeś wszelkie ustawienia lub optymalizacje, które mogą usunąć informacje o śledzeniu stosu. Możesz umieścić console.trace() w miejscu, w którym chcesz rejestrować śledzenie.

function foo() {
    bar();
}

function bar() {
    console.trace();
}

foo();

Wywołanie funkcji foo() spowoduje wywołanie funkcji bar(), która z kolei zarejestruje stacktrace za pomocą funkcji console.trace(). Stacktrace pokaże wywołania funkcji od funkcji foo() najwyższego poziomu do punktu, w którym wywołana została funkcja console.trace().

Zachowanie logów

Pamiętaj, że komunikaty konsoli są usuwane przy każdej nawigacji po stronie, chyba że zaznaczysz opcję Zachowaj dziennik w ustawieniach konsoli.

Korzystanie z debuggera przeglądarki.

Debuger przeglądarki jest potężnym narzędziem wbudowanym w przeglądarki internetowe i umożliwia programistom sprawdzanie, analizowanie i debugowanie stron internetowych i aplikacji internetowych. Zapewnia kompleksowy zestaw funkcji i funkcjonalności, które pomagają w rozwiązywaniu problemów, zrozumieniu wykonania kodu i optymalizacji wydajności.

Słowo kluczowe debugger

Słowo kluczowe debugger jest wbudowaną funkcją w JavaScript, która umożliwia wstrzymanie wykonywania kodu i rozpoczęcie procesu debugowania. Gdy interpreter JavaScript napotka instrukcję debugger, automatycznie wstrzyma wykonywanie i otworzy narzędzia debuggera przeglądarki (jeśli są dostępne) lub uruchomi punkt przerwania, jeśli debugger jest dołączony.

Aby korzystać z debuggera, należy umieścić w kodzie instrukcję, w której program ma zostać wstrzymany:

function test() {
    // Some code here
    debugger; // Program pauses here for debugging
    // More code here
}

Gdy instrukcja debugger zostanie napotkana podczas wykonywania kodu, spowoduje to wstrzymanie programu w tym momencie. Jeśli debugger jest dostępny i podłączony (np. narzędzia deweloperskie przeglądarki są otwarte), debugger zostanie uruchomiony i będziesz mieć dostęp do różnych funkcji debugowania. Możesz sprawdzać zmienne, przechodzić przez kod, ustawiać punkty przerwania, obserwować wyrażenia i nie tylko. Dokładne funkcje i interfejs mogą się nieznacznie różnić w zależności od używanej przeglądarki.

Po sprawdzeniu stanu programu i zidentyfikowaniu wszelkich problemów można kontynuować wykonywanie kodu. Program wznowi działanie, dopóki nie osiągnie końca lub nie napotka innej instrukcji debugger.

Ważne jest, aby pamiętać, że słowo kluczowe debugger jest używane głównie do interaktywnego debugowania podczas programowania. Zaleca się usunięcie lub wyłączenie wszelkich instrukcji debugger przed wdrożeniem kodu do środowisk produkcyjnych.

Ustawianie punktów przerwania

W oknie debuggera można ustawić punkty przerwania dla kodu JavaScript. Gdy program napotka punkt przerwania, zawiesza wykonywanie, umożliwiając sprawdzanie zmiennych, przechodzenie przez kod i analizowanie jego zachowania w tym momencie.

Ustawianie punktów przerwania jest podobne do umieszczania instrukcji debugger w kodzie. Aby ustawić punkt przerwania, należy zazwyczaj przejść do zakładki „Źródła” lub „Debugger” w narzędziach deweloperskich przeglądarki. W widoku kodu źródłowego można kliknąć numer linii, w której wykonanie ma zostać wstrzymane. Alternatywnie, można kliknąć prawym przyciskiem myszy na linii i wybrać „Dodaj punkt przerwania” z menu kontekstowego. Po ustawieniu wyświetlany jest wizualny wskaźnik, taki jak czerwona kropka lub podświetlona linia, aby wskazać obecność punktu przerwania.

Narzędzia przeglądarki

Różne przeglądarki i środowiska debugowania mogą mieć dodatkowe funkcje i możliwości, dlatego warto zapoznać się z konkretnymi narzędziami debugowania dostępnymi w preferowanej przeglądarce lub zintegrowanym środowisku programistycznym (IDE).

Wnioski

Debugowanie kodu JavaScript jest niezbędną umiejętnością, która może znacznie usprawnić proces programowania. Stosując techniki takie jak console.log, wykorzystując narzędzia deweloperskie, ustawiając punkty przerwania i wykorzystując komunikaty o błędach, można skutecznie identyfikować i rozwiązywać problemy w kodzie JavaScript. Pamiętaj, aby podchodzić do debugowania z cierpliwością i dbałością o szczegóły, ponieważ jest to proces iteracyjny.

Poznaj mageek of j‑labs i daj się zadziwić, jak może wyglądać praca z j‑People!

Skontaktuj się z nami