我有一个仪表板应用程序,其中有几个图表在设定的间隔内更新。我的第一个想法是更新商店中的数据,然后让所有的图表从那里输入。
但是这会导致内存泄漏吗?因为Redux每次数据更改时都会创建一个新的存储,并保留旧的存储。每秒大约2mb的数据会堆积起来并使应用程序崩溃吗?
我看到的替代方法是将数据保持在本地状态(使用setState)。我希望一些更有经验的React/Redux开发者能在这方面给我一些建议。谢谢!
Dan Abramov, Redux的创建者在这里这样解决这个问题:
请注意,有时人们会对Redux感到困惑,并假设在每个操作中,状态树必须被深度克隆。这绝对不是事实。只有更改的部分需要更改其引用。例如,如果一个操作导致对数组中的一个项进行更改,则确实需要复制该项和数组,但是,数组中的所有其他元素将保留其标识。因为大多数时候动作都是非常有针对性的,只会影响几个状态键,而且Redux鼓励规范化数据,这样数据结构就不会嵌套得很深,所以对于典型的web应用程序来说,这个问题比人们想象的要小得多。
我认为这是答案的核心。
"由于Redux在每次数据收费时都会创建一个新存储并保留旧存储。"
Vanilla Redux不会这样做,否则每个 Redux存储都会泄漏。实际上,应用程序中持有状态引用的其他部分将阻止它被清除。
例如
window.states = []
store.subscribe(() => {
window.states.push(store.getState())
})
将导致内存无限增长。
此外,一些Redux开发工具确实泄漏了时间旅行功能,因此请确保在您的生产构建中关闭它们。
首先,听起来像是大量的数据。您的客户端应用程序真的经常需要那么多的数据吗?
第二,Redux不"创建新的存储"。假设您遵循了推荐的更新数据的方法,那么旧的数据引用将被丢弃并被垃圾收集。默认情况下,Redux本身不保留对旧状态树的引用,尽管Redux DevTools为了启用时间旅行调试而这样做。
您可能需要通读Redux文档中的几个部分。具体请参见http://redux.js.org/docs/faq/Performance.html、http://redux.js.org/docs/recipes/StructuringReducers.html。
您可能还想浏览我的Redux插件目录,其中包括可以执行批处理更新等操作的插件。
不建议在用户浏览器上每秒堆积2MB的数据。Redux存储是浏览器上的客户端。据我所知,关于内存泄漏问题的另一部分并没有发生。以下是一些有用的链接:
使用Chrome devtools诊断内存泄漏
需要注意的四种类型的内存泄漏