Что такое React.StrictMode и зачем его использовать?

JuniorReact · Frontend·Обновлено 12 августа 2026
Коротко
React.StrictMode — это инструмент разработки, который активирует дополнительные проверки и предупреждения для компонентов внутри него. Он не влияет на production-сборку и помогает выявлять потенциальные проблемы на ранних этапах.

React.StrictMode

React.StrictMode — это специальный компонент-обёртка, который включает набор дополнительных проверок и предупреждений во время разработки. Он не рендерит никакого видимого UI и не влияет на production-сборку — все проверки выполняются только в режиме development.

Что делает StrictMode

1. Двойной вызов некоторых функций

StrictMode намеренно вызывает дважды функции компонентов, функции обновления состояния, тело useState-инициализаторов и useMemo/useCallback. Это помогает обнаружить побочные эффекты, которые не должны присутствовать в render-фазе.

2. Предупреждения об устаревших API

StrictMode предупреждает об использовании устаревших методов жизненного цикла, таких как componentWillMount, componentWillReceiveProps, componentWillUpdate, а также о других deprecated-паттернах.

3. Проверка эффектов (React 18+)

Начиная с React 18, StrictMode дополнительно монтирует, размонтирует и снова монтирует каждый компонент, чтобы убедиться, что эффекты корректно очищаются и не оставляют утечек.

Пример использования

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root')!);
root.render(
  // Оборачиваем всё приложение в StrictMode
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

Можно оборачивать только часть дерева:

function App() {
  return (
    <div>
      <Header />
      {/* Проверяем только эту часть приложения */}
      <React.StrictMode>
        <Main />
      </React.StrictMode>
      <Footer />
    </div>
  );
}

Почему компоненты вызываются дважды

Это намеренное поведение для обнаружения непредсказуемых побочных эффектов. Pure-функции при вызове с одинаковыми аргументами должны давать одинаковый результат — двойной вызов проверяет эту инвариантность.

function BadComponent() {
  // Плохо: мутирует внешнюю переменную во время рендера
  externalArray.push('item'); // будет добавлен дважды в StrictMode!
  return <div>{externalArray.length}</div>;
}

function GoodComponent() {
  // Хорошо: рендер чистый, побочных эффектов нет
  const items = useMemo(() => computeItems(), []);
  return <div>{items.length}</div>;
}

Важные нюансы

  • StrictMode не ломает приложение — если поведение при двойном вызове отличается, это признак бага в коде, а не в StrictMode
  • В production двойного вызова нет
  • console.log внутри компонента будет вызываться дважды в dev-режиме — это нормально
  • Create React App и Next.js включают StrictMode по умолчанию

Что хочет услышать интервьюер

Кандидат понимает, что StrictMode работает только в development и не влияет на production

Кандидат знает, что компоненты рендерятся дважды намеренно — для поиска побочных эффектов

Кандидат может объяснить, какие конкретно проблемы помогает найти StrictMode (deprecated API, нечистые рендеры, утечки эффектов)

Кандидат понимает, что StrictMode можно применять к части дерева, а не только ко всему приложению

Кандидат не путает двойной рендер в dev с реальной проблемой производительности

Пример: Подключение StrictMode в точке входа

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);

root.render(
  // StrictMode включает дополнительные проверки только в development
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

Пример: Пример нечистого рендера, который обнаружит StrictMode

// Плохо: мутация внешнего массива во время рендера
const log: string[] = [];

function BadComponent() {
  // В StrictMode вызовется дважды — log получит 2 записи вместо 1
  log.push(`render at ${Date.now()}`);
  return <div>Renders: {log.length}</div>;
}

// Хорошо: нет побочных эффектов во время рендера
function GoodComponent() {
  const [count, setCount] = React.useState(0);

  // Побочный эффект изолирован в useEffect
  React.useEffect(() => {
    log.push(`mounted`);
    return () => {
      log.push(`unmounted`);
    };
  }, []);

  return <div>Count: {count}</div>;
}

Типичные ошибки

Думают, что StrictMode влияет на production-сборку и замедляет приложение

Считают двойной вызов функций багом и пытаются отключить StrictMode вместо того, чтобы исправить нечистый код

Не знают, что в React 18 добавилось повторное монтирование/размонтирование компонентов

Путают StrictMode с TypeScript strict-режимом — это разные инструменты

Не понимают, зачем нужна чистота render-функции и почему мутации во время рендера опасны

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее