Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 361новая вакансия за сутки·93 707вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 266
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 108
  • Облачные технологии14 073
  • QA вакансии3 460
  • Backend вакансии2 114
  • Инженер данных1 805
  • Продакт-менеджер1 266

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии986
  • AI вакансии955
  • Frontend вакансии745
  • Mobile вакансии44

По стеку

  • Go8 652
  • Java6 545
  • Node.js2 019
  • .NET1 721
  • Kotlin1 623
  • Rust1 453
  • C#710
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 763
  • DevOps вакансии6 060
  • Linux-инфраструктура5 492
  • Terraform / IaC4 261
  • CI/CD3 241
  • Мониторинг и Observability1 783
  • SRE566
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 140
  • Бизнес-аналитик930
  • Аналитик данных853
  • Системный аналитик154

Другие направления

  • Проджект-менеджер615
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 321
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 479
  • Работа в России3 913

По формату

  • Удалённые вакансии75 064
  • Релокация в США44 314
  • Гибридная работа12 393
  • Офисная работа7 089

По уровню

  • Senior вакансии42 691
  • Middle вакансии20 905
  • Junior вакансии6 727

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме ReactВсе вопросы
ReactSeniorТеория

Что такое reconciliation в React? Как работает алгоритм сравнения (diffing algorithm)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Reconciliation — эвристический O(n) алгоритм: разные типы = ремаунт, одинаковые типы = обновление атрибутов, key в списках = сопоставление по идентификатору. Fiber разбивает обход на прерываемую render-фазу и синхронную commit-фазу.

Демонстрация влияния key

// Плохо: React пересоздаёт все компоненты при вставке нового элемента в начало
const items = ['b', 'c', 'd'];
const bad = items.map((item, index) => <Item key={index} value={item} />);
// При добавлении 'a' в начало: index 0 = 'a' (было 'b') → React обновляет все три

// Хорошо: стабильный ключ = идентификатор из данных
const good = items.map(item => <Item key={item.id} value={item.label} />);
// React видит, что 'b', 'c', 'd' не изменились; монтирует только 'a'

Reconciliation и алгоритм сравнения в React

Reconciliation — процесс, с помощью которого React определяет минимальный набор изменений DOM при обновлении дерева компонентов. Полное сравнение двух деревьев имеет сложность O(n³); React использует эвристический алгоритм O(n), основанный на двух предположениях.

Два ключевых предположения алгоритма

  • Разные типы элементов порождают разные деревья. Если тип узла изменился (например, <div> → <span>), React полностью удаляет старое поддерево и монтирует новое. Сравнение внутри не происходит.
  • Разработчик подсказывает стабильные идентификаторы через prop key. Ключи позволяют React сопоставлять узлы в списках между рендерами без полного перебора.

Как работает алгоритм пошагово

React обходит оба дерева (старое и новое) одновременно, сравнивая узлы на одном уровне:

  • Элементы DOM одного типа — React обновляет только изменившиеся атрибуты. Дочерние элементы рекурсивно сравниваются.
  • Компоненты одного типа — экземпляр сохраняется, вызывается рендер с новыми props. Fiber-узел переиспользуется.
  • Разные типы — старое дерево размонтируется (componentWillUnmount / cleanup эффектов), новое монтируется с нуля.
  • Списки без key — React сравнивает по позиции. Вставка в начало списка приводит к обновлению всех узлов.
  • Списки с key — React строит карту {key → fiber} и сопоставляет элементы по ключу, а не позиции. Перемещение элементов не вызывает пересоздания.

Fiber — структура данных за reconciliation

Начиная с React 16, дерево компонентов хранится как связный список Fiber-узлов. Каждый Fiber содержит тип компонента, props, state, ссылки на parent/child/sibling и очередь обновлений. Это позволяет прерывать обход (Concurrent Mode) и возобновлять его позже.

