Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
ReactのSuspenseを使った 非同期処理の エラーハンドリング フロントエンドLT会 - vol.8 2022.09.08(木)
Slide 2
Slide 2 text
自己紹介 ● taro( @taroro_tarotaro) ● Shelfyで建設SaaSを作ってるエンジニア(あと少しで2年) ● React, Spring, Django, AWS, k8s
Slide 3
Slide 3 text
はじめに
Slide 4
Slide 4 text
Suspenseとは
Slide 5
Slide 5 text
Suspenseとは ComponentをLoading状態にできる機能
Slide 6
Slide 6 text
Suspenseとは ComponentをLoading状態にできる機能 これまで
Slide 7
Slide 7 text
Suspenseとは ComponentをLoading状態にできる機能 これまで Suspenseを使うと
Slide 8
Slide 8 text
Suspenseとは ComponentをLoading状態にできる機能 これまで Suspenseを使うと 取得されている前提で 宣言的に書ける!
Slide 9
Slide 9 text
Suspenseとは 宣言的UIフレームワーク・ライブラリのSuspenseの提供状況 ● React→提供済 ● Vue→実験的機能として提供 ● Solid→提供済 ● Svelte→未提供
Slide 10
Slide 10 text
Suspenseとは 宣言的UIフレームワーク・ライブラリのSuspenseの提供状況 ● React→提供済 ● Vue→実験的機能として提供 ● Solid→提供済 ● Svelte→未提供 →Suspenseは宣言的UIの標準になっていくと考えられる機能 →React以外の使い手の方にも、参考になれば嬉しいです🙂
Slide 11
Slide 11 text
今までの非同期処理の エラーハンドリング
Slide 12
Slide 12 text
Promiseチェーンでのエラーハンドリング Fetch API axios
Slide 13
Slide 13 text
データ取得ライブラリ(swr)でエラーハンドリング In Hooks or Component
Slide 14
Slide 14 text
データ取得ライブラリ(swr)でエラーハンドリング In Hooks or Component swr内ではtry-catchしている https://github.com/vercel/swr/blob/main/core/use-swr.ts#L307
Slide 15
Slide 15 text
Suspenseを使ってみる
Slide 16
Slide 16 text
Suspenseを使ってみる Suspense導入前
Slide 17
Slide 17 text
Suspenseを使ってみる Suspense導入前 Suspense導入後
Slide 18
Slide 18 text
Suspenseを使ってみる エラーが発生(ホワイトアウト) Suspense導入後
Slide 19
Slide 19 text
Suspenseを使ってみる エラーが発生(ホワイトアウト) →swrがエラーをcatchしていない Suspense導入後
Slide 20
Slide 20 text
Suspenseを使ってみる エラーが発生(ホワイトアウト) →swrがエラーをcatchしていない →なぜか? Suspense導入後
Slide 21
Slide 21 text
Reactの Suspenseの仕組み
Slide 22
Slide 22 text
ReactのSuspenseの仕組み Suspense内のComponentをrender
Slide 23
Slide 23 text
ReactのSuspenseの仕組み render中にpromiseがthrowされたら、直近のSuspenseがcatch
Slide 24
Slide 24 text
ReactのSuspenseの仕組み promiseがpendingの時は、Suspense内にfallbackをrender
Slide 25
Slide 25 text
ReactのSuspenseの仕組み settled(fulfilled or rejected)されたら再度render
Slide 26
Slide 26 text
ReactのSuspenseの仕組み renderに成功したら描画される!(再度 promiseがthrowされたらループ)
Slide 27
Slide 27 text
ReactのSuspenseの仕組み swrも内部でpromiseをthrow https://github.com/vercel/swr/blob/main/core/use-swr.ts#L597
Slide 28
Slide 28 text
ReactのSuspenseの仕組み swrも内部でpromiseをthrow promiseを扱うのはsuspenseなので、 swrはエラーをcatchしていない
Slide 29
Slide 29 text
じゃあどうするか?
Slide 30
Slide 30 text
じゃあどうするか? SWRの公式ドキュメント https://swr.vercel.app/docs/suspense
Slide 31
Slide 31 text
Error Boundary エラーハンドリング用ライフサイクルメソッドを使っ たComponent (V16~) ● getDerivedStateFromError ● ComponentDidCatch 子Componentツリーで発生した JavaScriptのエラーをcatch ● fallbackを表示 ● エラーを記録 https://reactjs.org/docs/error-boundaries.html
Slide 32
Slide 32 text
Error Boundary https://reactjs.org/docs/error-boundaries.html Error Boundaryって、非同期処理に使 えなかった気がする。。。
Slide 33
Slide 33 text
Error Boundaryって、非同期処理に使 えなかった気がする。。。 Error Boundary https://reactjs.org/docs/error-boundaries.html
Slide 34
Slide 34 text
Error Boundaryって、非同期処理に使 えなかった気がする。。。 Error Boundary →React内部で発生するエラーしか catchできない https://reactjs.org/docs/error-boundaries.html
Slide 35
Slide 35 text
Error Boundary https://reactjs.org/docs/error-boundaries.html Error Boundaryって、非同期処理に使 えなかった気がする。。。 →React内部で発生するエラーしか catchできない →Suspenseだと非同期処理もReact内 部で制御されるからcatchできる
Slide 36
Slide 36 text
より宣言的に書けるようになった! ● ローディング→Suspense ● エラー→ErrorBoundary Error Boundary使う
Slide 37
Slide 37 text
エラーハンドリングを 分岐したい
Slide 38
Slide 38 text
catchしたエラーの中身を見て、 分岐してあげればOK! エラーハンドリングを分岐したい
Slide 39
Slide 39 text
Error Boundaryを分けたい時は、 errorをre-throwすればOK! エラーハンドリングを分岐したい
Slide 40
Slide 40 text
Error Boundaryを分けたい時は、 errorをre-throwすればOK! re-throwしないError Boundaryが、 エントリーポイントにあると安心 🙂 ErrorBoundary自体、low-levelのAPIで構築されて いるので柔軟性は高い エラーハンドリングを分岐したい
Slide 41
Slide 41 text
さいごに
Slide 42
Slide 42 text
さいごに Error BoundaryとSuspenseめっちゃ似てる
Slide 43
Slide 43 text
Error BoundaryとSuspenseめっちゃ似てる Suspense=PromiseのみをcatchするBoundary さいごに https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberThrow.new.js#L312
Slide 44
Slide 44 text
Error BoundaryとSuspenseめっちゃ似てる Suspense=PromiseのみをcatchするBoundary さいごに https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberThrow.new.js#L312
Slide 45
Slide 45 text
Error BoundaryとSuspenseめっちゃ似てる Suspense=PromiseのみをcatchするBoundary 宣言的にUIを構築するには、その対象を Reactの管理下に置く必要がある ● state: 宣言的に書ける ● ref: 宣言的に書けない さいごに https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberThrow.new.js#L312
Slide 46
Slide 46 text
Error BoundaryとSuspenseめっちゃ似てる Suspense=PromiseのみをcatchするBoundary 宣言的にUIを構築するには、その対象を Reactの管理下に置く必要がある ● state: 宣言的に書ける ● ref: 宣言的に書けない 宣言的に非同期処理扱うために、 PromiseをReactにthrowしている さいごに https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberThrow.new.js#L312
Slide 47
Slide 47 text
Error BoundaryとSuspenseめっちゃ似てる Suspense=PromiseのみをcatchするBoundary 宣言的にUIを構築するには、その対象を Reactの管理下に置く必要がある ● state: 宣言的に書ける ● ref: 宣言的に書けない 宣言的に非同期処理扱うために、 PromiseをReactにthrowしている Promiseをthrowすることへの違和感が減る (?) さいごに https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberThrow.new.js#L312
Slide 48
Slide 48 text
まとめ
Slide 49
Slide 49 text
まとめ ● Suspenseを使うと非同期処理が宣言的に書ける ● Suspenseだと非同期処理のエラーもError Boundaryで宣言 的にエラーハンドリングできる ● SuspenseはPromiseのみをcatchするBoundary
Slide 50
Slide 50 text
まとめ ● Suspenseを使うと非同期処理が宣言的に書ける ● Suspenseだと非同期処理のエラーもError Boundaryで宣言 的にエラーハンドリングできる ● SuspenseはPromiseのみをcatchするBoundary SuspenseとError Boundaryでより宣言的なUI開発を!
Slide 51
Slide 51 text
ありがとうございました!