Ich arbeite an einem Projekt mit Redux und Redux-Saga (aber nicht reagieren). Ich habe das heiße Nachladen von Sagas mit sagaMiddleware.run() implementiert, aber Sie müssen das Modul neu laden und Reduktoren und Sagen ersetzen, wie in dem von Ihnen angegebenen Link angegeben (https://github.com/reactjs/react-redux/releases/tag/v2.0.0).
import { createStore } from 'redux';
import rootReducer from '../reducers/index';
import getSagas from '../sagas';
export default function configureStore(initialState) {
const sagaMiddleware = createSagaMiddleware()
const store = createStore(rootReducer, initialState, applyMiddleware(sagaMiddleware));
let sagaTask = sagaMiddleware.run(function*() {
yield getSagas()
})
if (module.hot) {
// Enable Webpack hot module replacement for reducers
module.hot.accept('../reducers',() => {
const nextRootReducer = require('../reducers/index');
store.replaceReducer(nextRootReducer);
});
module.hot.accept('../sagas',() => {
const getNewSagas = require('../sagas');
sagaTask.cancel()
sagaTask.done.then(() => {
sagaTask = sagaMiddleware.run(function* replacedSaga (action) {
yield getNewSagas()
})
})
})
}
return store;
}
Eine wichtige Sache ist die getSagas()
Funktion zu bemerken. Es gibt ein Array von frisch erstellten Generatorobjekt von Sagas zurück, Sie können kein bereits erstelltes Objekt in dem Array von einigen bereits laufenden Sagas haben. Wenn Sie dieses Array nur in einem Modul bauen, können Sie direkt ein konstantes Array verwenden, aber wenn Sie es bauen Sagas aus verschiedenen Modulen zusammensetzen, müssen Sie sicher sein, sagas aus allen Modulen neu zu erstellen, also ist der bessere Weg das alle Module exportieren die Erstellungsfunktion, anstatt eine feste Saga oder ein Array von Sagas zu exportieren. Zum Beispiel könnte es eine Funktion wie folgt sein:
export default() => [
takeEvery(SOME_ACTION, someActionSaga),
takeEvery(OTHER_ACTION, otherActionSaga),
]
Offensichtlich alle Sagas von Anfang an neu gestartet werden, und wenn Sie eine komplexe Sagas mit internen Zustand haben Sie den aktuellen Status verlieren.
Ein sehr ähnlicher Ansatz ist es, eine dynamische Saga anstelle von sagaMidleware.run()
zu verwenden, es ist eine sehr ähnliche Lösung, aber Sie können Teilmengen der Sagas neu laden und sie auf verschiedene Arten behandeln. Für weitere Informationen siehe https://gist.github.com/mpolci/f44635dc761955730f8479b271151cf2
Siehe Diskussion https://github.com/yelouafi/redux-saga/issues/22#issuecomment-218522365 –