本文へスキップ

Recoil 0.3

·読了時間2分

より柔軟なRecoilRootのネスト、コールバックの生成、メモリ管理の準備、最適化、バグ修正を含むRecoil 0.3のリリースを発表できることを嬉しく思います。

新機能

  • 周囲にルートが存在する場合は、そのルートにフォールスルーするRecoilRootを作成できるようになりました。これにより、Recoilを使用する再利用可能なコンポーネントを作成でき、大規模なRecoilアプリケーションのコンテキスト内でも外でも使用できます。(#973)
  • セレクターからRecoilコールバックを返すことができるようになりました。(#989)

破壊的変更:メモリ管理の準備

次回のRecoilリリースでは、破壊的なAPI変更が行われます。今回のリリースでは、開発ビルドで更新が必要なコードがあると、コンソールに警告が表示されます。ほとんどのアプリではコードの変更は必要ありません。

メモリ管理を導入すると、(`useRecoilCallback()`の引数として取得するものなど)スナップショットは、作成されたティックでのみ有効になります。スナップショットをより長く保持する必要がある場合は、手動で保持してから解放する必要があります。

const release = snapshot.retain();
try {
await someAsyncWork(snapshot);
} finally {
release();
}

0.3.0では、保持されていないスナップショットを使用すると、開発環境でコンソール警告が表示されます。本番環境では動作に変化はありません。次回のリリースでは、開発環境と本番環境の両方で例外がスローされます。

スナップショットの保持は、そのスナップショットが保持されている限り、すべてのatomのメモリ回収を妨げるため、可能な限り避けるべきです。代わりに、非同期処理に移る前に必要な値だけを取り出してください。

バグ修正、パフォーマンス、その他の改善

  • `atomFamily`の使用時のオーバーヘッドを削減しました。数千個のatomを使用するアプリケーションでは、メモリ使用量が200MB削減されました。
  • 非同期セレクターからスローされたエラーがReactのエラーバウンダリでキャッチされないバグを修正しました。(#998, #1017)
  • 実験的なAtom Effects `onSet()`は、`setSelf()`でPromiseを使用して初期化する場合、または同じ`onSet()`ハンドラーからトリガーされた場合に、もはや呼び出されなくなりました。(#974, #979, #953, #986)
  • Safariのサポートを改善しました。(#967, #609)
  • 開発モードでは、セレクターに格納された値が凍結されるようになりました。(#911)
  • `Loadable`のTypeScriptサポートを改善しました。