nmk

Практична робота №6 (2 години)

Тема: Налагодження коду (Debugging). Використання React DevTools та точок зупинки (breakpoints) у браузері для пошуку помилок у стані, властивостях та допущених логічних неточностей під час рендеру.

Мета: Навчитися виявляти та усувати логічні помилки у React-додатках без використання застарілого методу console.log; опанувати роботу з розширенням React Developer Tools для інспектування стану (state) та виявлення проблем рендеру; навчитися ставити точки зупинки (Breakpoints) у вкладці Sources браузера для покрокового виконання та пошуку “невидимих” багів.

Необхідні інструменти: Браузер (Google Chrome або Edge), встановлене офіційне розширення [React Developer Tools], локально запущений проєкт з попередніх лабораторних/практичних робіт (npm run dev), редактор VS Code.

План заняття

  1. Встановлення та знайомство з інтерфейсом React Developer Tools (вкладки Components та Profiler).
  2. Інспектування проблеми типів даних у State (на прикладі лічильника лайків).
  3. Аналіз попереджень React у консолі та DevTools на прикладі помилки дублювання ключів (key).
  4. Знайомство з панеллю Chrome DevTools (Sources) для налагодження коду.
  5. Розв’язання прихованої логічної помилки у фільтрації пошуку за допомогою Breakpoints та покрокового виконання.

Хід виконання роботи

Підготовка до роботи (для тих, хто не має готових компонентів)

Якщо у вас немає готової “Стрічки новин” з попередніх занять, створіть (або оновіть) два файли, щоб мати базу для виконання сьогоднішньої роботи.

src/components/Post.jsx

import { useState } from "react";

function Post({ id, title, content, author }) {
  const [likes, setLikes] = useState(0);

  const handleLike = () => {
    // Тут ми зробимо помилку у завданні №2
    setLikes(likes + 1);
  };

  return (
    <div style=>
      <h3>{title}</h3>
      <p>{content}</p>
      <small>Автор: {author}</small>
      <br />
      <button onClick={handleLike}>Like ({likes})</button>
    </div>
  );
}

export default Post;

src/components/Feed.jsx

import { useState } from "react";
import Post from "./Post";

const mockPosts = [
  {
    id: 1,
    title: "Вивчаємо React",
    content: "Основи компонентів.",
    author: "Іван",
  },
  {
    id: 2,
    title: "Хуки у React",
    content: "UseState та UseEffect - це важливо.",
    author: "Petro",
  },
];

const Feed = () => {
  const [searchTerm, setSearchTerm] = useState("");

  const filteredPosts = mockPosts.filter((post) => {
    const matchesSearch =
      post.content.toLowerCase().includes(searchTerm.toLowerCase()) ||
      post.author.toLowerCase().includes(searchTerm.toLowerCase());
    return matchesSearch;
  });

  return (
    <div>
      <h2>Стрічка новин</h2>
      <input
        type="text"
        placeholder="Пошук..."
        value={searchTerm}
        onChange={(e) => setSearchTerm(e.target.value)}
      />
      <div>
        {filteredPosts.length > 0 ? (
          filteredPosts.map((post) => <Post key={post.id} {...post} />)
        ) : (
          <p>Нічого не знайдено за вашим запитом.</p>
        )}
      </div>
    </div>
  );
};

export default Feed;

1. Налаштування React DevTools

Для інспектування React-компонентів можна використовувати два підходи:

Варіант А: Розширення для браузера (Рекомендовано)

  1. Відкрийте браузер (Google Chrome або Edge).
  2. Перейдіть до інтернет-магазину Chrome (Chrome Web Store).
  3. У пошуку введіть React Developer Tools (переконайтеся, що автор розширення — Meta або Facebook).
  4. Натисніть Встановити (Add to Chrome).
  5. Перезавантажте сторінку вашого локально запущеного проєкту React.

Варіант Б: Автономний додаток (Standalone App)

Якщо браузерне розширення конфліктує з іншими розширеннями або ви тестуєте мобільний вигляд:

  1. Встановіть інструмент глобально через термінал: npm install -g react-devtools
  2. Запустіть його виконавши в терміналі: react-devtools (відкриється окреме вікно).
  3. Щоб ваш React-додаток (Vite) міг передавати дані у це вікно, відкрийте файл index.html у корневій теці вашого проєкту.
  4. Додайте спеціальний скрипт у секцію <head> перед іншими тегами:
    <script src="http://localhost:8097"></script>
    
  5. Перезавантажте сторінку в браузері. Дані з’являться не в панелі F12, а у відкритому вікні автономного додатку.

У будь-якому з варіантів (після відкриття F12 або автономного вікна) ви отримаєте доступ до двох нових вкладок: ⚛️ Components та ⚛️ Profiler.

Перейдіть у вкладку Components. Вона показує поточну ієрархію React-компонентів, наприклад: App -> MainLayout -> Feed -> Post.

2. Пошук помилки типів (Type Coercion) у State

Уявімо ситуацію: розробник помилився при оновленні лічильника лайків у компоненті Post. Візуально текст додається дивним чином (наприклад, 01, 011).

