00:00:00GitHub только что выпустил очень мощное дополнение для Storybook, которое полностью меняет
00:00:05то, как мы тестируем производительность компонентов.
00:00:07Оно включает детальную панель производительности с такими важными данными, как
00:00:12время отрисовки кадров, отзывчивость ввода, стабильность макета, профилирование React, нагрузка на память
00:00:18и многое другое.
00:00:19В этом видео мы подробно разберем возможности этого расширения.
00:00:23Будет интересно, так что давайте приступим.
00:00:31Короткий вопрос перед началом.
00:00:32Вы знаете, что такое тестирование производительности «сдвиг влево» (shift-left)?
00:00:35Это парадигма разработки, согласно которой производительность компонентов приложения
00:00:40должна тестироваться на ранних этапах, а не в самом конце.
00:00:45И этот инструмент создан именно для того, чтобы помочь разработчикам принимать верные решения на ранней стадии,
00:00:50показывая в реальном времени, как ведут себя компоненты еще до попадания в продакшн.
00:00:55Панель производительности Storybook обеспечивает высокую точность анализа того, как компоненты
00:01:00взаимодействуют с движком рендеринга браузера.
00:01:02Она отслеживает, например, тайминг кадров для выявления джиттера — тех самых микро-пауз
00:01:07между кадрами, из-за которых анимация кажется дерганой.
00:01:10Она также мониторит основной поток на предмет «DOM churn» и «thrashing».
00:01:15DOM churn (текучка DOM) случается, когда код избыточно создает, удаляет или обновляет элементы в цикле,
00:01:20а thrashing (перегрузка) возникает, когда браузер вынужден пересчитывать макет несколько раз
00:01:25за один кадр из-за последовательного чтения и записи стилей.
00:01:30Это дополнение адаптируется к любому фреймворку, который вы используете.
00:01:33Если вы на React, оно может подсветить такие метрики, как каскады рендеринга —
00:01:38небольшие изменения состояния, которые случайно вызывают волну медленных ререндеров во всем приложении.
00:01:44Также отслеживается длительность P95, показывающая худший сценарий для самых медленных пользователей,
00:01:50а не просто среднее значение.
00:01:52Если вы не используете React, универсальный режим отлично подходит для Vue, Svelte или
00:01:58веб-компонентов.
00:01:59Для лучших результатов рекомендуется запускать это расширение в Chrome или Edge.
00:02:04Также есть живой пример (playbook), где мы можем увидеть эти метрики в действии.
00:02:08Например, в случае с анимированным блоком мы можем точно отследить,
00:02:13сколько изменений инлайновых стилей происходит во время анимации.
00:02:16В данном случае все выглядит отлично.
00:02:18Частота и время кадра остаются стабильными, а значит, браузер справляется
00:02:23с обновлениями стилей без особого труда.
00:02:25Однако пример с тяжелым списком показывает иную картину.
00:02:29При фильтрации этого огромного списка мы видим несколько тревожных сигналов.
00:02:32Во-первых, показатель CLS (совокупный сдвиг макета) подскакивает до высокого значения,
00:02:38что говорит о заметных скачках элементов при загрузке, мешающих пользователю.
00:02:43Мы также видим всплеск DOM churn: браузер тратит слишком много ресурсов,
00:02:49чтобы одновременно удалить и заново построить огромное количество узлов.
00:02:52Это приводит к потере кадров, что убивает ощущение скорости и плавности
00:02:57интерфейса.
00:02:58В примере с Element Timing любой DOM-элемент с соответствующим атрибутом измеряется
00:03:04на предмет точного времени отрисовки.
00:03:06Это невероятно полезно, так как помогает определить точный момент,
00:03:11когда ваш основной контент или кнопка призыва к действию становятся видимыми,
00:03:17давая реальную картину производительности, а не просто общие метрики загрузки страницы.
00:03:21В примере с «дорогим» рендерингом нажатие кнопки ререндера вызывает
00:03:26резкий скачок длительности P95.
00:03:29Это происходит потому, что основной поток «захвачен» тяжелым выполнением JavaScript,
00:03:34из-за чего интерфейс кажется очень вялым.
00:03:36Мы также видим предупреждения о джиттере кадров, что указывает на нестабильную отрисовку,
00:03:41где время между кадрами сильно колеблется.
00:03:44Кроме того, наблюдается высокое общее время блокировки (TBT).
00:03:47TBT — это серьезный предупреждающий знак, так как он означает,
00:03:52что основной поток был заблокирован достаточно долго, чтобы помешать пользователю
00:03:57взаимодействовать со страницей: кликать на кнопки или скроллить.
00:03:58Похожую картину мы видим в примере с неэффективной мемоизацией.
00:04:03Здесь демо показывает, что ненужный повторный рендеринг каждого элемента
00:04:08задержкам.
00:04:09Напротив, пример с правильной мемоизацией демонстрирует, как много ресурсов экономится,
00:04:15если мы мемоизируем наши компоненты.
00:04:16Пропуская избыточные рендеры, мы держим основной поток свободным, а частоту кадров —
00:04:21стабильной, получая идеально плавные 60 кадров в секунду.
00:04:25В примере с каскадным рендерингом мы видим, что происходит при использовании
00:04:30setState внутри useLayoutEffect.
00:04:31Каждое приращение вызывает каскад, так как useLayoutEffect запускается синхронно
00:04:37после всех мутаций DOM, но до того, как браузер успеет отрисовать кадр.
00:04:42Запуская обновление состояния здесь, вы заставляете React заново обрабатывать дерево компонентов,
00:04:47а браузер — повторно пересчитывать макет еще до того, как пользователь увидит
00:04:52первый результат.
00:04:53Это плохо, так как фактически удваивает работу для каждого кадра,
00:04:58создавая задержку рендеринга, которая делает даже простые действия «тяжелыми».
00:05:02Пример со «style churn» также демонстрирует важное наблюдение.
00:05:07Что будет, если мы изменим инлайновые стили у 600 узлов одновременно?
00:05:13Мы сразу видим предупреждения о зависании в секции thrashing,
00:05:18что указывает на попадание браузера в цикл принудительного рефлоу.
00:05:21Он пытается рассчитать положение 600 элементов одновременно,
00:05:26пока JavaScript все еще вносит изменения.
00:05:27Это ведет к критическим показателям метрик кадров,
00:05:33так как основной поток полностью перегружен.
00:05:34Надеюсь, эти примеры показали вам, как использовать расширение Storybook
00:05:38для поиска узких мест в гораздо более точной среде.
00:05:41Конечно, можно использовать Lighthouse, но это инструмент широкого профиля.
00:05:46Он не дает той хирургической точности, чтобы увидеть влияние
00:05:51отдельного компонента на производительность приложения.
00:05:53Я очень рекомендую скачать это дополнение, добавить его в свой Storybook и просто
00:05:58попробовать его в деле.
00:05:59Вы получите массу полезной информации, когда увидите полную картину того,
00:06:03как ваши компоненты работают «под капотом».
00:06:06Вот и все, это был краткий обзор новой панели производительности Storybook от GitHub.
00:06:11Что вы о ней думаете?
00:06:13И как вы измеряете производительность в своих приложениях?
00:06:16Пишите об этом в комментариях ниже.
00:06:18Друзья, если вам нравятся такие технические разборы, дайте мне знать,
00:06:22нажав лайк под видео, и не забудьте подписаться на наш канал.
00:06:28С вами был Андрес из Better Stack. Увидимся в следующих видео!