我有一个仪表板应用程序,其中有几个图表会按设定的时间间隔更新。我的第一个想法是更新商店中的数据,然后让所有图表从那里输入。
但这会导致内存泄漏吗?由于 Redux 每次数据更改时都会创建一个新存储并保留旧存储。每秒大约 2mb 的数据会堆积起来并使应用程序崩溃吗?
我看到的另一种方法是将数据保持在本地状态(使用 setState)。我希望一些更有经验的 React/Redux 开发人员可以在这方面给我建议。谢谢!
我有一个仪表板应用程序,其中有几个图表会按设定的时间间隔更新。我的第一个想法是更新商店中的数据,然后让所有图表从那里输入。
但这会导致内存泄漏吗?由于 Redux 每次数据更改时都会创建一个新存储并保留旧存储。每秒大约 2mb 的数据会堆积起来并使应用程序崩溃吗?
我看到的另一种方法是将数据保持在本地状态(使用 setState)。我希望一些更有经验的 React/Redux 开发人员可以在这方面给我建议。谢谢!
Redux 的创建者 Dan Abramov 在这里解决了这个问题:
请注意,有时人们会对 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 存储是浏览器上的客户端。据我所知,有关内存泄漏的问题的另一部分不会发生。一些有用的链接是: