フロントエンド界隈で Storybook を使っているとの話をよく聞いていたのですが使ったことがなかったため、動作確認をしてみました。
この記事では 以前に作成した Nuxt プロジェクト に Storybook を導入しています。
*Storybook とは
開発環境と分離された環境で UI コンポーネントを個別に作成し、コンポーネントの再利用やテストを容易にすることができるツールです。アプリケーションの依存関係を気にする必要がないため迅速な開発ができます。カタログのように可視化することができるため、周囲への共有も簡単になります。拡張機能も充実しており、スナップショットのテストをしたり、Storybook でコンポーネントの修正をしたりすることもできます。Angular や Vue、React、React Native にも対応しています。
具体的な例は公式サイトの サンプル集 を参照してください。
*環境
- macOS
- nuxt 2.8.1
- storybook/vue 5.2.1
*参考
*インストール
今回は 以前に作成した Nuxt プロジェクト に Storybook を導入します。プロジェクト直下で下記コマンドを実行します。
CLI を使うと面倒な設定を自動で全てやってくれます。自分でカスタマイズしたい場合は
npm install @storybook/vue --save-dev
を使います。(公式サイト の Manual setup を参照)$ npx -p @storybook/cli sb init --type vue
下記コマンドを実行すると、Storybook が起動しブラウザに表示されます。
$ npm run storybook
もしくは下記URLにアクセスします。
http://localhost:6006/
補足ですが、今回 CLI では下記ファイルの作成を自動でやってくれます。
<.storybook/addons.js>
そのほか
(参考:公式サイト / custom-webpack-config)
下記を新規作成します。
<.storybook/webpack.config.js>
<assets/scss/style.scss>
<components/common/ButtonWide.vue>
<stories/button.stories.js>
再度、Storybook を起動しなおすと作成したボタンのコンポーネントが表示されます。
サービスの立ち上げ時は Storybook で汎用的に使えるようなコンポーネント化を意識しつつ、サービスの拡大見込みができて作業に余裕があるときに導入するのが良いかと思いました。
import '@storybook/addon-actions/register';
import '@storybook/addon-links/register';
<.storybook/config.js>
import { configure } from '@storybook/vue';
// automatically import all files ending in *.stories.js
configure(require.context('../stories', true, /\.stories\.js$/), module);
そのほか
stories
ディレクトリにサンプルファイルを作成します。*SCSSの読込み設定
SCSS を使っている場合はデフォルトのままだと読み込めずエラーになるので.storybook
ディレクトリにwebpack.config.js
を新規作成する必要があります。webpack.config.js
とは webpack を使って Javascript / CSS のビルドをするために必要な設定ファイルです。Storybook は webpack を使っているため、webpack.config.js
で CSS を読み込む設定をします。(参考:公式サイト / custom-webpack-config)
下記を新規作成します。
<.storybook/webpack.config.js>
const path = require('path');
module.exports = {
module: {
rules: [
{
test: /\.scss$/,
use: [
'style-loader',
'css-loader',
'sass-loader',
{
loader:'sass-resources-loader',
options: {
resources: ['./assets/scss/style.scss']
}}],
include: path.resolve(__dirname, '../'),
}
]
}
}
resources
に指定している SCSS ファイルは独自で必要なファイルを指定してください。今回はstyle.scss
で全ての SCSS ファイルを読み込むようにしているため 1つのファイルしか指定していませんが、複数のファイルを指定することが可能です。<assets/scss/style.scss>
@charset "utf-8";
@import '_variables';
@import '_base';
@import '_section-title';
@import '_effect';
*コンポーネントを追加
サンプルとしてボタンのコンポーネントを新規作成します。<components/common/ButtonWide.vue>
<template>
<div>
<button class="btn-blue">Button</button>
</div>
</template>
<style scoped lang="scss">
.btn-blue {
font-size: 18px;
background-color: #668ad8;
color: #fff;
width: 200px;
height: 50px;
border-radius: 5px;
text-decoration: none;
border-bottom: solid 4px #627295;
}
</style>
stories
ディレクトリにbutton.stories.js
を新規作成します。storiesOf()
にグループ名を指定し、add()
でコンポーネントのストーリー名を追加します。1グループに複数のストーリーを追加することができます。<stories/button.stories.js>
import { storiesOf } from '@storybook/vue'
import ButtonWide from '../components/common/ButtonWide.vue'
storiesOf('ButtonWide', module).add('default', () => ({
components: { ButtonWide },
template: `<button-wide></button-wide>`
}))
再度、Storybook を起動しなおすと作成したボタンのコンポーネントが表示されます。
$ npm run storybook
*所感
今回は Storybook の簡単な動作確認をしてみたので試していないですが、コンポーネントの中で外部のライブラリを使っている場合は別途読み込む設定が必要そうでした。また、コンポーネントの中でパスを指定して画像を表示している場合、Storybook と開発環境で読み込む設定を同じにする必要がありそうです。そのため、開発環境と異なる環境でコンポーネントを作成することができる反面、開発環境と同様の設定を Storybook でもいちからする必要があるため手間がかかりそうでした。サービスの立ち上げ時は Storybook で汎用的に使えるようなコンポーネント化を意識しつつ、サービスの拡大見込みができて作業に余裕があるときに導入するのが良いかと思いました。
Sign up here with your email
ConversionConversion EmoticonEmoticon