Recoil 0.2
Recoil 0.2.0 发布啦!这个版本有一个新的、更可靠的异步 selector 的实现,大大提高了性能,并有许多错误修复和改进。
#
更好的异步 selector我们重新实现了 selector,以修复一些我们以前没有处理的极端情况。比如说:
- Selector 现在可以在其异步执行的任何时候添加依赖关系。
- 如果在等待过程 (pending) 中 selector 依赖关系发生变化,现在其可以重启。
- 宝石状依赖模式现在只重新执行必要的 selector。
这些只是在新的实现中通过的几个单元测试。在 Recoil 中使用异步 selector 时,你现在不太可能遇到不正确的表现。
许多被修复的 bug 体现在 selector 的不必要执行。在一个大量使用异步 selector 的应用中,我们观察到 selector 的执行次数总体上减少了 15%。
我们非常高兴今天能发布 Christian Santos (@csantos42) 一直在辛勤工作的结果。
#
扩展到大量的 atomRecoil 现在使用 特殊数据结构 来保持有大量 atom 时的效率。现在,当使用 10,000 个 atom 时,它的速度快了数百倍。
#
LogoRecoil 现在有了一个 logo 了。感谢 Gray Pegg (@graypegg) 为我们设计了它,并修缮了我们的网站!
#
其他改进waitForAny()
的错误处理有所改变:它现在允许你访问其参数对应的单个Loadable
,即使其中一个参数处于错误状态。这使得它与waitForNone()
更加一致。- 增加了一个类似于
Promise.allSettled
的waitForAllSettled()
helper。 - 对误用
useRecoilCallback()
的错误信息更加友好。(#870) - 如果你试图使用一个 (不被支持的) 异步函数作为 selector 设置器,它就会有更友好的错误信息。(#777)
- 改进了对 React Native 的支持。(#748, #702)
- 增加了一个
useGetRecoilValueInfo_UNSTABLE()
钩子,供开发工具使用。(#713, #714)
#
Bug 修复- selector 现在将任何被抛出的非
承诺
视为错误,而不仅仅是错误
的实例。 <RecoilRoot>
在被卸载后有时会更新其状态。(#917)- 缺少
<RecoilRoot>
的错误信息在 React 实验版上没有显示。(#712) - 错误不再被 freeze。(#852)
- Atom effect 在某些情况下可能无法初始化 atom (#775)。
- 异步 selector 在多个 React root 的情况下会失败。
- IE 11 的兼容性 (#894 及更多)
#
重大改变如上所述,waitForAny()
的行为已经改变。如果你依赖 waitForAny()
的行为,即如果它的任何一个参数处于错误状态,则会导致你的代码中断。现在它为每个参数返回单独的 Loadable
,就像非错误状态一样,你可以在每个参数中检查是否有错误。
如果你从一个 selector 中抛出的东西不是 Promise
,也不是 Error
,它现在会把 selector 放入错误状态,而不是把抛出的对象当作一个值。
#
今后工作我们非常接近发布内存管理,它将允许 Recoil 自动删除不再使用的 atom 和 selector,可在每个 atom 基础上进行配置。这也将包括可配置的 LRU selector 的缓存。 这些新功能在 Facebook 内部已经使用,但需要对 API 进行轻微的修改。因此,我们的下一个版本将开始警告你的代码将被破坏的情况。所需的改变并不困难,而且应该是罕见的:在数以千计的导入 Recoil 的模块中,我们发现只有不到半打需要改变。