Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sync と Async ─ useSyncExternalStore を使う者の岐路

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Sync と Async ─ useSyncExternalStore を使う者の岐路

フロントエンド・PHPカンファレンス北海道2026
https://fortee.jp/frontend-phpcon-do-2026/proposal/8be40e84-6fca-4660-b6dd-b25a31d59a45
での登壇資料です

Avatar for KAKEHASHI

KAKEHASHI PRO

June 06, 2026

More Decks by KAKEHASHI

Other Decks in Technology

Transcript

  1. Sync と Async useSyncExternalStore を使う者の 岐路 2026/06/06 Musubi AI在庫管理チーム 江藤

    優汰 フロントエンド・PHPカンファレンス北海道2026 © KAKEHASHI Inc.
  2. トランジションを試してみる const [isPending, startTransition] = useTransition(); const handlePageChange = (next:

    number) => { startTransition(() => { setPage(next); }); }; const MedicineStockPage = () => { const { page, setPage } = usePage(); return ( <PaginationContainer page={page} isPending={isPending} onPageChange={handlePageChange} > <Suspense fallback={<SkeletonTable />}> <MedicineStockTable page={page} isPending={isPending} /> </Suspense> </PaginationContainer> ); }; © KAKEHASHI Inc. 13
  3. useSyncExternalStore から返される値に基づいてレンダーをサスペンド させることは推奨されていません。 外部ストアで起きた変更は ノンブロッキン グ型のトランジション更新としてマークできない ため、直近の Suspense フ ォールバックが起動してしまいます。

    既に画面上に表示されているコンテンツ がローディングスピナで隠れてしまうため、通常は望ましくないユーザ体験につ ながります。 https://ja.react.dev/reference/react/useSyncExternalStore useSyncExternalStore のドキュメントを確認してみる © KAKEHASHI Inc. 18
  4. So, in this proposal: Updates triggered by a store change

    will always be synchronous, even when wrapped in startTransition https://github.com/reactjs/rfcs/blob/main/text/0214-use-sync-external-store.md#detailed-design 訳)この提案では、ストア変更による更新は startTransitionで包んでも常に 同期的。 useSyncExternalStore の同期レンダリングは仕様であることがわかる RFC にも © KAKEHASHI Inc. 19
  5. useSyncExternalStore の "Sync" は仕様。トランジション / Suspense と は本質的に相性が悪い部分がある しかしこれはバグではなく設計通りの挙動 AI在庫管理の今後

    Async React の考え方を取り入れていきたい 状態管理ライブラリ zustand の置き換えは重いので、ひとまずは use- zustand を採用してみる まとめ © KAKEHASHI Inc. 27