我正在开发一个使用redux和redux-saga的React同构应用程序。 我的问题是,运行应用程序的节点进程在处理请求时会占用越来越多的内存,直到它最终耗尽内存。
我使用node --inspect
对应用进行了分析,并注意到即使在垃圾回收运行后,saga库仍会在内存中创建永远不会被清除的(array)
类型引用。
要测试此问题,请运行此项目并使用chrome-devtools对其进行配置: https://github.com/MartinCerny-awin/isomorphic-react-redux-saga-ssr
(不是我的项目,但似乎行为相同)
您可以在堆diff中看到这些对象:
updateState in system / Context @1770579
context in cancel()
我已经尝试将redux存储和saga中间件绑定到express response
,认为这是一个请求命名空间问题,但这并没有解决它。
答案 0 :(得分:0)
Redux传奇task cancellation将防止内存泄漏。
取消组件未完成/路线更改的消息
我认为问题在于你没有在与saga unmounts相关联的组件之后取消传奇。这可能会导致内存泄漏,因为saga一直在等待操作并且不会终止。
import { LOCATION_CHANGE } from 'react-router-redux';
// other imports
function* rootSaga() {
const watcher = yield [
takeLatest(GET_TODO, getToDoSaga),
// your other sagas
];
// the saga gets cancelled when your route changes. Instead
// a custom action can also be dispatched from your
// componentWillUnMount of ToDo component
yield take(LOCATION_CHANGE);
yield watcher.map((task) => cancel(task));
}
export default [
rootSaga,
];