Reactコンポーネントの遅延を数秒で解決! (新しいGitHub Storybookアドオン)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00GitHubがStorybook向けに、非常に強力なアドオンをリリースしました。これにより、
00:00:05コンポーネントのパフォーマンス計測のあり方が一変します。
00:00:07これには詳細なパフォーマンスパネルが含まれており、次のような貴重な知見を得られます。
00:00:12フレームのタイミング、入力の応答性、レイアウトの安定性、Reactプロファイリング、メモリ負荷、
00:00:18その他多くの項目を測定可能です。
00:00:19今回の動画では、このアドオンが提供する機能を詳しく見ていきましょう。
00:00:23とても興味深い内容ですので、さっそく本題に入ります。
00:00:31始める前に、ちょっとした質問です。
00:00:32「シフトレフト・パフォーマンス・テスト」をご存知でしょうか?
00:00:35これは、アプリのコンポーネントのパフォーマンスを、後回しにするのではなく、
00:00:40開発プロセスのより早い段階でテストすべきだという開発パラダイムです。
00:00:45このツールは、開発者がそうした初期段階の判断を下せるよう特別に作られており、
00:00:50本番環境に投入する前に、コンポーネントの挙動をリアルタイムで確認できます。
00:00:55Storybookのパフォーマンスパネルは、コンポーネントがブラウザの
00:01:00レンダリングエンジンとどのように相互作用するかを、高精度に可視化します。
00:01:02例えば、フレームタイミングを追跡して「ジッター」を特定します。これは、
00:01:07アニメーションがカクついて感じる原因となる、フレーム間のわずかな不規則な隙間のことです。
00:01:10また、メインスレッドを監視して「DOMチャーン」や「スラッシング」もチェックします。
00:01:15DOMチャーンは、ループ内で不要な要素の作成・削除・更新が行われることで発生し、
00:01:20スラッシングは、スタイルの読み取りと書き込みが連続することで、
00:01:25ブラウザが1フレーム内で何度もレイアウト計算を強制されることで起こります。
00:01:30このアドオンは、使用しているフレームワークを問いません。
00:01:33Reactを使っている場合は、「レンダー・カスケード」のような指標をハイライトできます。
00:01:38これは小さな状態変化が、アプリ全体に大規模で低速な再レンダリングの波を引き起こす現象です。
00:01:44また「P95期間」も追跡します。これは単なる平均ではなく、
00:01:50最も遅いユーザーにおけるワーストケースのシナリオを示してくれます。
00:01:52React以外でも、ユニバーサルモードがVue、Svelte、Web Componentsで
00:01:58完璧に動作します。
00:01:59最良の結果を得るために、このアドオンはChromeまたはEdgeでの実行が推奨されています。
00:02:04また、これらの指標を実際に確認できるライブ・プレイブックも用意されています。
00:02:08例えば、アニメーションボックスの例では、アニメーション中に
00:02:13いくつのインラインスタイル変更が発生しているかを正確に追跡できます。
00:02:16このケースでは、すべてが正常に見えます。
00:02:18フレームレートとフレーム時間は完全に安定しており、ブラウザが負荷を感じることなく
00:02:23スタイル更新を処理できていることを意味します。
00:02:25しかし、重いリストの例では話が違ってきます。
00:02:29この巨大なリストをフィルタリングすると、いくつかの警告サインが現れます。
00:02:32まず、CLS(累積レイアウトシフト)が非常に高い値を示しており、
00:02:38読み込み時に要素が大きく動き、ユーザーに不快な体験を与えていることが分かります。
00:02:43また、DOMチャーンのスパイクも見られます。これはブラウザが大量のノードを
00:02:49一度に破棄して再構築するために過剰な負荷がかかっていることを示します。
00:02:52その結果、コマ落ち(ドロップフレーム)が発生し、
00:02:57インターフェースの体感速度や滑らかさが損なわれてしまいます。
00:02:58「element timing」の例では、element timing属性を持つすべてのDOM要素の
00:03:04正確なレンダリング時間が測定されます。
00:03:06これは非常に便利です。メインのコンテンツや、コール・トゥ・アクション(CTA)が
00:03:11表示される正確な瞬間を特定できるため、単なるページ読み込み指標よりも
00:03:17正確に体感パフォーマンスを把握できるからです。
00:03:21「重いレンダリング」の例を見てみましょう。再レンダリングボタンをクリックすると、
00:03:26P95の所要時間が急増します。
00:03:29これは、重いJavaScriptの実行によってメインスレッドが占有されてしまい、
00:03:34UIの動作が非常に重くなっているために起こります。
00:03:36ここでもフレームジッターの警告が出ており、レンダリングが不安定で
00:03:41フレーム間の時間が激しく変動していることが分かります。
00:03:44また、TBT(合計ブロック時間)も高くなっています。
00:03:47TBTは重大な警告サインです。なぜなら、メインスレッドが長時間ブロックされ、
00:03:52ユーザーがボタンのクリックやスクロールなどの
00:03:57操作を行えなくなっていることを示しているからです。
00:03:58「メモ化の無駄」の例でも同様の分析が可能です。
00:04:03このデモでは、すべての要素を不必要に再レンダリングすることで
00:04:08大幅なラグが生じることが示されています。
00:04:09対照的に、適切にメモ化された例では、コンポーネントをメモ化することで
00:04:15どれだけの処理を節約できるかが分かります。
00:04:16冗長なレンダリングを省くことで、メインスレッドが解放され、
00:04:21フレームレートが安定し、60fpsの非常に滑らかな動きが維持されます。
00:04:25「レンダー・カスケード」の例では、useLayoutEffectの中で
00:04:30setStateを使用した場合に何が起こるかを正確に確認できます。
00:04:31値を増やすたびにカスケードが発生します。なぜなら、useLayoutEffectは
00:04:37DOMの変更直後、ブラウザが描画を行う前に同期的に実行されるからです。
00:04:42ここで状態を更新すると、Reactはコンポーネントツリーを再処理し、
00:04:47ブラウザはユーザーが最初の結果を目にする前に、2回目のレイアウト計算を
00:04:52強制されることになります。
00:04:53これは、各フレームで実質的に2倍の作業を強いることになるため好ましくなく、
00:04:58単純な操作であっても動作を重く感じさせる原因となります。
00:05:02さらに、「スタイル・チャーン」の例でも重要な観察結果が得られます。
00:05:07600個の異なるノードのインラインスタイルを一度に変化させるとどうなるでしょうか?
00:05:13スラッシングのセクションですぐに「ストール」警告が表示されます。これは、
00:05:18ブラウザがリフローループに陥っていることを示しています。
00:05:21JavaScriptが変更を加えている最中に、ブラウザは600個の要素の
00:05:26位置を同時に計算しようとしています。
00:05:27これによりメインスレッドが完全に飽和状態になり、
00:05:33フレーム指標に非常に不健全な数値が出てしまいます。
00:05:34これらの例を通じて、このStorybookアドオンがいかに精密な環境で
00:05:38ボトルネックを特定できるかがお分かりいただけたかと思います。
00:05:41もちろんLighthouseも使えますが、それはあくまで大まかな診断です。
00:05:46個別のコンポーネントがアプリのパフォーマンスにどう影響するかを、
00:05:51ここまで外科手術のような精度で見ることはできません。
00:05:53ぜひこのアドオンをダウンロードして、Storybookスイートに追加して触ってみてください。
00:05:58実際に動かしてみることで、多くの発見があるはずです。
00:05:59コンポーネントが内部でどのように動作しているか、
00:06:03その全貌が見えてくると、非常に価値のある洞察が得られます。
00:06:06以上、新しいGitHubのStorybookパフォーマンスパネル・アドオンの
00:06:10概要をお伝えしました。
00:06:11皆さんはどう思われましたか?
00:06:13普段、アプリのパフォーマンスはどのように測定していますか?
00:06:16ぜひ下のコメント欄で教えてください。
00:06:18こうした技術解説がお好きな方は、ぜひ動画の下にある「いいね」ボタンを押して、
00:06:22チャンネル登録も忘れずにお願いします。
00:06:28Better StackのAndresでした。また次の動画でお会いしましょう。

