Gernar
Frontend DeveloperReact

Интервью-вопрос

Что такое Fiber в React

Fiber это внутренняя архитектура React, которая помогает планировать работу над UI и делать обновления более управляемыми. На интервью важно не перепутать ее с Virtual DOM и не обещать, что она автоматически ускорит любой код.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

Как лучше коротко объяснить Fiber на интервью?

Вы сейчас отвечаете на базовый вопрос и хотите не утонуть в лишних деталях.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

В коротком ответе держитесь простой формулы. Fiber это не библиотека и не public API. Это способ, которым React внутри хранит и выполняет работу по обновлению UI.

До Fiber React в основном проходил дерево компонентов синхронно, почти как стек вызовов. Если дерево большое, такая работа могла надолго занять main thread. Пользователь вводит текст, двигает мышь или скроллит, а браузеру сложнее быстро ответить, потому что JavaScript занят рендером.

Fiber заменил эту модель на структуру, где каждый узел дерева связан с единицей работы. React может выполнить часть работы, уступить управление браузеру, позже вернуться к задаче или выбросить незавершенный результат, если пришло более важное обновление.

Как построить ответ

Хороший ответ не обязан уходить в детали исходников React. Вам важно показать три вещи: какую проблему решает Fiber, как он меняет работу React и где это видно в обычном frontend-коде.

Как собрать ответ на интервью

1Нужно дать определение в одно предложение?
Скажите, что Fiber это внутренняя архитектура React reconciler для планирования работы над деревом компонентов.
2Спрашивают, какую проблему он решает?
Объясните, что старый стековый обход был синхронным и мог надолго занять main thread.
3Хотят практический смысл?
Свяжите Fiber с responsive UI, Suspense, transitions и возможностью отложить менее срочные обновления.
4Нужно показать зрелость?
Добавьте ограничение: React может прерывать render work, но commit и ваш тяжелый JS все еще могут блокировать интерфейс.

Render phase и commit phase

Самая частая ловушка в этом вопросе такая: сказать, что React теперь всегда рендерит асинхронно и ничего не блокирует. Лучше сразу разделить две фазы.

Render phase это расчет следующего дерева UI. В этой фазе React может работать с work-in-progress Fiber tree, расставлять приоритеты, повторять работу и выбрасывать незавершенный результат. Поэтому render phase должна быть чистой. Не запускайте там запросы, подписки, ручные DOM-изменения и другие внешние эффекты. Иначе легко получить лишний сетевой вызов, race condition, утечку подписки или аналитику события, которого пользователь так и не увидел.

Commit phase это момент, когда React применяет изменения к DOM и запускает часть эффектов. Этот этап нельзя растянуть без последствий для UX. Если вы делаете много синхронной работы в useLayoutEffect или постоянно измеряете layout, пользователь все равно увидит задержку.

Render phase
  1. 1React строит work-in-progress Fiber tree
  2. 2Может разбить работу на части
  3. 3Может прервать или выбросить незавершенный результат
  4. 4Не должен делать внешние побочные эффекты
Commit phase
  1. 1React применяет изменения к DOM
  2. 2Обновляет refs и запускает layout effects
  3. 3Не прерывается как обычная render work
  4. 4Должна оставаться короткой для хорошего UX

Практический пример

Fiber полезно связывать с реальными API React, но без магии. Например, при вводе в поле поиска можно оставить сам ввод срочным, а тяжелое обновление списка сделать менее срочным. В примере ниже обратите внимание на доступность поля и на то, что фильтр не пересчитывается при каждом срочном рендере.

import { startTransition, useMemo, useState } from "react";

function SearchPage({ allItems }) {
  const [query, setQuery] = useState("");
  const [visibleQuery, setVisibleQuery] = useState("");

  function handleChange(event) {
    const nextQuery = event.target.value;
    setQuery(nextQuery);

    startTransition(() => {
      setVisibleQuery(nextQuery);
    });
  }

  const items = useMemo(
    () => allItems.filter((item) => item.title.includes(visibleQuery)),
    [allItems, visibleQuery],
  );

  return (
    <>
      <label htmlFor="search">Поиск</label>
      <input id="search" type="search" value={query} onChange={handleChange} />
      <Results items={items} />
    </>
  );
}

Здесь срочное обновление query помогает полю оставаться отзывчивым, а обновление результатов может быть менее приоритетным. useMemo нужен, чтобы срочный рендер поля не пересчитывал фильтр с тем же visibleQuery. label нужен, чтобы поиск был доступен с клавиатуры и скринридера.

Но если allItems.filter очень дорогой или Results рисует тысячи элементов без virtualization, Fiber не отменит эту стоимость. Пользователь все равно увидит задержку ввода, лаг скролла или долгую отрисовку результатов. Тогда нужны мемоизация, виртуализация списка, серверная фильтрация, Web Worker или вынос тяжелого расчета из срочного пути.

Что Fiber дает в продуктовой разработке

На собеседовании хорошо звучит практический вывод. Fiber нужен не для того, чтобы вы напрямую управляли внутренним деревом. Он нужен, чтобы React мог безопаснее управлять временем выполнения обновлений.

Это важно для интерфейсов, где есть конкуренция между срочными и несрочными действиями. Ввод, клик и анимация должны получать приоритет над большим перерендером списка. Suspense должен иметь возможность показать fallback вместо сломанного пустого экрана. Lazy component должен загрузиться без ручного контроля всех промежуточных состояний.

Где это видно во frontend-коде

Ввод в поле и тяжелый списокtransition

Срочный ввод можно оставить отзывчивым, а обновление списка сделать менее приоритетным через transition. Но тяжелый рендер списка все равно придется оптимизировать.

Lazy component или Suspensefallback

React может показать запасной UI и продолжить работу, когда код или данные готовы. Риск в плохом UX, если fallback мигает или ломает layout.

Большой синхронный расчетmain thread

Fiber не разрежет ваш цикл на части. Здесь нужны мемоизация, вынос вычисления, virtualization или Web Worker.

Долгий layout effectcommit

Layout effects выполняются около commit и могут задержать отрисовку. Держите их короткими и не переносите туда лишнюю работу.

Fiber и Virtual DOM

Если вас прямо спрашивают про отличие, отвечайте коротко. Virtual DOM это модель UI в памяти, то есть то, что React хочет получить на экране. Fiber это внутренняя структура работы React с этим деревом: как пройти по нему, где остановиться, какой update важнее и что можно переиспользовать.

Простая аналогия для ответа: Virtual DOM описывает результат, Fiber помогает организовать путь к этому результату. Не говорите, что Fiber заменил Virtual DOM. Корректнее сказать, что Fiber изменил архитектуру reconciler и представление работы над деревом.

Что не стоит переобещать

Не говорите, что Fiber гарантирует отсутствие лагов. Браузер все равно исполняет JavaScript в main thread. Если вы запускаете тяжелую синхронную функцию, строите огромный DOM или делаете дорогие layout-измерения, пользователь может получить фриз.

Сильная формулировка звучит спокойнее: Fiber дает React возможность лучше планировать рендер. Но производительность приложения зависит еще от размера дерева, количества перерендеров, качества эффектов, работы с данными и стоимости DOM.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Называть Fiber новым Virtual DOM

    Так вы смешиваете разные уровни. Virtual DOM описывает UI, а Fiber хранит работу, приоритеты и связи между узлами дерева. Лучше сказать, что Fiber помогает React организовать и планировать согласование дерева.
  2. 2

    Обещать автоматическое ускорение всего приложения

    Fiber не делает любой компонент быстрым. Если в render лежит тяжелая сортировка, огромная таблица без virtualization или синхронный цикл, main thread все равно будет занят. Говорите аккуратно: Fiber дает React инструменты для планирования, но приложение все равно нужно проектировать с учетом стоимости рендера.
  3. 3

    Забывать про commit phase

    React может прерывать часть render work, но применение изменений к DOM должно пройти цельно. Длинный useLayoutEffect, синхронные измерения layout и лишние DOM-операции могут ухудшить отзывчивость даже в React 18.
  4. 4

    Запускать запросы или аналитику во время render phase

    Render phase может быть повторена или отброшена. Если положить fetch, подписку, запись в хранилище или отправку аналитики прямо в тело компонента, вы можете получить лишние запросы, гонки данных, неверные события аналитики и утечки. Надежнее использовать эффекты с cleanup, обработчики событий или механизм загрузки данных фреймворка.
  5. 5

    Говорить про Concurrent Mode как про отдельный режим включения

    Такая формулировка устарела и звучит неаккуратно. Сейчас лучше говорить про concurrent-возможности React, например startTransition, useDeferredValue и Suspense. Так вы показываете, что понимаете современную модель React.
  6. 6

    Опираться на внутренние поля Fiber в коде

    Fiber не является стабильным public API. Код приложения не должен читать внутренние структуры React, потому что они могут измениться между версиями. Для диагностики используйте официальные API React и DevTools.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которые часто задают после базового объяснения Fiber, concurrent rendering и ограничений React.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание