Fiber — это новая архитектура ядра React, представленная в версии 16. Это переписанный с нуля алгоритм reconciliation, который позволяет делать рендеринг прерываемым и приоритетным.
Ключевые аспекты
Fiber-нода — JavaScript-объект, представляющий компонент или DOM-элемент
Unit of work — единица работы, которую React может выполнить и приостановить
Прерываемость — возможность остановить рендер и продолжить позже
Приоритеты — срочные обновления выполняются раньше менее важных
Два дерева — current (на экране) и work-in-progress (строится)
Для чего нужен Fiber
Плавные анимации при сложных обновлениях
Отзывчивый UI даже при больших деревьях компонентов
Возможность реализации Suspense и Concurrent Mode
Улучшенная обработка ошибок (Error Boundaries)
Частые ошибки на собеседованиях
Путают Fiber и Virtual DOM — Fiber это способ работы с Virtual DOM
Думают, что Fiber появился в React 18 — он появился в React 16
Считают, что Fiber автоматически делает всё асинхронным — нужен Concurrent Mode
Не различают Fiber как архитектуру и Fiber-ноду как структуру данных
Введение и проблематика
Что было до Fiber?
До React 16 использовался Stack Reconciler — синхронный алгоритм, который обновлял дерево компонентов рекурсивно. Главная проблема: если дерево большое, браузер "зависал" на время обновления.
text
// Типичная ситуация до Fiber:Пользователь печатает → setState → Рендер 100мс → UI замирает
Браузер рисует 60 кадров в секунду, то есть каждые ~16мс. Если JavaScript работает дольше, пользователь видит "подтормаживания".
Решение: Fiber
React 16 представил полностью переписанное ядро — Fiber. Это не просто оптимизация, а фундаментально новая архитектура.
Базовая теория
Определение Fiber
Fiber — это:
Архитектура — новый способ организации работы React
Структура данных — объект, представляющий единицу работы
Каждый элемент в React-приложении представлен Fiber-нодой:
❓
Code Example 1: Какие основные поля содержит Fiber-нода? Объясните назначение полей child, sibling, return и alternate.
ts
interfaceFiber {// === Идентификация === type:any; // 'div', MyComponent, Fragment key:string|null;// === Дерево (linked list) === child:Fiber|null; // первый ребёнок sibling:Fiber|null; // следующий "брат" return:Fiber|null; // родитель// === Состояние === pendingProps:any; // входящие props memoizedProps:any; // props после рендера memoizedState:any; // state после рендера// === Эффекты === flags:number; // Placement | Update | Deletion// === Double buffering === alternate:Fiber|null; // ссылка на "другую версию"}
Типы Fiber-нод
graphTD A[Fiber Types]--> B[HostRoot] A --> C[FunctionComponent] A --> D[ClassComponent] A --> E[HostComponent] A --> F[HostText] B --> B1["корень приложения"] C --> C1["function App() {}"] D --> D1["class App extends React.Component"] E --> E1["div, span, button..."] F --> F1["текстовые ноды"]
Ключевые концепции
1. Единица работы (Unit of Work)
В отличие от рекурсивного обхода, Fiber позволяет обрабатывать по одной ноде за раз:
❓
Code Example 2: Как Fiber позволяет разбивать работу на части? Что происходит, когда "время вышло"?
js
// Псевдокод работы Fiberwhile (есть_работа && есть_время) { текущая_нода =выполнить_работу(текущая_нода);}// Если время вышло — отдаём управление браузеру
2. Связный список вместо стека
❓
Code Example 3: В чём принципиальное отличие между этими двумя подходами к обходу дерева? Почему первый нельзя прервать, а второй можно?