Key Takeaway

この新しいStorybookアドオンは、開発の初期段階でコンポーネント単位の微細なパフォーマンス問題を特定・解決し、本番環境でのユーザー体験を劇的に向上させるための必須ツールです。

Highlights

GitHubがStorybook向けに、ブラウザのレンダリングエンジンとの相互作用を可視化する強力なパフォーマンスパネル・アドオンをリリースしました。

「シフトレフト・パフォーマンス・テスト」の概念に基づき、開発の初期段階でコンポーネントの負荷やボトルネックを特定することを目的としています。

フレームタイミング、DOMチャーン、レイアウトスラッシング、メモリ負荷、P95期間など、詳細な指標をリアルタイムで計測可能です。

React固有の課題である「レンダー・カスケード」や、不適切なメモ化による再レンダリングの波及を外科手術のような精度で分析できます。

CLS(累積レイアウトシフト)やTBT(合計ブロック時間)といった、ユーザー体験に直結するWeb指標の監視もサポートしています。

Reactだけでなく、Vue、Svelte、Web Componentsなどの主要なフレームワークでも動作するユニバーサルなツールです。

Timeline

アドオンの導入と「シフトレフト」の重要性

GitHubがリリースしたStorybook向けの新しいパフォーマンスアドオンの概要が紹介されます。このツールは、開発サイクルのより早い段階でテストを行う「シフトレフト」というパラダイムを実現するために設計されています。開発者は本番環境にデプロイする前に、コンポーネントがブラウザのレンダリングエンジンとどのように相互作用するかを確認できます。具体的にはフレームタイミングやメモリ負荷、入力応答性といった重要な知見をパネルから得ることが可能です。これにより、従来の後回しにされがちだったパフォーマンス最適化が、開発プロセスの一部として組み込まれます。

