Браузер и фронтенд-рантайм
React fiber: тест с выбором ответа
Шесть вопросов, проходящих через весь модуль. Ни один из них — не определение для заучивания: каждый отражает решение, которое вы принимаете в реальном инциденте производительности, где render-фаза, commit-фаза, ключи, lanes и bailout взаимодействуют между собой.
Убедитесь, что умеете связать две фазы реконсилера, двойную буферизацию fiber, идентичность при reconciliation, планировщик lanes и механизм bailout — тот синтез, к которому вели отдельные уроки.
Компонент инкрементирует счётчик уровня модуля прямо в теле функции. В React 17 это работало; в React 18 StrictMode счётчик вдвое больше ожидаемого, а в продакшене под нагрузкой иногда утраивается. В чём корневая причина?
Рендер идёт уже 30 мс, когда приходит более приоритетное нажатие клавиши. React отбрасывает незавершённое дерево workInProgress и начинает заново. Почему отбрасывание полупостроенного дерева ничего не стоит визуально?
Список рендерится с key={index}. Чекбокс, отмеченный в третьей строке, остаётся отмеченным на неправильной строке после удаления первой строки, но текстовые подписи при этом все корректны. Чем объясняется такое расщепление поведения?
Поле поиска фильтрует список из 5 000 строк. Ввод дёргается. Вы оборачиваете setState отфильтрованного списка в startTransition. Ввод теперь мгновенный — но почему сам список не замораживает страницу, когда наконец рендерится?
Дочерний компонент, обёрнутый в React.memo, перерендеривается при каждом рендере родителя. Причина в Profiler — 'props changed', но содержимое пропа каждый раз идентично. Что происходит?
Дашборд управляется внешним стором. После включения concurrent-фич вы иногда видите, что хедер показывает одну сумму, а соседняя панель — другую сумму в том же кадре. Какой механизм виноват и что это исправляет?
Сквозная линия модуля — одна машина, увиденная с шести сторон: render вычисляет диф (прерываема, должна быть чистой), а commit его применяет (атомарна); двойная буферизация fiber делает прерывание бесплатным; ключи reconciliation привязывают состояние к идентичности, а не к позиции; lanes и time-slicing держат срочный ввод впереди дорогой работы; bailout — управляемый референциальной стабильностью через Object.is — держит большие деревья дешёвыми; а useSyncExternalStore не даёт внешним сторам делать tearing при concurrent rendering. Каждый продакшен-симптом здесь сводится к одному из этих шести рычагов.