目次
概要
今期あのブログポストではTypeScript
をベースにしたNext.js
プロジェクトでStorybook
を使ってコンポーネント主導開発(Component Driven Development)をしてみます。
今回のブログポストではStorybook
のV7
バージョン(next
)を使う方法を調べる予定です。V6
バージョンを使う方法については次のリンクを確認してください。
ここで紹介するソースコードは下記のリンクで確認できます。
TypeScriptベースNext.jsプロジェクト生成
TypeScript
が適用されたNext.js
でStorybook
を使うため、次のコマンドを実行してTypeScript
が適用されたNext.js
プロジェクトを生成します。
npx create-next-app --typescript start-storybook-v7
Storybookのインストール
TypeScript
が適用されたNext.js
プロジェクトでStorybook
を使ってコンポーネント主導開発をするためにはStorybook
をインストールする必要があります。下記のコマンドを実行してStorybook
をインストールします。
# cd start-storybook-v7
npm install --save-dev [email protected]
Storybookの初期化
Storybook
を使うためにはStorybook
を初期化して必要なライブラリをインストールする必要があります。次のコマンドを実行してStorybook
を初期化します。
npx [email protected] init
そしたら、次のように自動でStorybook
が初期化せれることが確認できます。
storybook init - the simplest way to add a Storybook to your project.
• Detecting project type. ✓
• Adding Storybook support to your "Next" app
added 318 packages, and audited 1125 packages in 54s
226 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
. ✓
• Preparing to install dependencies. ✓
最後の下記のような質問が出ますが。
? Do you want to run the 'eslintPlugin' migration on your project? › (Y/n)
ESLint
を使ってコードを検査する場合、y
を押して進めます。逆に使ってない場合n
を押して進めます。このブログポストではy
を押して進めました。
その後、次のようにStorybook
が自動で必要なライブラリをインストールし、Storybook
を実行するスクリプトを自動で追加することが確認できます。

{
...
"scripts": {
...
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
},
...
"devDependencies": {
"@storybook/addon-essentials": "^7.0.0-rc.8",
"@storybook/addon-interactions": "^7.0.0-rc.8",
"@storybook/addon-links": "^7.0.0-rc.8",
"@storybook/blocks": "^7.0.0-rc.8",
"@storybook/nextjs": "^7.0.0-rc.8",
"@storybook/react": "^7.0.0-rc.8",
"@storybook/testing-library": "^0.0.14-next.1",
"eslint-plugin-storybook": "^0.6.11",
"storybook": "^7.0.0-rc.8"
...
}
}
また、次のようにStorybook
を使う方法を教えるため、サンプルコードが一緒に生成されることが確認できます。
./.storybook/...
:Storybook
に関する設定ファイル./stories/...
:Storybook
のサンプルコード
ESLint
を使うように設定したので、.eslintrc.json
ファイルを開くと下記のように変更されたことが確認できます。
{
"extends": [
"next/core-web-vitals",
"plugin:storybook/recommended"
]
}
publicフォルダ設定
Next.js
のpublic
フォルダにあるstatic
ファイル(イメージ)をStorybook
で認識できるようにするためmain.ts
ファイルを開いて下記のように修正します。
import type { StorybookConfig } from '@storybook/nextjs'
const config: StorybookConfig = {
...
docs: {
autodocs: 'tag',
},
staticDirs: ['../public'],
}
export default config
Storybookの実行
今まで設定したStorybook
を実行して、Storybook
がうまくインストールされたか確認してみましょう。次のコマンドを実行してStorybook
を実行します。
npm run storybook
そしたらブラウザでhttp://localhost:6006/
が自動で開けて、下記のような画面が確認できます。

当該画面は./stories/Introduction.mdx
ファイルが表示された画面になります。
Storybook確認
実行されたStorybook
の左メニューのButton > Primary
を選択すると次のような画面が確認できます。

