Коротка відповідь
juniorReact — це UI‑бібліотека, яка використовує Virtual DOM для мінімізації реальних оновлень браузера. Virtual DOM — це віртуальна копія реального DOM, що дозволяє швидко порівнювати стан і застосовувати лише мінімальні зміни. Shadow DOM ізолює стилі та структуру компоненту, забезпечуючи кращий контроль над CSS‑інкапсуляцією.
Повне пояснення
Що це і навіщо
-
Virtual DOM – абстрактна, віртуальна репрезентація реального DOM. React створює дерево Virtual DOM після кожного рендеру, а потім порівнює його з попереднім за допомогою алгоритму diffing. Результатом є список мінімальних змін, які застосовуються до реального DOM.
-
Shadow DOM – частина Web Components, що створює ізольований піддерево DOM і CSS‑контекст. Це дозволяє компоненту мати власні стилі, не впливаючи на глобальний CSS.
Ключові принципи/терміни
- Diffing algorithm – рекурсивне порівняння вузлів, що мінімізує кількість DOM‑операцій.
- Reconciliation – процес синхронізації Virtual DOM з реальним.
- Batched updates – React збирає кілька змін у один пакет, щоб уникнути багатьох рендерів.
Як це працює
- Компонент виконує
render(), повертаючи JSX. - React трансформує JSX у Virtual DOM‑вузли (об’єкти).
- Після наступного рендеру React порівнює нове дерево з попереднім.
- На основі diff‑результату оновлює лише ті вузли, що змінилися.
Практика і реалізація
function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
У цьому прикладі лише текст кнопки оновлюється, а інші атрибути залишаються незмінними.
Тестування
- Unit:
@testing-library/react+ Jest для перевірки, що компонент рендериться з очікуваним текстом. - Integration:
react-test-rendererдля snapshot‑тестів Virtual DOM.
Дизайн‑рішення
- Використання
React.memoдля запобігання зайвим рендером. - Підтримка
keyу списках для правильного diff‑інструменту.
Производительность і масштабирование
- Пакетні оновлення (
flushSync) зменшують кількість рендерів. useDeferredValueдозволяє відкладати важкі обчислення.
Безпека і приватність
- Virtual DOM не виконує небезпечних скриптів; безпечний рендер JSX.
- Shadow DOM ізолює стилі, що зменшує ризик CSS‑ін’єкцій.
Особливості в контексті React
- Відсутність прямого доступу до реального DOM у функціональних компонентах.
ReactDOM.createPortalдозволяє рендерити в інші частини DOM, не порушуючи Virtual DOM.
Оптимізація та типові помилки
- Необхідність
keyу списках. - Перевантаження стану в компоненті, що викликає зайві рендери.
- Використання
useCallback/useMemoдля стабільності функцій.
Диагностика
- Якщо UI «завис» після оновлення, перевірте
React DevTools→ Performance tab. - Пошукайте зайві рендери за допомогою
why-did-you-render.
Альтернативи
- Vue.js використовує аналогічний Virtual DOM.
- Svelte компілює компонент у прямий DOM‑маніпулятор, що може бути швидшим в деяких випадках.
Крайні випадки
- Великий список без
key→ повний рендер. - Синхронні запити у
useEffect→ блокування UI. - Відсутність
React.StrictMode→ дублювання рендерів у dev‑режимі. - Перевантаження стану в
useState→ непотрібні оновлення. - Використання
dangerouslySetInnerHTML→ XSS‑ризик. - Необхідність
ReactDOM.unstable_batchedUpdatesу колекціях. - Відсутність
useRefдля DOM‑елементів → повторні створення. - Переважання
classзамістьclassName→ помилки рендеру.