跳至主要内容

Recoil 0.2

·阅读时间 4 分钟

我们很高兴宣布 Recoil 0.2.0 版本的发布。此版本对异步选择器进行了新的、更可靠的实现,大幅提升了性能,并修复了许多错误和改进。

更好的异步选择器

我们重新实现了选择器,以修复之前未处理的一些特殊情况。例如

  • 选择器现在可以在异步执行中的任何点添加依赖项。
  • 如果选择器在等待某件事时其依赖项发生了变化,选择器现在会重新开始。
  • 钻石依赖模式现在只重新执行必要的选择器。

这些只是在新的实现中通过的众多单元测试中的一部分。您现在在 Recoil 中使用异步选择器时,不太可能遇到不正确行为。

许多修复的错误表现为选择器的无必要执行。在一个大量使用异步选择器的应用程序中,我们观察到选择器执行次数总体减少了 15%。

Christian Santos (@csantos42) 一直非常勤奋地致力于此,我们非常高兴今天发布它。

扩展到大量原子

Recoil 现在使用 特殊数据结构 来维护大量原子时的效率。现在,在使用 10,000 个原子时,它的速度提高了数百倍。

Recoil 现在有一个徽标。感谢 Gray Pegg (@graypegg) 的设计以及对我们网站的修饰!

其他改进

  • 使用 waitForAny() 进行错误处理已更改:它现在允许您访问与其参数相对应的各个 Loadable,即使其中一个处于错误状态。这使其与 waitForNone() 更一致。
  • 添加了一个类似于 Promise.allSettledwaitForAllSettled() 助手。
  • 使用 useRecoilCallback() 的更友好的错误消息。(#870)
  • 如果您尝试将异步函数用作选择器设置器,则会显示更友好的错误消息,这是不支持的。(#777)
  • 改进的 React Native 支持。(#748, #702)
  • 添加了一个 useGetRecoilValueInfo_UNSTABLE() 钩子,供开发工具使用。(#713, #714)

错误修复

  • 选择器现在将任何非 Promise(抛出)视为错误,而不是只将 Error 的实例视为错误。
  • <RecoilRoot> 有时会在卸载后更新其状态。(#917)
  • 缺少 <RecoilRoot> 的错误消息不会在 React 实验版中显示。(#712)
  • 错误不再被冻结。(#852)
  • 在某些情况下,原子效果可能无法初始化原子 (#775).
  • 异步选择器将在多个 React 根目录中失败。
  • IE 11 兼容性 (#894 等等)

重大变更

如上所述,waitForAny() 的行为已更改。如果您依赖 waitForAny() 导致错误状态的行为(如果其任何参数都处于错误状态),您的代码将中断。现在它为每个参数返回单独的 Loadable,就像非错误状态一样,您可以检查每个参数中的错误。

如果您从选择器内部抛出不是 Promise 且不是 Error 的内容,它现在将使选择器进入错误状态,而不是将抛出的对象视为值。

未来工作

我们即将发布内存管理,这将允许 Recoil 自动删除不再使用的原子和选择器,可以在每个原子基础上进行配置。这也将包括对选择器的可配置 LRU 缓存。这些新功能在 Facebook 内部使用,但需要对 API 进行一些细微的重大更改。因此,我们的下一个版本将在您的代码将中断的情况下开始发出警告。所需的更改并不困难,而且应该很少见:在成千上万个导入 Recoil 的模块中,我们发现只有不到 5 个需要更改。