Redux Saga热重装

时间:2016-05-10 20:41:55

标签: webpack redux react-redux webpack-hmr redux-saga

我正在研究React& Redux项目。该项目过去常常使用webpack-dev-middleware和热中间件进行热重新加载。

在我将Redux Saga添加到项目中之后,将一些saga中间件添加到redux商店。似乎每当我更改传奇代码时,热重新加载都会破坏并显示错误消息:

  

提供商GT;不支持动态更改store。您很可能会看到此错误,因为您已更新到Redux 2.x和React Redux 2.x,它们不再自动热重新加载Reducer。有关迁移说明,请参阅https://github.com/reactjs/react-redux/releases/tag/v2.0.0

据我所知,佐贺使用的是发电机,它依赖于时间。可以用Sagas热重新加载页面吗?就像Redux减速器在热重新加载过程中如何替换它一样。

谢谢!

2 个答案:

答案 0 :(得分:24)

我在使用redux和redux-saga(但没有反应)的项目上工作。我使用sagaMiddleware.run()实现了sagas的热重载,但你必须处理模块重新加载并替换reducers和sagas,如你提供的链接(https://github.com/reactjs/react-redux/releases/tag/v2.0.0)所示。

styleClass="pdialog-gen pdialog-gen-height-ext"

需要注意的一点是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; } 功能。它返回一个新创建的sagas生成器对象的数组,你不能在一些已经运行的sagas的数组中有一些预先创建的对象。如果你建立了这个数组 只有在一个模块中,您可以直接使用常量数组,但是如果您构建它 从不同的模块组成传单,你必须确保重新创建传奇 从所有模块,所以更好的方法是所有模块导出创建功能,而不是导出固定的传奇或传奇阵列。 例如,它可以是这样的函数:

getSagas()

显然所有的传奇都是从一开始就重新启动的,如果你有一个复杂的传奇 在内部状态下,您将失去当前状态。

一种非常类似的方法是使用动态传奇代替调用export default () => [ takeEvery(SOME_ACTION, someActionSaga), takeEvery(OTHER_ACTION, otherActionSaga), ] ,这是一个非常类似的解决方案,但你可以重新加载传奇的子集并以不同的方式处理它们。有关详细信息,请参阅https://gist.github.com/mpolci/f44635dc761955730f8479b271151cf2

答案 1 :(得分:3)

redux-saga1.0.0软件包的更新:

使用@mpolci解决方案并进行更改

sagaTask.done.then(() => {

sagaTask.toPromise().then(() => {

一切都开始正常工作。

请参阅Task文档