この画面は./stories/Button.stories.ts
ファイルが表示された画面です。
サンプルコード確認
もっと詳しく調べるためサンプルコードを確認してみましょう。Button
コンポーネント(./stories/Button.tsx
)は次のようです。
import React from 'react';
import './button.css';
interface ButtonProps {
primary?: boolean;
backgroundColor?: string;
size?: 'small' | 'medium' | 'large';
label: string;
onClick?: () => void;
}
export const Button = ({
primary = false,
size = 'medium',
backgroundColor,
label,
...props
}: ButtonProps) => {
const mode = primary ? 'storybook-button--primary' : 'storybook-button--secondary';
return (
<button
type="button"
className={['storybook-button', `storybook-button--${size}`, mode].join(' ')}
{...props}
>
{label}
<style jsx>{`
button {
background-color: ${backgroundColor};
}
`}</style>
</button>
);
};
Button
コンポーネントはprimary
, backgroundColor
など色んなProps
を持ってることが確認できます。次はStorybook
ファイル(./stories/Button.stories.ts
)の内容を確認してみましょう。
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = {
title: 'Example/Button',
component: Button,
tags: ['autodocs'],
argTypes: {
backgroundColor: {
control: 'color',
},
},
};
export default meta;
type Story = StoryObj<typeof Button>;
export const Primary: Story = {
args: {
primary: true,
label: 'Button',
},
};
export const Secondary: Story = {
args: {
label: 'Button',
},
};
export const Large: Story = {
args: {
size: 'large',
label: 'Button',
},
};
export const Small: Story = {
args: {
size: 'small',
label: 'Button',
},
};
まず、Storybook
の画面構成に必要な情報を準備します。
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = {
title: 'Example/Button',
component: Button,
tags: ['autodocs'],
argTypes: {
backgroundColor: {
control: 'color',
},
},
};
export default meta;
type Story = StoryObj<typeof Button>;
...
meta
はStorybook
で表示する基本情報を設定します。meta
に設定したtitle
はStorybook
の左メニューに表示される名前を表れて、/
を使ってグループを作ることができます。サンプルコードではExample
グループの下にButton
と言う名前で表示されることが確認できます。

meta
のcomponent
はこのStorybook
で表示するコンポーネントを指定します。サンプルではButton
コンポーネントを指定しました。
tags: ['autodocs']
は自動でドキュメント(Document)を作成する新しい機能です。この値を設定すると上のイメージようにExample/Button
メニュー下にDocs
が自動で生成されることが確認できますし、ここでStorybook
ファイルで作成した内容がドキュメント形で確認できます。
このように画面構成に必要な情報を設定したら、次は実際画面に表示されるStory
を作成します。次のようにコンポーネントのProps
を設定したり、変更したがらStory
を作成することができます。
...
export const Primary: Story = {
args: {
primary: true,
label: 'Button',
},
};
export const Secondary: Story = {
args: {
label: 'Button',
},
};
export const Large: Story = {
args: {
size: 'large',
label: 'Button',
},
};
export const Small: Story = {
args: {
size: 'small',
label: 'Button',
},
};
Storybookの設定
現在はStorybook
を作成するためには./stories
フォルダで作成する必要があります。しかし、普通はコンポーネントは./components
フォルダを作って管理するようにします。
このようにStorybook
を他のフォルダで作成するためには./.storybook/main.ts
ファイルを修正する必要があります。./.storybook/main.ts
ファイルを開いて下記のように修正します。
import type { StorybookConfig } from '@storybook/nextjs';
const config: StorybookConfig = {
stories: [
'../@(stories|components)/**/*.mdx',
'../@(stories|components)/**/*.stories.@(js|jsx|ts|tsx)',
],
...
};
...
次はstories
フォルダ以外にcomponents
フォルダでも.stories.ts
ファイル名を持ってれば、Storybook
がこれを認識して画面に表示するようになります。これを確認するため./components/SampleButton
フォルダを生成して次のファイルをコピーします。
./stories/button.css
>./components/SampleButton/index.css
./stories/Button.stories.ts
>./components/SampleButton/index.stories.ts
./stories/Button.tsx
>./components/SampleButton/index.tsx
そして./components/SampleButton/index.tsx
ファイルを開いて下記のように修正します。
...
import './index.css';
...
export const SampleButton = ({
...
}: ButtonProps) => {
...
};
そして./components/SampleButton/index.stories.ts
ファイルを開いて下記のように修正します。 파일을 열어서 다음과 같이 수정합니다.
...
import { SampleButton } from '.';
const meta: Meta<typeof SampleButton> = {
title: 'Sample/Button',
component: SampleButton,
...
};
export default meta;
type Story = StoryObj<typeof SampleButton>;
...
Storybook
の設定を変更したらこれを反映するため、現在実行してるStorybook
を終了させて再び実行します。 Storybook
が再び実行されると下記のように私たちが作ったSampleButton
がうまく表示されることが確認できます。

完了
今回のブログポストではTypeScript
をベースにしたNext.js
プロジェクトでコンポーネント主導開発をするためStorybook V7
を設定する方法についてみてみました。以前のバージョンより使いやすくなって、もっと直感的に変更されたことが確認できました。以前のバージョンのStorybook
を設定して使う方法については次のリンクを確認してください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。