我們很榮幸宣布 Recoil 0.2.0 版本已發布。此版本有一個更可靠的非同步選擇器新實作、大幅改善效能以及許多錯誤修正和改進。
更好的非同步選擇器
我們重新實作選擇器以修正許多我們之前未處理的邊界狀況。例如
- 選擇器現在可以在其非同步執行中的任何一點新增依賴關係。
- 如果他們的依賴關係在其等待某件事件時發生變更,選擇器現在會重新開始。
- 鑽石型依賴關係模式現在只會重新執行必要的選擇器。
這些只是一些只在新的實作中通過的單元測試。現在您在 Recoil 中使用非同步選擇器時不太可能遇到不正確的行為。
許多已修正的錯誤都體現為選擇器的不必要執行。在一個大量的使用非同步選擇器的應用程式中,我們觀察到選擇器執行次數總共減少了 15%。
Christian Santos (@csantos42) 已非常勤奮地處理這件事,我們很榮幸今天發布它。
縮放到大量原子
Recoil 現在使用 特殊資料結構 來維持大量原子的效率。在使用 10,000 個原子時,它現在快了數百倍。
標誌
Recoil 現在有商標了。感謝 Gray Pegg (@graypegg) 設計,以及美化我們網站!
其他改進
waitForAny()
的錯誤處理已變更:您現在可以存取與其參數相對應的個別Loadable
,即使其中一個處於錯誤狀態。這與waitForNone()
更一致。- 新增一個類似於
Promise.allSettled
的waitForAllSettled()
輔助程式。 - 更友善的錯誤訊息,用於
useRecoilCallback()
的錯誤使用。(#870) - 更友善的錯誤訊息,如果您嘗試將非同步函式用作選擇器設定程式,這不受支援。(#777)
- 優化 React 原生支援。(#748, #702)
- 新增一個
useGetRecoilValueInfo_UNSTABLE()
掛勾,供開發人員工具使用。(#713, #714)
錯誤修正
- 選擇器現在會將任何拋出的非
Promise
物件視為錯誤,而不再僅限於Error
的執行個體。 <RecoilRoot>
有時候可能會在解除安裝後更新其狀態。(#917)- React 實驗版本中不會顯示遺失
<RecoilRoot>
的錯誤訊息。(#712) - 不再凍結錯誤。(#852)
- 原子效果在特定情況下可能無法初始化原子(#775).
- 非同步選擇器會在多個 React 根目錄下失敗。
- IE 11 相容性(#894 及更多)
重大變更
如同上述所提,waitForAny()
的行為已變更。如果您依賴 waitForAny()
在其任何參數處於錯誤狀態時會產生錯誤狀態的行為,則您的程式碼將會中斷。現在它會針對每個參數傳回個別的 Loadable
,就像非錯誤狀態一樣,而且您可以檢查每個參數的錯誤。
如果您在選擇器中拋出不是 Promise
也不是 Error
的東西,現在會將選擇器設定為錯誤狀態,而不是將拋出的物件視為值。
未來動態
我們即將發佈記憶體管理功能,這將允許 Recoil 自動刪除不再使用的 atom 和選擇器,且每個 atom 都可自訂設定。這項功能也會包含可供選擇器的 LRU 快取。這些新功能已於 Facebook 內部使用,但需要對 API 稍作不向下相容的變更。因此,我們的下一個版本將在您的程式碼會中斷的情況下發出警告。所需的變更並不容易,也相當罕見:從數千個匯入 Recoil 的模組中,我們發現只有不到六個需要更動。