<StrictMode> - обгортка, яка в режимі розробки вмикає додаткові перевірки. У продакшен-збірці вона нічого не робить і нічого не коштує.
createRoot(document.getElementById('root')!).render(
<StrictMode>
<App />
</StrictMode>,
);
Шаблони Vite і більшості фреймворків вмикають її за замовчуванням.
Що вона робить:
1. Рендерить компоненти двічі. Функція компонента, ініціалізатори useState, функції useMemo та оновлювачі стану викликаються по два рази. Якщо результат різний - компонент нечистий: змінює щось зовнішнє під час рендеру.
function List({ items }) {
items.push({ id: 'extra' }); // мутація props - у StrictMode побачите два 'extra'
return items.map(...);
}
2. Запускає ефекти двічі при монтуванні: setup → cleanup → setup. Так React перевіряє, що ефект правильно прибирає за собою:
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect(); // без цього - два з'єднання
}, [roomId]);
Якщо ефект ламається від повторного запуску, він зламається й у реальному житті - при поверненні на сторінку, швидкому оновленні (Fast Refresh) чи в майбутніх можливостях React, що зберігають стан при прихованні компонентів.
3. Перевіряє колбеки ref так само: прив'язка - відв'язка - прив'язка.
4. Попереджає про застарілі API.
Типові «симптоми» в розробці:
console.logу компоненті друкує двічі (React DevTools можуть приглушувати друге виведення);- запит у
useEffectйде двічі - це нормально в розробці. Якщо він не скасовується й дає дублікати даних (два однакові записи черезPOSTв ефекті), проблема в коді, а не в StrictMode; - лічильник, збільшений в ефекті без очищення, показує 2.
Чого НЕ робити: вимикати StrictMode, щоб «прибрати подвійний запит». Правильне рішення - очищення в ефекті, скасування запиту (AbortController) або завантаження даних засобами фреймворку чи бібліотекою на кшталт TanStack Query.
Додатково: React Compiler і правила ESLint eslint-plugin-react-hooks знаходять ті самі порушення чистоти ще до запуску.