主要なパフォーマンス指標と専門用語の解説

アドオンが追跡する具体的な指標として、アニメーションのカクつきを指す「ジッター」や、不要な要素の更新である「DOMチャーン」が解説されます。また、スタイルの読み書きが連続してレイアウト計算が強制される「スラッシング」の危険性についても詳しく触れています。React利用者向けには、小さな状態変化がアプリ全体に広がる「レンダー・カスケード」の可視化機能が強調されています。平均値ではなくワーストケースを示す「P95期間」の重要性も説いており、最も遅いユーザーの体験を改善する手助けとなります。VueやSvelteを含む多種多様なフレームワークに対応しており、ChromeやEdgeでの利用が推奨されています。

ライブ・プレイブックによる実践的な検証例

実際のデモを用いて、アニメーションや重いリスト表示におけるパフォーマンスの差異を検証します。正常なアニメーションではフレームレートが安定していますが、巨大なリストのフィルタリング時にはCLS(累積レイアウトシフト)の急増やドロップフレームが発生する様子が示されます。これにより、ユーザーが不快に感じる「要素の動き」や「操作の重さ」が数値として明確になります。また、「element timing」属性を利用することで、特定のCTAボタンが表示される正確な瞬間を測定できる利点も紹介されています。単なるページ全体の読み込み速度ではなく、体感パフォーマンスをピンポイントで把握できるのがこのツールの強みです。

重いレンダリングとメインスレッドの占有

JavaScriptの実行がメインスレッドを長時間占有する「重いレンダリング」のシナリオが分析されます。この状態ではTBT(合計ブロック時間)が高くなり、ユーザーがクリックやスクロールを行っても反応しない重大な問題が発生します。動画内では、不必要な再レンダリングによって生じるラグと、適切なメモ化によって改善された結果を比較しています。メモ化を適用することでメインスレッドが解放され、60fpsの滑らかな動作が維持される様子がデータで証明されます。コンポーネントをメモ化することでどれだけの計算資源を節約できるか、具体的な数値で確認できるため最適化の判断が容易になります。

レンダリングの連鎖とスタイルの飽和状態

useLayoutEffect内でsetStateを行った際に発生する、非効率な「レンダー・カスケード」の仕組みが解説されます。ブラウザが描画を行う前に同期的な更新が行われるため、1フレーム内で2倍の作業が強制され、動作が重くなる原因となります。また、600個の要素のインラインスタイルを一度に変更する「スタイル・チャーン」の例では、ブラウザがリフローのループに陥る「ストール」警告が表示されます。JavaScriptが変更を加え続けている最中にレイアウト計算が重なり、メインスレッドが飽和する不健全な状態が視覚化されています。これらの詳細な分析は、広範な診断を行うLighthouseでは不可能な、コンポーネントレベルの外科的なアプローチを可能にします。

総括とコミュニティへの問いかけ

最後に、このStorybookアドオンがもたらす価値を再確認し、視聴者に対して自身のワークフローへの導入を推奨しています。コンポーネントが内部でどのように動作しているかの全貌が見えるようになることで、開発者は非常に価値のある洞察を得ることができます。Lighthouseなどの既存ツールを補完し、より精密なボトルネック特定を可能にする点がこのツールの最大の魅力です。スピーカーは、視聴者が普段どのようにパフォーマンスを測定しているかコメント欄での議論を促し、動画を締めくくります。最後にチャンネル登録と高評価を促すメッセージが添えられ、Better StackのAndres氏による解説が終了します。

Community Posts

View all posts