Замість додавання console.log:

  1. Запустіть додаток і відкрийте Стрічку новин (Feed).
  2. Відкрийте панель ⚛️ Components у DevTools.
  3. Знайдіть компонент Post у дереві. У правій панелі знайдіть розділ hooks -> State.
  4. Спочатку там значення 0 (Number). Натисніть кнопку “Лайк” на сторінці.
  5. Значення в State зміниться на "01" (String). Висновок: DevTools миттєво підказує, що операція додавання перетворилася на конкатенацію рядків. Виправлення: у коді компонента необхідно змінити setLikes(likes + '1') на setLikes(likes + 1).

3. Попередження під час рендеру списків (Помилка Ключів)

Для забезпечення продуктивності React вимагає унікальні key для списків. Уявімо в Feed.jsx такий фрагмент:

// Навмисна помилка: хардкодований ключ для всього масиву
filteredPosts.map((post) => (
  <div key="duplicate-key" style=>
    <Post {...post} />
  </div>
));
  1. Компонент успішно завантажується, додаток не падає. Але він працює неоптимально.
  2. Відкрийте стандартну вкладку Console (Консоль). Ви побачите: Warning: Encountered two children with the same key, 'duplicate-key'.
  3. У налаштуваннях React DevTools (іконка шестірні -> General) увімкніть “Highlight updates when components render”.
  4. Спробуйте змінити фільтр. DevTools покаже (зеленими рамками), що React перемальовує зайві елементи, оскільки не може розрізнити їх через однакові ключі. Виправлення: Замінити "duplicate-key" на унікальний ідентифікатор, наприклад post.id.

4. Пошук логічної помилки за допомогою Breakpoints (Sources)

Що робити, якщо помилок у консолі немає, стан виглядає нормально, але функція не працює як очікується? Наприклад, пошук у стрічці новин завжди повертає “Нічого не знайдено”.

У Feed.jsx прихована така помилка (використання && замість ||):

// Логіка пошуку: вимагає одночасного збігу слова і в тексті, і в імені автора
const matchesSearch =
  post.content.toLowerCase().includes(searchTerm.toLowerCase()) &&
  post.author.toLowerCase().includes(searchTerm.toLowerCase());
  1. Перейдіть до стандартної вкладки браузера Sources.
  2. Натисніть Ctrl + P (або Cmd + P) і введіть Feed.jsx, щоб відкрити вихідний код компонента.
  3. Знайдіть рядок коду const matchesSearch = ....
  4. Клацніть зліва від номера цього рядка, щоб поставити блакитну позначку (Breakpoint).
  5. Натисніть клавіатуру, щоб ввести символ у рядок пошуку на сторінці.
  6. Браузер зупинить виконання коду (Paused in debugger) на цьому рядку.
  7. Наведіть курсором миші на post.content та searchTerm. DevTools покаже реальні значення змінних у пам’яті.
  8. Оскільки ви шукали одне слово (наприклад “React”), а оператор && вимагає цього слова і в імені автора (який, наприклад, “Іван”), змінна matchesSearch стає false.
  9. Натискайте F10 (Step over), щоб бачити покроковий рух коду далі.

Виправлення: заміна && (І) на || (АБО) миттєво лагодить пошук. (Примітка: для швидкої зупинки коду можна написати debugger; прямо у файлі VS Code).

Завдання для самостійного виконання

  1. У вашому єдиному репозиторії оберіть найбільш складний компонент, який працює зі станом (наприклад, Profile.jsx або форму логіну).
  2. За допомогою React DevTools (вкладка Components) знайдіть цей компонент, і вручну (натиснувши на значення у правій панелі розширення) змініть значення його State або Props “на льоту”. Зафіксуйте, як миттєво відреагує UI.
  3. Викличте нескінченний цикл рендеру у вашому компоненті (наприклад, написавши <button onClick={setLikes(likes + 1)}> замість передачі функції), зловіть помилку Too many re-renders і дослідіть стек виклику у консолі браузера.
  4. Додайте у функцію отримання даних (useEffect або обробник onClick) команду debugger;.
  5. Перезавантажте сторінку. Коли браузер зупиниться у панелі Sources, скористайтеся інструментами “Step Over” (F10) та “Step Into” (F11), щоб покроково пройтись логікою та дослідити панель “Scope” (Область видимості).

Контрольні запитання

  1. В чому полягає критична перевага використання React Developer Tools (Components) порівняно зі звичайним інспектуванням DOM-елементів (Elements) при пошуку помилок у React-додатку?
  2. Як відловити ситуацію, коли React виконує неоптимальний рендеринг списків через неправильне використання атрибута key?
  3. Поясніть алгоритм дій розробника при встановленні та використанні Breakpoint у вкладці Sources браузера Chrome. Що відбувається з виконанням програми в цей момент?
  4. Яке ключове слово (резервоване в JavaScript) можна написати безпосередньо у вихідному коді компонента, щоб змусити браузер автоматично зупинити виконання при відкритій панелі розробника?
  5. Що означають дії “Step Over”, “Step Into” та “Step Out” у панелі управління дебагером браузера (Sources)?