#reactjs #redux #bundle #redux-saga
#реагирует на #возвращение #пакет #переделка-сага
Вопрос:
Я работаю над крупномасштабным проектом, в котором мы используем Redux SAGA. САГА о редуксе обрабатывает около 180 побочных эффектов, и вся кодовая база довольно большая. Я использую ленивую загрузку для обработки загрузки меньшего размера пакета в первый раз, но есть проблема.
Недавно я узнал, что при первом открытии веб-сайта (с новым пакетом) spawn
действие работает, но обработчик takeLatest
побочных эффектов или любой другой обработчик, который выполняет действие redux, не работает.
Это исправляется, когда я обновляю страницу и снова открываю веб-сайт, когда он js
во второй раз извлекает пакеты из улова. Если я закрою и снова открою incognito
, я снова увижу эту проблему. (обработчик побочных эффектов не работает в первый раз)
Я проверил всю САГУ несколько раз, и все в полном порядке.
У вас есть какие-либо идеи о том, как исправить такую проблему?
Комментарии:
1. Это звучит как условие гонки. Можете ли вы предоставить более подробную информацию о своем приложении? Что такое ленивая загрузка — просто реагирующие компоненты или саги/редукторы/и т. Д.? Если вы лениво загружаете саги/редукторы, как вы вводите их в приложение, используете ли вы какое-либо стороннее решение? Является ли сбой
takeLatest
в лениво загруженном фрагменте или в фрагменте записи?
Ответ №1:
Стоит попробовать изменить useEffect
то , на что вы отправляете свои саги useLayoutEffect
, поэтому он будет вызывать сагу только тогда, когда DOM завершит загрузку, иначе говоря, при завершении загрузки пакета.
Ответ №2:
Основная проблема заключалась в запуске промежуточного программного обеспечения SAGA App.tsx
. Когда я ввел sagaMiddleware.run(rootSaga);
код в компонент маршрутизатора, он исправился, потому что компонент маршрутизатора является самым тяжелым компонентом (с большим количеством компонентов маршрута, некоторые из них не разделены), и, конечно, использование useLayoutEffect
было еще одним трюком. Итак, ставим этот компонент:
const AppRouter = () =gt; { useLayoutEffect(() =gt; { sagaMiddleware.run(rootSaga); }, []); ..... }
в первом большом компоненте в иерархии приложений (это самое важное, что вы должны сделать) будет устранена проблема неправильного запуска SAGA при первой загрузке пакета приложений.