Fiber Architecture — React 16+ под капотом
Содержание
- Введение: зачем заглядывать под капот
- Проблемы старого React (до версии 16)
- Что такое Fiber
- Два этапа работы React: Render Phase и Commit Phase
- Как React вычисляет изменения (Reconciliation)
- Виртуальный DOM и Fiber
- Что такое Fiber-узел (Fiber Node)
- Два дерева: current и work-in-progress
- Как React прерывает работу (Concurrent Mode)
- Приоритеты обновлений
- Что дала Fiber-архитектура разработчикам
- Частые вопросы новичков
- Итог (что мы узнали)
- Задание для закрепления (теория)
- Что дальше?
Цель урока: заглянуть под капот React и понять, как он устроен изнутри. Узнать, что такое Fiber, как работает согласование (reconciliation), почему React такой быстрый и что изменилось с появлением Fiber-архитектуры.
Введение: зачем заглядывать под капот
Главная мысль: React — это не просто библиотека для UI. Это сложная система управления деревом компонентов, которая постоянно отвечает на вопрос: «Что изменилось и что нужно обновить на экране?».
Что ты узнаешь:
- Как React понимает, что нужно обновить
- Что такое виртуальный DOM и зачем он нужен
- Почему React 16+ стал таким быстрым
- Что такое Fiber и как он работает
Важно: это теоретический урок. Ты не будешь писать код, работающий с Fiber напрямую. Но понимание архитектуры сделает тебя лучшим React-разработчиком.
Проблемы старого React (до версии 16)
Старый React (Stack Reconciliation):
- Использовал синхронный рекурсивный алгоритм
- Рендерил всё дерево за один проход
- Не мог прервать процесс обновления
- Блокировал главный поток (UI «зависал» при больших обновлениях)
Проблемы:
- Анимации тормозили при тяжёлых рендерах
- Большие списки обрабатывались медленно
- Нельзя было приоритизировать обновления
Главная мысль: React 15 и старше работал как «одна большая функция» — начал рендерить и не остановится, пока не закончит. Это создавало проблемы с производительностью.
Что такое Fiber
Fiber — это новый движок React, представленный в версии 16.0 (2017 год).
Что такое Fiber
- Это не библиотека, а архитектура
- Это переписанный с нуля алгоритм согласования
- Это способ организации работы React по кусочкам (единицам работы)
Основная идея
React теперь может прерывать рендеринг, возвращаться к нему позже и даже отменять ненужную работу. Это называется инкрементальный рендеринг.
Что изменилось
- Асинхронный рендеринг (Concurrent Mode)
- Приоритизация обновлений
- Возможность прерывать и возобновлять работу
Два этапа работы React: Render Phase и Commit Phase
Очень важно понять два этапа:
| Фаза | Что происходит | Можно прервать? |
|---|---|---|
| Render Phase (Фаза рендера) | Вычисление изменений, построение Fiber-дерева | ✅ Да |
| Commit Phase (Фаза фиксации) | Применение изменений к DOM | ❌ Нет |
Render Phase (можно прервать):
- React вычисляет, что изменилось
- Строит новое Fiber-дерево
- Может быть прервана, приостановлена, возобновлена
- Не касается DOM
Commit Phase (нельзя прервать):
- React применяет изменения к DOM
- Вызываются
componentDidMount,componentDidUpdate,useLayoutEffect - Должна быть атомарной (всё или ничего)
Главная мысль: вся магия производительности React заключена в Render Phase. React может делать её частями, прерывать и даже отменять, если пришли более важные обновления.
Как React вычисляет изменения (Reconciliation)
Reconciliation (согласование) — процесс, в котором React определяет, что изменилось в дереве компонентов.
- Алгоритм согласования основан на двух предположениях: два элемента разных типов создают разные деревья
- Разработчик может указать, какие дочерние элементы стабильны, с помощью key
Пример:
// Старое дерево
<div>
<h1>Привет</h1>
<p>Мир</p>
</div>
// Новое дерево
<div>
<h1>Пока</h1>
<p>Мир</p>
</div>
// React сравнивает и понимает:
// 1. h1 изменился (обновляем текст)
// 2. p не изменился (не трогаем)
Виртуальный DOM и Fiber
Как это работает:
- React создаёт виртуальное DOM-дерево
- При изменении данных создаётся новое дерево
- React сравнивает (
diff) старое и новое деревья - Находит минимальные изменения (
patch) - Применяет их к реальному DOM
Fiber vs Виртуальный DOM
| Виртуальный DOM | Fiber | |
|---|---|---|
| Что это | Представление UI | Архитектура и алгоритм |
| Зачем | Для diff-алгоритма | Для управления работой |
| Когда появился | С первого React | С React 16 |
| Можно прервать? | Нет | Да |
Главная мысль: виртуальный DOM — это данные. Fiber — это способ работы с этими данными, который позволяет прерывать и возобновлять процесс.
Что такое Fiber-узел (Fiber Node)
Каждый React-компонент (и каждый DOM-элемент) представлен Fiber-узлом. Это объект, который содержит всю информацию о компоненте.
Что хранит Fiber-узел:
{
// Тип компонента (div, span, MyComponent)
type: 'div',
// Ссылка на DOM-элемент или компонент
stateNode: domElement,
// Ссылки на другие Fiber-узлы (дерево)
child: childFiber, // Первый дочерний
sibling: siblingFiber, // Следующий брат
return: parentFiber, // Родитель
// Данные для обновления
pendingProps: {...}, // Новые пропсы
memoizedProps: {...}, // Предыдущие пропсы
memoizedState: {...}, // Предыдущее состояние
// Эффекты (что нужно сделать в Commit Phase)
flags: Update | Delete | Placement,
// Альтернативный узел (current и work-in-progress)
alternate: previousFiber,
}
Важно: Fiber-узлы образуют связный список (linked list), а не дерево. Это позволяет проходиться по ним по одному, прерываясь в любой момент.
Два дерева: current и work-in-progress
React всегда держит в памяти два Fiber-дерева:
| Дерево | Что это | Когда используется |
|---|---|---|
current |
То, что уже в DOM | Для сравнения |
work-in-progress |
То, что строится | Во время Render Phase |
Как это работает:
- При обновлении React копирует
currentвwork-in-progress - Изменяет
work-in-progress(применяет новые пропсы, вызывает хуки) - Когда работа закончена,
work-in-progressстановитсяcurrent - Старое current становится «альтернативой» для будущих обновлений
Главная мысль: React всегда работает с двумя копиями дерева. Это позволяет прерывать работу, не теряя данные, и «откатывать» изменения, если что-то пошло не так.
Как React прерывает работу (Concurrent Mode)
Как это работает:
- React начинает обновление
- Разбивает работу на маленькие кусочки (Fiber-узлы)
- После каждого кусочка проверяет: не пришло ли более важное обновление?
- Если пришло — прерывает текущую работу и начинает новую
- Если нет — продолжает
Пример:
// Пользователь вводит текст в поле поиска
// Каждая буква — это обновление
// Без Concurrent Mode:
// React блокирует UI на время рендера каждого обновления
// При быстром вводе текст может тормозить
// С Concurrent Mode:
// React прерывает рендер между буквами
// Приоритет отдаётся вводу пользователя
// UI остаётся отзывчивым
Приоритеты обновлений
Fiber-архитектура позволяет назначать приоритеты разным обновлениям:
| Приоритет | Что это | Пример |
|---|---|---|
| Immediate | Немедленное | Анимация, ввод текста |
| User-blocking | Блокирующее пользователя | Клики, переходы |
| Normal | Обычное | Загрузка данных |
| Low | Низкое | Аналитика, обновление фона |
| Idle | Фоновое | Предзагрузка контента |
Как это помогает:
- Пользовательский ввод (высокий приоритет) не блокируется загрузкой данных (низкий приоритет)
- Анимация всегда плавная
- Приложение остаётся отзывчивым
Что дала Fiber-архитектура разработчикам
| Возможность | Как работает |
|---|---|
| Concurrent Mode | Прерываемый рендеринг |
| Suspense | Ожидание данных во время рендера |
| Lazy Loading | Отложенная загрузка компонентов |
| Error Boundaries | Отлов ошибок в компонентах |
| Hooks | Стали возможны благодаря Fiber |
| Производительность | Оптимизация больших деревьев |
Главная мысль: все современные возможности React (Concurrent Mode, Suspense, Hooks) стали возможны благодаря переходу на Fiber-архитектуру.
Частые вопросы новичков
| Вопрос | Ответ |
|---|---|
| Нужно ли мне знать Fiber для работы? | Нет, но это помогает понимать React |
| Могу ли я влиять на Fiber? | Нет, это внутренняя механика |
| Почему React не переписывают на что-то другое? | Fiber — это уже переписанный React |
| Concurrent Mode уже стабилен? | Да, начиная с React 18 |
| Что будет с виртуальным DOM? | Он остаётся, но используется внутри Fiber |
Итог (что мы узнали)
| Что узнали | Как это работает |
|---|---|
| Fiber-архитектура | Новый движок React (с 16 версии) |
| Render Phase | Вычисление изменений (можно прервать) |
| Commit Phase | Применение изменений к DOM (нельзя прервать) |
| Fiber-узел | Объект, представляющий компонент |
| Два дерева | current и work-in-progress |
| Concurrent Mode | Прерываемый рендеринг |
| Приоритеты | Разные приоритеты для обновлений |
Задание для закрепления (теория)
Визуализация: нарисуй на бумаге, как связаны Fiber-узлы (через child, sibling, return). Представь дерево компонентов:
App
├── Header
│ └── Navbar
└── Content
├── Article
└── Sidebar
Размышление: Почему React не может прервать Commit Phase? Что произойдёт, если он прервётся посередине применения изменений к DOM?
Исследование: Открой React DevTools в браузере и посмотри на вкладку «Profiler». Запиши профилирование и посмотри, как React показывает время рендера разных компонентов.
Дополнительно: Прочитай статью (откроется в новой вкладке)React Fiber Architecture — это документация от разработчиков React. (Но будь готов к сложному английскому!)
Проверка: объясни своими словами, что такое Fiber и зачем он нужен.
Что дальше?
В следующем уроке разберём React Router — маршрутизацию в React-приложениях. Ты узнаешь, как создавать многостраничные приложения с разными URL, настраивать навигацию, защищённые маршруты и работать с параметрами. Это превратит твоё SPA в полноценное многостраничное приложение.