Reconciliation проходит в две фазы:

  • Render phase (reconciler) — чистая, прерываемая. React строит «work-in-progress» дерево Fiber, вычисляет изменения, но не трогает DOM.
  • Commit phase — синхронная, непрерываемая. React применяет изменения к реальному DOM за один проход: сначала мутации, затем layout-эффекты, затем passive-эффекты.

Принудительный сброс через key

// Смена key на компоненте — самый простой способ заставить React
// полностью пересоздать экземпляр (reset state, повторный mount)
function UserProfile({ userId }: { userId: string }) {
  return <ProfileForm key={userId} />;
  // При смене userId React уничтожит старый ProfileForm и создаст новый
  // Все хуки (useState, useEffect) стартуют с нуля
}

Concurrent Mode и Transitions

В React 18 Concurrent Mode render-фаза стала прерываемой. Вызов startTransition помечает обновление как некритическое — React может отложить его и в это время обработать срочные события (ввод пользователя).

import { startTransition, useState } from 'react';

function SearchPage() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setQuery(e.target.value); // срочное — обновляется немедленно
    startTransition(() => {
      setResults(search(e.target.value)); // некритическое — может прерываться
    });
  };

  return <input value={query} onChange={handleChange} />;
}

Подводные камни

  • key={index} в динамических списках — при перестановке или вставке элементов React неправильно сопоставляет узлы, возникают баги с состоянием (форма «прыгает» на другой элемент).
  • Условный рендер разными типами — если вы переключаете между <Input /> и <Textarea />, каждый раз монтируется новый компонент и state сбрасывается. Используйте одно поле с hidden или параметр type.
  • Объявление компонента внутри компонента — тип функции создаётся заново на каждом рендере. React видит «другой тип» и пересоздаёт вложенный компонент при каждом рендере родителя. Всегда объявляйте компоненты на верхнем уровне модуля.
  • Ожидание синхронного DOM после setState — commit происходит асинхронно. Читайте DOM в useLayoutEffect, а не сразу после setState.
  • Стабильность ключей в транзиентных данных — не генерируйте ключ через Math.random() или Date.now() внутри рендера: каждый рендер даёт новый ключ = полный ремаунт.
  • React.StrictMode двойной вызов render — в dev-режиме render-фаза вызывается дважды специально, чтобы выловить side effects в render. Это норма, не баг.
  • Смешение key и index при фильтрации — если отфильтрованный список сохраняет оригинальные индексы, React всё равно сравнивает по позиции в отображаемом массиве. Используйте ID из данных, а не позицию в оригинальном массиве.

Частые вопросы на собеседовании

  • Что такое хук useEffect и как работает его массив зависимостей?
  • Объясните хук useState. Какие типичные ошибки возникают при обновлении состояния?
  • Объясните правила хуков. Почему хуки нельзя вызывать условно?
  • В каких типах frontend-проектов React даёт реальный выигрыш, а где будет избыточен или неудачен?

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

  • Использовать индекс как key в перемешиваемом списке.
  • Считать, что одинаковый JSX гарантирует сохранение state — не гарантирует, если меняется тип.
  • Делать тяжёлые синхронные render-функции и винить diff.

Что проверяет интервьюер

  • Может ли сформулировать обе эвристики diff.
  • Понимает ли роль Fiber в прерываемом рендере.
  • Знает ли, как смена типа сбрасывает поддерево.

Как вы знаете этот вопрос?

Проверить себя по теме React →

Источники

  • https://react.dev/learn/preserving-and-resetting-state
  • https://react.dev/learn/render-and-commit
←Предыдущий вопросКак профилировать лишние ререндеры через React DevTools Profiler?

Связанные темы

Reactreact-internalsrendering-model

Вакансии с этим навыком

React вакансии
  • Senior Front-end Enginer with React
  • Senior Software Engineer, Bio - iOS
  • Middle .Net Full-Stack Engineer (with React) (#6007)
  • Senior Software Engineer - Fincrime Reporting
  • Software Engineer II