SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

基礎からはじめるReact入門

Storybookでコンポーネントの品質を向上する

基礎からはじめるReact入門 第6回

Storybookの基本

 それでは、getstorybookによって自動生成されたアプリケーションを見ながら、Storybookの基本を確認していきましょう。図2は左側のメニュー表示部です。

図2 ストーリーの管理
図2 ストーリーの管理

 カテゴリ分けされたリストの形式になっています。本記事では、カテゴリのことを「ストーリーズ」、リストの項目を「ストーリー」と呼びます。各ストーリーにはコンポーネントが1つ登録されており、ストーリーを選択すると該当のコンポーネントが右側のコンポーネント表示部に表示されます。ストーリーズはそれらを取りまとめる役割です。

エントリーポイントと記法

 create-react-app製のアプリケーションの中でStorybookを運用する場合、エントリーポイントはsrc/stories/index.jsに生成されます。サンプルとして、いくつかのストーリーが用意されているので解説します。

import React from 'react';

import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import { linkTo } from '@storybook/addon-links';

import { Button, Welcome } from '@storybook/react/demo'; // (3)

storiesOf('Welcome', module) // (1)
  .add('to Storybook', () => ( // (2)
    <Welcome showApp={linkTo('Button')} /> // (4)
  ));

storiesOf('Button', module)
  .add('with english text', () => (
    <Button onClick={action('clicked')}>Hello Button</Button> // (5)
  ))
  .add('with japanese text', () => (
    <Button onClick={action('clicked')}>押してください</Button>
  ));

 ストーリーズは(1)のようにstoriesOf関数を呼び出して定義します(1)。第一引数にはタイトルを渡し、第二引数にはグローバル変数のmoduleを渡します。ストーリーはstoriesOfの戻り値からadd関数を呼び出すことで定義します(2)。こちらも第一引数はタイトルですが、第二引数には表示したいコンポーネントの定義を書きます。このサンプルでは(3)でインポートしたコンポーネントが仮置きされていますが、もちろん相対パスで自作のコンポーネントを呼び出すのが本来の使い方です。こちらについては後述します。

 ここまでがStorybookのコア部分の使い方の解説でした。非常にシンプルなAPIなので、覚えやすいですね。

 Storybookは機能拡張の仕組みとして、アドオンという機能を持っています。サンプルにもいくつか活用されているので、確認してみましょう。

 まずは、(4)で利用されている、@storybook/addon-linksパッケージからインポートされたlinkTo関数です。linkTo関数にストーリーズの名前を渡して呼び出すと、該当するストーリーズに画面遷移するための関数オブジェクトを生成します。onClick属性などに渡すのが本来の用途です。

 もう1つが、(5)で利用されている、@storybook/addon-actionsパッケージからインポートされたaction関数です。action関数に任意の名前を渡して呼び出すと、アクション表示部にメッセージを表示するための関数オブジェクトを生成します。コンポーネントがpropsでコールバック関数を受け付けているときに、action関数の戻り値を渡しておくと、コンポーネント内でコールバック関数が呼ばれたことを、アクション表示部で知ることができるようになります。図3のように、渡された引数の概要も表示されるので、かなり重宝します。

図3 ボタンを押したときのアクション表示部の見た目
図3 ボタンを押したときのアクション表示部の見た目

各種設定ファイル

 getstorybookがもたらした変更はsrc/storiesの追加だけではありません。package.jsonのscriptsには、次の2つが追加されました。

"scripts": {
  // (省略)
  "storybook": "start-storybook -p 9009 -s public",
  "build-storybook": "build-storybook -s public"
},

 先ほどnpm run storybookで実行していたのはこのstorybookです。build-storybookはStorybookを静的なWebアプリケーションとしてデプロイ可能な形に出力するタスクです。社内サーバーにアップロードして関係者に挙動を見せたい場合などに威力を発揮するでしょう。

 また、devDependenciesにも次のパッケージが追加されています。アドオンは個別のパッケージとしてインストールされていることが分かります。

"devDependencies": {
  "@storybook/react": "^3.3.9",
  "@storybook/addon-actions": "^3.3.9",
  "@storybook/addon-links": "^3.3.9",
  "@storybook/addons": "^3.3.9",
  // (省略)
}

 package.json以外では、次のファイルが追加されています。

  • .storybook/addons.js
  • .storybook/config.js

 addons.jsは有効にするアドオンの設定、config.jsはエントリーポイントの設定を行っています。特にアドオンについては、npm installだけではなく、addon.jsへの設定を行わないと有効にならないため、注意が必要です。

 アドオンは公式サイトで紹介されているので、興味があればのぞいてみてください。Storybookの機能を拡張する便利な機能がたくさんあります。

次のページ
ストーリーズを追加する

この記事は参考になりましたか?

基礎からはじめるReact入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 中川 幸哉(ナカガワ ユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10667 2018/03/02 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー