メインコンテンツにスキップ

Recoil 0.2

·読むのに4分

Recoil 0.2.0 のリリースを発表できることを嬉しく思います。このリリースでは、非同期セレクターの新しい、より信頼性の高い実装、大幅に forbedret パフォーマンス、そして多くのバグ修正と改善が行われています。

より優れた非同期セレクター

以前は対処できなかった多くのコーナーケースを修正するために、セレクターを再実装しました。例えば

  • セレクターは、非同期実行の任意の時点で依存関係を追加できるようになりました。
  • セレクターは、何かを待っている間に依存関係が変更された場合、最初からやり直すようになりました。
  • ダイヤモンド依存パターンは、必要なセレクターのみを再実行するようになりました。

これらは、新しい実装でのみ合格する単体テストのほんの一部です。Recoil で非同期セレクターを使用する場合、誤った動作に遭遇する可能性が低くなりました。

修正されたバグの多くは、セレクターの不要な実行として現れました。非同期セレクターを多用するあるアプリでは、セレクターの実行回数が全体で 15% 減少しました。

Christian Santos (@csantos42) は、この作業に精力的に取り組んでおり、本日リリースできることを非常に嬉しく思っています。

多数のアトムへのスケーリング

Recoil は、特殊なデータ構造 を使用して、多数のアトムを効率的に管理するようになりました。10,000 個のアトムを使用する場合、数百倍高速になりました。

Recoil にロゴができました。Gray Pegg (@graypegg) には、ロゴのデザインとウェブサイトの改善に感謝します。

その他の改善点

  • waitForAny() のエラー処理が変更されました。引数のいずれかがエラー状態であっても、引数に対応する個々の Loadable にアクセスできるようになりました。これにより、waitForNone() との一貫性が向上します。
  • Promise.allSettled に類似した waitForAllSettled() ヘルパーが追加されました。
  • useRecoilCallback() の誤用に対するエラーメッセージがより分かりやすくなりました。(#870)
  • サポートされていない非同期関数をセレクターセッターとして使用しようとすると、より分かりやすいエラーメッセージが表示されるようになりました。(#777)
  • React Native のサポートが改善されました。(#748, #702)
  • 開発ツールで使用するための useGetRecoilValueInfo_UNSTABLE() フックが追加されました。(#713, #714)

バグ修正

  • セレクターは、Error のインスタンスだけでなく、Promise でないものをエラーとして扱うようになりました。
  • <RecoilRoot> がアンマウントされた後に状態が更新される場合がありました。(#917)
  • <RecoilRoot> が見つからないというエラーメッセージが、React の実験的なリリースでは表示されませんでした。(#712)
  • エラーは凍結されなくなりました。(#852)
  • アトムエフェクトが特定のケースでアトムを初期化できない場合がありました (#775).
  • 非同期セレクターが複数の React ルートで失敗していました.
  • IE 11 互換性 (#894 など)

破壊的変更

上記のように、waitForAny() の動作が変更されました。引数のいずれかがエラー状態の場合に waitForAny() がエラー状態になるという動作に依存している場合、コードは壊れます。現在は、エラー状態ではない場合と同様に、各引数に対して個別の Loadable を返し、各引数でエラーを確認できます。

セレクター内から Promise でも Error でもないものをスローすると、スローされたオブジェクトを値として扱う代わりに、セレクターがエラー状態になります。

今後の作業

メモリ管理のリリースが間近に迫っています。これにより、Recoil は、アトムごとに設定可能で、使用されなくなったアトムとセレクターを自動的に削除できるようになります。これには、セレクターの konfigurerbar な LRU キャッシュも含まれます。これらの新機能は Facebook 社内で使用されていますが、API にわずかな破壊的変更が必要です。そのため、次のリリースでは、コードが壊れる場合に警告が表示されるようになります。必要な変更は難しくなく、まれです。Recoil をインポートする数千のモジュールのうち、変更が必要だったのは 6 つ未満でした。