Skip to main content

Recoil 0.2

· One min read

Recoil 0.2.0 发布啦!这个版本有一个新的、更可靠的异步 selector 的实现,大大提高了性能,并有许多错误修复和改进。

更好的异步 selector#

我们重新实现了 selector,以修复一些我们以前没有处理的极端情况。比如说:

  • Selector 现在可以在其异步执行的任何时候添加依赖关系。
  • 如果在等待过程 (pending) 中 selector 依赖关系发生变化,现在其可以重启。
  • 宝石状依赖模式现在只重新执行必要的 selector。

这些只是在新的实现中通过的几个单元测试。在 Recoil 中使用异步 selector 时,你现在不太可能遇到不正确的表现。

许多被修复的 bug 体现在 selector 的不必要执行。在一个大量使用异步 selector 的应用中,我们观察到 selector 的执行次数总体上减少了 15%。

我们非常高兴今天能发布 Christian Santos (@csantos42) 一直在辛勤工作的结果。

扩展到大量的 atom#

Recoil 现在使用 特殊数据结构 来保持有大量 atom 时的效率。现在,当使用 10,000 个 atom 时,它的速度快了数百倍。

Logo#

Recoil 现在有了一个 logo 了。感谢 Gray Pegg (@graypegg) 为我们设计了它,并修缮了我们的网站!

其他改进#

  • waitForAny() 的错误处理有所改变:它现在允许你访问其参数对应的单个 Loadable,即使其中一个参数处于错误状态。这使得它与 waitForNone() 更加一致。
  • 增加了一个类似于 Promise.allSettledwaitForAllSettled() 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 的模块中,我们发现只有不到半打需要改变。