Инструмент для анализа производительности React
🏆 Номинант на React Open Source Awards 2020
Мощное расширение Chrome, которое улучшает процесс разработки React за счёт отладки с путешествиями во времени и углублённого мониторинга производительности
🇺🇸 ENGLISH VERSION • 🇫🇷 VERSION FRANÇAISE • 🇮🇩 VERSI BAHASA INDONESIA • 👩💻 Руководство для разработчиков
- Разнообразные представления: Отображение состояния приложения в виде графов компонентов, JSON-деревьев, графиков производительности и деревьев доступности
- История изменений: Отслеживайте изменения состояния во времени с удобной визуализацией истории
- Метрики веб-приложения: Отслеживайте важные метрики производительности в реальном времени
- Аналитика доступности: Анализируйте дерево доступности вашего приложения на каждом этапе изменения состояния
На главном экране доступны два основных выбора из выпадающего списка:
- Timejump: Просматривайте и перемещайтесь по истории снимков состояния (snapshot) вашего приложения. Можно переместиться в любую точку во времени, чтобы увидеть, как состояние эволюционировало при изменениях. Также доступна кнопка воспроизведения, чтобы автоматически проиграть каждое изменение состояния.
- Providers / Consumers: Глубже понимайте зависимости контекста приложения и его взаимодействия, визуализируя отношения провайдеров и потребителей.
- Снимки состояния: Фиксируйте и перемещайтесь по истории состояния приложения
- Элементы управления воспроизведением: Автоматически воспроизводите изменения состояния с регулировкой скорости
- Точки мгновенного перехода: Мгновенно возвращайтесь к любому предыдущему состоянию
- Сравнение состояний: Сравнивайте разницу между снимками состояния
- Метрики компонентов: Отслеживайте время рендера и узкие места в производительности
- Сравнение серий: Сопоставляйте производительность при разных наборах изменений состояния
- Определение перерисовок: Находите и исправляйте избыточные циклы рендера
- Web Vitals: Следите за Core Web Vitals и другими метриками
- Полная совместимость с Gatsby, Next.js и Remix
- Поддержка TypeScript для классовых и функциональных компонентов
- Поддержка React Hooks и Context API
Reactime упрощает сохранение и обмен историей состояния вашего приложения:
- Экспорт истории: Сохраняйте записанные снимки в JSON-файл для дальнейшего анализа или передачи
- Импорт предыдущих сессий: Загружайте ранее сохранённые снимки, чтобы сравнивать изменения состояния между разными сессиями
- Межсессионный анализ: Сопоставляйте производительность и изменения состояния между разными этапами разработки
Reactime предлагает обширную документацию, помогающую разработчикам разобраться в архитектуре и API инструмента. После клонирования репозитория достаточно запустить npm run docs
в корневой директории, а затем открыть сгенерированный файл /docs/index.html
, в котором представлены:
- Интерактивные диаграммы компонентов
- Типы и интерфейсы
- Обзор архитектуры кодовой базы
- API-справочник и примеры
Версия Reactime 26.0 предлагает полное обновление инструмента отладки React, включая:
-
Новый показ данных контекста
- Первая в своём роде визуализация состояния, основанного на хуке useContext
- Чёткое отображение отношений «провайдер – потребитель»
- Мониторинг значений контекста в реальном времени
- Подробная визуализация данных провайдеров
-
Улучшенная отладка с путешествиями во времени
- Переработанный интерфейс слайдера, размещённого вместе со снимками
- Элементы управления скоростью воспроизведения
- Более интуитивная навигация по состояниям
- Улучшенная визуализация снимков
-
Современный переработанный интерфейс
- Стильный, современный дизайн со скруглёнными элементами
- Интуитивная структура расположения элементов
- Новый тёмный режим
- Улучшенная визуальная иерархия
-
Крупные технические улучшения
- Исправлена проблема с сохранением соединения при бездействии или переключении вкладок
- Восстановлена визуализация дерева доступности (Accessibility Tree)
- Исправлены проблемы с захватом состояния для хуков useState в функциональных компонентах
- Общий рост стабильности и производительности расширения
Благодаря этим обновлениям Reactime стал ещё более мощным, надёжным и удобным в использовании, устанавливая новый стандарт среди инструментов отладки React.
Чтобы узнать больше о предыдущих релизах, перейдите по ссылке.
- Установите Reactime из Интернет-магазина Chrome
- Установите необходимое расширение React Developer Tools, если у вас его ещё нет
- Ваше React-приложение должно работать в режиме разработки (development)
- Расширение React Developer Tools должно быть установлено
- Браузер Chrome (рекомендуется версия 80 или выше)
Существует два способа открыть панель Reactime:
-
Контекстное меню
- Кликните правой кнопкой мыши в любом месте вашего React-приложения
- Выберите «Reactime» в контекстном меню
-
Инструменты разработчика
- Откройте Chrome DevTools (F12 или ⌘+⌥+I)
- Перейдите на вкладку «Reactime»
После запуска Reactime автоматически начнёт отслеживать изменения состояния и метрики производительности вашего приложения.
Мы приглашаем всех желающих внести свой вклад в улучшение Reactime! Вот как вы можете помочь: 🙋 Contributing README
-
Начальный шаг
- Сделайте форк репозитория
- Изучите наше подробное Руководство для разработчиков (Developer README)
- Настройте локальную среду разработки
-
Процесс сборки
- Следуйте инструкциям по сборке в Руководстве для разработчиков
- Тщательно протестируйте свои изменения
- Создайте пул-реквест
Присоединяйтесь к нашему растущему сообществу контрибьюторов и помогите формировать будущее инструментов отладки React! Подробные инструкции по участию и архитектуре проекта вы найдёте в 👩💻 Руководстве для разработчиков.
Reactime потерял соединение с вкладкой, за которой ведётся наблюдение. Просто нажмите кнопку «reconnect», чтобы возобновить работу.
Reactime обнаруживает и отслеживает хуки, просматривая «неминифицированный» код React в режиме разработки. Если ваш процесс сборки минифицирует или «уродует» (uglify) код — даже в режиме разработки — Reactime может не найти и не отследить ваши хуки. Чтобы исправить это:
- Убедитесь, что сборка действительно предназначена для разработки: Проверьте настройки вашего бандлера или инструмента сборки (например, Webpack, Babel, Vite и т. д.), чтобы приложение не было минимизировано и «уродовано» в режиме разработки.
- Например, в Webpack установите
mode: 'development'
, чтобы по умолчанию отключить минификацию. - В Create React App, достаточно запустить
npm start
илиyarn start
, чтобы автоматически настроить неминифицированную сборку.
- Например, в Webpack установите
- Проверьте, нет ли переопределений: Убедитесь, что нет дополнительных Babel- или Webpack-плагинов, которые минифицируют ваш код, особенно если вы используете фреймворки вроде Next.js или Gatsby. Иногда дополнительные плагины или скрипты могут незаметно запускать минификацию.
- Перезапустите и пересоберите: После изменения настроек сборки перезапустите или пересоберите ваше приложение, чтобы новые настройки были применены. Затем обновите вкладку браузера, чтобы Reactime мог обнаружить ваши неминифицированные хуки.
Reactime изначально запускается, используя глобальный хук dev tools из API Chrome. Чтобы Chrome успел это загрузить, может потребоваться время. Попробуйте обновить (refresh) ваше приложение несколько раз, пока не увидите, что Reactime заработал.
Reactime работает в связке с React Developer Tools, чтобы получить доступ к дереву Fiber в React-приложении. Внутри Reactime просматривает дерево Fiber через глобальный хук из React Developer Tools, получая всю необходимую информацию для отображения разработчику.
Reactime — это проект с открытым исходным кодом. Мы будем рады услышать ваши идеи по улучшению пользовательского опыта. Ознакомьтесь с 👩💻 Руководством для разработчиков и создайте пул-реквест (или Issue), чтобы предложить и совместно доработать изменения в Reactime.
С выходом Node v18.12.1 (LTS) от 04.11.22 в скриптах появились команды
npm run dev
| npm run build
для обратной совместимости.
Для версии
Node v16.16.0 используйте скрипты npm run devlegacy
| npm run buildlegacy
- Garrett Chow - @garrettlchow
- Ellie Simens - @elliesimens
- Ragad Mohammed - @ragad-mohammed
- Daniel Ryczek - @dryczek14
- Patrice Pinardo - @pinardo88
- Haider Ali - @hali03
- Jose Luis Sanchez - @JoseSanchez1996
- Logan Nelsen - @ljn16
- Mel Koppens - @MelKoppens
- Amy Yang - @ay7991
- Eva Ury - @evaSUry
- Jesse Guerrero - @jguerrero35
- Oliver Cho - @Oliver-Cho
- Ben Margolius - @benmarg
- Eric Yun - @ericsngyun
- James Nghiem - @jemzir
- Wilton Lee - @wiltonlee948
- Louis Lam - @llam722
- Samuel Tran - @leumastr
- Brian Yang - @yangbrian310
- Emin Tahirov - @eminthrv
- Peng Dong - @d28601581
- Ozair Ghulam - @ozairgh
- Christina Or - @christinaor
- Khanh Bui - @AndyB909
- David Kim - @codejunkie7
- Robby Tipton - @RobbyTipton
- Kevin HoEun Lee - @khobread
- Christopher LeBrett - @fscgolden
- Joseph Park - @joeepark
- Kris Sorensen - @kris-sorensen
- Daljit Gill - @dgill05
- Ben Michareune - @bmichare
- Dane Corpion - @danecorpion
- Harry Fox - @StackOverFlowWhereArtThou
- Nathan Richardson - @BagelEnthusiast
- David Bernstein - @dangitbobbeh
- Joseph Stern - @josephiswhere
- Dennis Lopez - @DennisLpz
- Cole Styron - @colestyron
- Ali Rahman - @CourageWolf
- Caner Demir - @demircaner
- Kevin Ngo - @kev-ngo
- Becca Viner - @rtviner
- Caitlin Chan - @caitlinchan23
- Kim Mai Nguyen - @Nkmai
- Tania Lind - @lind-tania
- Alex Landeros - @AlexanderLanderos
- Chris Guizzetti - @guizzettic
- Jason Victor - @theqwertypusher
- Sanjay Lavingia - @sanjaylavingia
- Vincent Nguyen - @VNguyenCode
- Haejin Jo - @haejinjo
- Hien Nguyen - @hienqn
- Jack Crish - @JackC27
- Kevin Fey - @kevinfey
- Carlos Perez - @crperezt
- Edwin Menendez - @edwinjmenendez
- Gabriela Jardim Aquino - @aquinojardim
- Greg Panciera - @gpanciera
- Nathanael Wa Mwenze - @nmwenz90
- Ryan Dang - @rydang
- Bryan Lee - @mylee1995
- Josh Kim - @joshua0308
- Sierra Swaby - @starkspark
- Ruth Anam - @nusanam
- David Chai - @davidchaidev
- Yujin Kang - @yujinkay
- Andy Wong - @andynullwong
- Chris Flannery - @chriswillsflannery
- Rajeeb Banstola - @rajeebthegreat
- Prasanna Malla - @prasmalla
- Rocky Lin - @rocky9413
- Abaas Khorrami - @dubalol
- Ergi Shehu - @Ergi516
- Raymond Kwan - @rkwn
- Joshua Howard - @Joshua-Howard
- Lina Shin - @rxlina
- Andy Tsou - @andytsou19
- Feiyi Wu - @FreyaWu
- Viet Nguyen - @vnguyen95
- Alex Gomez - @alexgomez9
- Edar Liu - @liuedar
- Kristina Wallen - @kristinawallen
- Quan Le - @Blachfog
- Robert Maeda - @robmaeda
- Lance Ziegler - @lanceziegler
- Ngoc Zwolinski - @ngoczwolinski
- Peter Lam - @dev-plam
- Zachary Freeman - @zacharydfreeman
- Jackie Yuan - @yuanjackie1
- Jasmine Noor - @jasnoo
- Minzo Kim - @minzo-kim
- Mark Teets - @MarkTeets
- Nick Huemmer - @NickHuemmer
- James McCollough - @j-mccoll
- Mike Bednarz - @mikebednarz
- Sergei Liubchenko - @sergeylvq
- Yididia Ketema - @yididiaketema
- Morah Geist - @morahgeist
- Eivind Del Fierro - @EivindDelFierro
- Kyle Bell - @KyEBell
- Sean Kelly - @brok3turtl3
- Christopher Stamper - @ctstamper
- Jimmy Phy - @jimmally
- Andrew Byun - @AndrewByun
- Kelvin Mirhan - @kelvinmirhan
- Jesse Rosengrant - @jrosengrant
- Liam Donaher - @leebology
- David Moore - @Solodt55
- John Banks - @Jbanks123
Этот проект распространяется по лицензии MIT — подробности см. в файле LICENSE.