切换到不可变.js在 Redux 中。性能影响是什么,对组件语法有什么影响?



我正在考虑将我的reducer从plain JS移动到immutable.js。理解immutable.js api并对测试进行重构需要几天的时间,我想考虑一下这种转变是否必要。我的动机是,我目前正在复制每次更改的状态:

  let newState = {...state};

这是昂贵的,并导致我忘记克隆深度对象。

在谷歌上搜索这个问题的最后几天,我仍然不明白是否将我的reducer移动到immutable.js会导致性能下降,以及我是否需要通过我的组件和容器,并在每个组件上使用state.toJS()。

移动到immutable.js时性能会受到什么影响?特别是当我使用undo和keep多个步骤时。每次我需要组件/容器的数据时,我必须使用。tojs()吗?

关于性能的简短回答:视情况而定。引用Dan Abramov的话,

简而言之:创建一个样本应用程序,模仿你在应用程序中期望的数据大小和更改速度,并对其进行配置。没有其他方法可以判断放弃不可变是否对你有用。

使用像不可变这样的库的主要好处之一是,正如您提到的,它可以防止您不时忘记克隆深层对象,这可能导致难以追踪的真正严重的错误。同样地,如果您跟踪以前的状态,那么使用不可变库可以更容易地撤消,而如果没有不可变库,则会涉及更多,因为您基本上必须在创建新状态之前深度克隆状态。

我认为这值得一试,但你总是可以一次移动几个reducer来使用不可变,而不是迁移整个应用程序。这样你就可以分析性能影响,看看是否值得迁移整个应用程序。

我个人的看法是,在大多数情况下,对Immutable.js的使用被高估了。我在Reddit上写了一个扩展的评论来描述我的担忧,在(Dan Abramov: Redux不是一个架构或设计模式,它只是一个库)。我将把TL;DR:粘贴到这里:

总的来说,我的印象是性能优势被高估了,在使用中很容易犯错误,实际上是净性能负面的,你要么必须在代码库中的所有API上全部投入,要么非常确定你知道什么时候使用不可变类型与普通JS,并在所有地方进行转换。

所以,是的,你通常要么使用toJS(),要么显式调用state.getIn()来提取数据。

我的React/Redux链接列表中有一个关于React性能的部分,其中包括一些关于Immutable.js性能的文章(包括一些陷阱,比如过度使用toJS()): React - Redux -links。

最新更新