Модал занимает ~30 секунд, чтобы открыть
В моем приложении есть модал, который иногда занимает ~30 секунд, чтобы открыть. Профилировщик chrome devtools показывает, что компоненты реагирования заканчивают рендеринг, затем возникает длинный промежуток, когда не сообщается о выполнении кода javascript, и затем модальное изображение становится видимым на экране. Во время этого пустого промежутка профилировщик показывает только длинную анимацию, происходящую в разделе "Взаимодействия".
Что я могу сделать, чтобы модал открылся быстрее? Что делает браузер во время этой анимации?
Информация о приложении
- Использует реакцию + редукс
- Использует Redx-сагу для побочных эффектов
- Использует избыточную форму для управления формой
- Использует семантические компоненты пользовательского интерфейса
- Использует стилизованные компоненты для CSS
Информация о модале
- Существует поле ввода автозаполнения, где вы можете искать элементы. При выборе элемента из результатов поиска отправляется действие, которое вызывает сагу.
- В саге делается вызов API для получения дополнительной информации об элементе.
- После завершения вызова API отправляется действие, которое устанавливает
initialValues
реквизит редукс-формы, используемой внутри модала. - Затем отправляется еще одно действие, чтобы открыть модал.
Другие наблюдения
- Удаление полей / компонентов из формы внутри модального окна делает его более быстрым (~5-6 секунд по сравнению с ~30 секундами). Однако ни один конкретный компонент не виновен, поскольку удаление одного компонента имеет тот же эффект, что и удаление любого другого компонента.
- В Chrome открытие занимает до 30 секунд, а в Firefox - до 5-6 секунд.
- Отправка действия для открытия модального режима перед отправкой действия, которое устанавливает начальные значения формы-редуктора, также делает его более быстрым.
1 ответ
Вот некоторые мысли по поводу сокращения времени загрузки:
- Попробуйте реализовать отложенную загрузку из бэкэнда, чтобы загрузить части данных.
- Отслеживайте время, потраченное на вызовы API, на вкладке Сеть, чтобы вы могли видеть, какие запросы занимают больше всего времени. Также вы можете использовать console.time()/timeEnd() для отслеживания времени внутри кода.
- Различные браузеры используют разные движки (например, Chrome V8 для Chrome) и могут иметь разные приоритеты загрузки данных.