NGRX Immutable.js
NGRX with Immutable.js
根据 question, maxime1992 上的回答,他不建议将 Immutable.js 与 ngrx 一起使用。
我知道将 Immutable.js 与 redux 一起使用是一种广泛传播的常规做法,目的是在商店更改时强制执行不变性,但为什么有人不想在 Angular 上做完全相同的事情应用程序。库应该比扩展运算符更好地处理不可变数据更改。
那么 Immutable.js 与 ngrx 一起使用有什么缺点?
也许我可以尝试提供更多信息:)
I know using Immutable.js together with redux is a wide spread and normal practice
我想看看它的趋势图。我敢打赌,因为 ES6 数字不会上升。
几年前当不变性模式开始在前端世界流行时,很多人还不习惯。所以 Immutable.js 很好地隐藏了不变性背后的 "complexity" 并以一种非常优化的方式只处理众所周知的结构。
此外,当我在一年半前开始一个巨大的 Angular 项目时,我不得不决定是否使用 Immutable.js。我决定去做,因为它的表现似乎令人难以置信。 Angular cli 使用 Typescript 生成项目(我很高兴它做到了!)。但几周后,我注意到 Immutable.js 真的不能很好地使用 Typescript(也许在此期间它确实发生了变化,老实说我不能再说了,因为我再也没有用过它)。而且我宁愿拥有一个类型良好的代码,也不愿拥有一个为我处理不可变性的库。因此,经过 2 个月的开发,我决定进行 huuuuge 重构并删除 immutablejs 以主要使用纯 JS(映射、过滤器,它们 return 新引用)。
如果你举以下例子(来自 immutablejs 网站):
import Immutable from require('immutable');
var map1: Immutable.Map<string, number>;
map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set('b', 50);
map1.get('b'); // 2
map2.get('b'); // 50
如果您决定重命名商店的一部分,祝您好运,找到所有类似这样的参考:map1.get('b');
而使用纯 JS 完全没有问题,如果忘记重命名 Typescript 会抛出错误。
的确,我的代码库周围有很多散布的对象,即使发现它非常容易阅读,那也是 "boilerplate"。
现在,说到 ngrx,他们制作了一个非常好的库来处理大部分问题,称为 @ngrx/entity。
关于 perfs,我一直在开发两个大型应用程序,并且没有遇到任何问题。特别是自发布 createSelector
函数以来,该函数应用记忆以避免每次商店更改时重新计算所有选择器。
所以当你说
Library's supposed to handle immutable data changes much better than spread operator.
我会说你根本不应该担心。真的。自己尝试,创建一个 Stackblitz 并尝试用很多对象编写一些 test/benchmark,你一直 add/update。几个月前,我用非常大的一组 array/objects 做到了这一点,而且完全没问题。
总而言之,最大的问题是类型推断。但在我看来,你只是不需要它。如果你害怕错过关于不变性的一些东西,你应该只在开发模式下使用 https://www.npmjs.com/package/ngrx-store-freeze 如果你试图从商店改变一个对象,它将抛出一个错误。
根据
我知道将 Immutable.js 与 redux 一起使用是一种广泛传播的常规做法,目的是在商店更改时强制执行不变性,但为什么有人不想在 Angular 上做完全相同的事情应用程序。库应该比扩展运算符更好地处理不可变数据更改。
那么 Immutable.js 与 ngrx 一起使用有什么缺点?
也许我可以尝试提供更多信息:)
I know using Immutable.js together with redux is a wide spread and normal practice
我想看看它的趋势图。我敢打赌,因为 ES6 数字不会上升。
几年前当不变性模式开始在前端世界流行时,很多人还不习惯。所以 Immutable.js 很好地隐藏了不变性背后的 "complexity" 并以一种非常优化的方式只处理众所周知的结构。
此外,当我在一年半前开始一个巨大的 Angular 项目时,我不得不决定是否使用 Immutable.js。我决定去做,因为它的表现似乎令人难以置信。 Angular cli 使用 Typescript 生成项目(我很高兴它做到了!)。但几周后,我注意到 Immutable.js 真的不能很好地使用 Typescript(也许在此期间它确实发生了变化,老实说我不能再说了,因为我再也没有用过它)。而且我宁愿拥有一个类型良好的代码,也不愿拥有一个为我处理不可变性的库。因此,经过 2 个月的开发,我决定进行 huuuuge 重构并删除 immutablejs 以主要使用纯 JS(映射、过滤器,它们 return 新引用)。
如果你举以下例子(来自 immutablejs 网站):
import Immutable from require('immutable');
var map1: Immutable.Map<string, number>;
map1 = Immutable.Map({a:1, b:2, c:3});
var map2 = map1.set('b', 50);
map1.get('b'); // 2
map2.get('b'); // 50
如果您决定重命名商店的一部分,祝您好运,找到所有类似这样的参考:map1.get('b');
而使用纯 JS 完全没有问题,如果忘记重命名 Typescript 会抛出错误。
的确,我的代码库周围有很多散布的对象,即使发现它非常容易阅读,那也是 "boilerplate"。
现在,说到 ngrx,他们制作了一个非常好的库来处理大部分问题,称为 @ngrx/entity。
关于 perfs,我一直在开发两个大型应用程序,并且没有遇到任何问题。特别是自发布 createSelector
函数以来,该函数应用记忆以避免每次商店更改时重新计算所有选择器。
所以当你说
Library's supposed to handle immutable data changes much better than spread operator.
我会说你根本不应该担心。真的。自己尝试,创建一个 Stackblitz 并尝试用很多对象编写一些 test/benchmark,你一直 add/update。几个月前,我用非常大的一组 array/objects 做到了这一点,而且完全没问题。
总而言之,最大的问题是类型推断。但在我看来,你只是不需要它。如果你害怕错过关于不变性的一些东西,你应该只在开发模式下使用 https://www.npmjs.com/package/ngrx-store-freeze 如果你试图从商店改变一个对象,它将抛出一个错误。