Большинство современных SPA написанны в связке react+redux, но и такое решение может начать тормозить, если его не оптимизировать. В своём докладе Валентин Череватый рассказывает правила оптимизации для написания производительных react+redux приложений.
3. ПРОБЛЕМА
• Задержка при переходе между страницами, открытием диалоговых
окон и т.д.
• Задержка при вводе данных в инпуты
• Зависание спиннера
3
4. ПРИЧИНЫ
• Избыточные перерисовки в DOM дереве
• Избыточное сравнение VirtualDOM
• Дорогие сравнения внутри shouldComponentUpdate
• Глубокая вложенность state’a
• Дорогие «селекторы»
4
5. Что необходимо ?
Для того что бы оптимизировать
приложение нам нужно понимать как
работает react, redux и react-redux
библиотеки. И, конечно, правила
оптимизации.
18. Сравнение children
18
• С помощью строгого сравнения, если это не массив
• Если это массив, то сравнение происходит от начала.
Удаляются и рендерятся заново те елементы, которые
находились после удалённого елемента, если нет key
• По key, если он есть
22. 22
NOTE: Не используйте index элемента массива в качестве key т.к. при удалении
одного элемента все последующие получат новый key что приведёт к полному
ререндеру следующих элементов
25. REDUX
25
В 2к18 уже не стоит рассказывать как он работает и вы
сами можете посмотрить на ютубе :)
26. REACT-REDUX
Это б иблиотека для б индинга redux store’a к react компонентам.
О на использует React Context AP I, подписы вается на изменение
redux стора и передаёт нуж ны е данны е в компонент с помощью
функции connect
30. МЫ МОЖЕМ ОПТИМИЗИРОВАТЬ
• Избыточные перерисовки в DOM дереве
• Избыточные сравнения Virtual DOM
• Структуру state’а
• Селекторы
30
31. ПЕРЕРИСОВКИ В DOM ДЕРЕВЕ
31
Избыточные перерисовки происходят
тогда, когда был вызван метод рендер
компонента, у которого props не
менялись и VirtualDOM должен был
быть таким же, но…
35. ИЗБЫТОЧНЫЕ СРАВНЕНИЯ VIRTUAL DOM
35
Мы можем избежать создания нового
VirtualDOM, а затем его сравнения с
текущим, если мы знаем, что они будут
равны (ничего не поменяется)
61. RESELECT
• Селекторы эффективны. Селектор не производит вычислений, пока один из его
аргументов не изменился
• Селекторы являются составными. Они могут использоваться в качестве входных для
других селекторов
61
64. Оптимизация state’a
Иногда с помощью правильной
структуры redux state’a можно
избежать создания новых массивов
или объектов, а также их
кэширования
71. TIPS
• React perf
• React developer tools
• Не переносите логику селекторов внутрь компонентов - не сортируйте, не фильтруйте и
не создавайте новых массивов внутри компонента т.к. это задача селектора
71
73. И ЧТО ДАЛЬШЕ ?
• Не обязательно бежать к тимлиду и выпрашивать время на рефакторинг всего
приложения, а достаточно использовать полученные знания при написании новых
компонентов или улучшая те, с которыми работаете.
• При создании нового редьюсера подумать в каком виде лучше хранить данные в state’e
• Определить нужен ли reselect для селектора
• Как можно раньше «решить» нужно ли перерендерить компонент (areStatePropsEqual, а
не shouldComponentUpdate) если это возможно
• Перед сдачей задачи попытаться найти проблемы с помощью React Developer Tools и
React perf
73