Storybook導入を振り返る
レビュー投稿日の情報になります
株式会社LayerX / pirosikick
メンバー / フロントエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
最終更新日投稿日
| 事業形態 |
|---|
B to B |
| 事業形態 | B to B |
|---|
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
- UIコンポーネント単体での動作確認が困難
- コンポーネントをリファクタリングする際、デザイン崩れがないかを確認するには実際のアプリを立ち上げるしかなく、「基本的にほとんどはコードベースでしか変更を確認できていない状況」であった。
- 手動確認への依存と確認コストの増大
- 「見た目で確認できるし、動いているからOK」という手動確認に依存していた。仕様が複雑化するにつれて確認すべきパターンが増加し、テストデータの再現にも手間がかかるようになっていた。
- PRレビュアーへの負担
- レビュアーがコンポーネントの見た目・挙動を確認するには、ローカルで立ち上げる手間がかかっていた。
- デグレ検知の仕組みがない
- VRTやスナップショットテストが存在せず、リファクタリング後の見た目のデグレを自動検知する手段がなかった。
- デザイナーなど他職種がUIを確認できない
- デザインシステム構築を見据えたとき、エンジニア以外がUIコンポーネントの実態を確認できる共通の場所がなかった。
どのような状態を目指していたか
- 短期:コンポーネント単体での効率的な動作確認
- propsの変更(String / Number / Boolean)、インタラクション(clickイベントなど)をGUI上で確認できる。
- Viewport・背景色・多言語切り替えなどのエンハンス機能も活用できる。
- コンポーネントを変更する際のテンポラリーな確認ツールとしても使用できる。
- 中期:手動確認をコードで置き換えるテスト基盤
- Play Functionを使い、UIの振る舞い(フォーム入力・ボタンクリック・モーダル開閉など)を自動再現してテストできる。
- MSWと
@graphql-codegen/typescript-mswを組み合わせてGraphQLレスポンスをネットワーク層でモックし、バックエンドなしで統合テストを実行できる。 - PRごとにStorybookをデプロイしてURLをコメントすることでレビュアーの確認コストを下げる。
- 長期:デザインシステムの合意形成基盤
- デザイナーもブラウザ越しにUIを確認できる環境(V2でAzure Static Web Appsにホスティング・Azure AD認証でGitHubアカウント不要でアクセス可能)を整備する。
- コンポーネントカタログを他職種との合意形成の場として活用し、デザインシステム化を推進する。
導入の成果
改善したかった課題はどれくらい解決されたか
- UIコンポーネント単体での動作確認が可能になった。
- Play Functionを活用した統合テストを実装し、手動確認に依存していたUIの振る舞いの一部をコードで保証できるようになった。
- Storybookをホスティングすることで、PRのレビューアー、PdM、デザイナーがローカルにアプリケーションを立ち上げる手間なくブラウザ越しにUIを確認できるようになった。
導入に向けた社内への説明
上長・チームへの説明
※ 著者入社前に導入されていたため、本章は当時の関係者が残した社内ドキュメントをもとに整理しています。
- 具体的なPRを起点にした提案
- ボタンコンポーネントのリファクタリングPRを実際に進めながら、「このタイミングでStorybookがあれば単体での動作確認・レビューが容易になる」と具体的なユースケースを示して提案した。抽象的な「導入したい」ではなく、進行中の作業と接続することで説得力を持たせた。
- 過去の懸念を正面から受け止めつつ推しポイントを整理
- 「負債になりそう」で見送られた経緯があったため、その懸念を認めた上で「リファクタリングが続くフェーズでは、コンポーネント単体テストやレビューコスト削減のメリットが出やすい」という文脈を示した。
- ツール選定でLadleと比較しStorybookを選択
- 導入タスクで正式にStorybookとLadleを比較した。Ladleの「3rd party addonが使えない(i18n切り替え等)」「デザインシステムほどのカタログを再現しにくい」という点を踏まえ、「今後のデザインシステム化を見据えると、ある程度の柔軟性が欲しい」 という理由でStorybookを選定した。将来のデザインシステムという上位目標と紐付けることで、追加の保守コストを払う合理性を示した。
活用方法
よく使う機能
- コンポーネントのカタログ機能
- Play Functionによるテスト機能
ツールの良い点
- コンポーネントカタログとして強力
- props変更・インタラクション確認・コンポーネント一覧が一画面に収まり、「何をどう使うかの理解に役立つ」。コンポーネント設計が正しければ、変更をStorybook上に閉じて確認できるため、実画面での確認より効率的である。
- Play FunctionでUIの振る舞いをコード化できる
- フォーム入力やボタンクリック、モーダル開閉といった手動確認していたユーザー操作を自動再現してテストできる。テストコードがユーザーの操作手順そのままの自然なシナリオ構成(「36協定の起算月を4月に変更→保存ボタンをクリック→確認モーダル表示確認」)になるため、初見の開発者でも意図が明確に読み取れる。
- ブラウザでテスト結果をビジュアル確認できる
- テスト失敗時にブラウザ上で状態を目視確認しながらデバッグできるため、
console.log頼りのデバッグと比較して大幅に効率が向上する。
- テスト失敗時にブラウザ上で状態を目視確認しながらデバッグできるため、
- 実ブラウザでテストできる
- jsdomやhappy-domのようなエミュレーションではなく実ブラウザでテストを実行できるので、安心。
- デザイナーとの合意形成ツールになれる
- ホスティングを組み合わせることで、GitHubアカウントを持たないデザイナーもブラウザ越しにUIを確認できる。デザインシステム化に向けた他職種との合意形成の場として機能する。
ツールの課題点
- コンポーネントの変更・増減への追従コストがかかる
- コンポーネントのpropsやロジックが変わるたびにStoriesファイルの更新が必要になる。「後付けで書く感じになりやすい」という声のとおり、記述すること自体が目的となりがちで形骸化しやすい。
- コンテキストや外部ライブラリとの共存に壁がある
- スタイルやフォントの読み込み方、外部ライブラリとの統合に一定のセットアップコストがかかる。
- バージョンアップのコストが継続的にかかる
- Breaking changeが多く、メジャーバージョンアップのたびに対応工数が発生する。
- テスト実行速度が遅い
@storybook/addon-vitestへの移行で改善するが、DOM構造を作成・探索するため本質的に速度が出にくい。
株式会社LayerX / pirosikick
メンバー / フロントエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名
よく見られているレビュー
株式会社LayerX / pirosikick
メンバー / フロントエンドエンジニア / 従業員規模: 101名〜300名 / エンジニア組織: 51名〜100名


