Storybook은 컴포넌트 단위의 개발 환경을 지원하는 개발도구이다 독립적인 컴포넌트 개발이 가능하도록 지원해주어 각각의 컴포넌트 개발에 집중할 수 있다. 또한 AddOn을 활용하여 각각의 컴포넌트들에 대한 추가적인 정보를 제공할 수 있게도 해주어서 컴포넌트 다큐먼트로도 활용이 가능하지 않을까함

Installation

생성한 프로젝트에 storybook을 설치한다

npm i --save-dev @storybook/vue
config 파일 생성

Story 파일 로딩을 위해 storybook/config.js파일에 아래와 같이 설정한다

// config.js
import { configure } from '@storybook/vue';

function loadStories() {
  const req = require.context('../stories', true, /\.stories\.js$/)
  req.keys().forEach((filename) => req(filename))
}

configure(loadStories, module);

stories 디렉토리 하위에 .sotries.js 확장자가 포함된 모든 파일을 로딩하기 위해서 위와 같이 작성하였음 (Loading stories dynamically 참고)

stories 작성
// index.js
import { storiesOf } from '@storybook/vue'

// component
import ProgressBar from '../src/components/status/ProgressBar.vue'

storiesOf('status', module) // 상위 카테고리 지정
  .add('progressBar', () => ({ // 하위 내용 지정
    components: { ProgressBar },
    template: `<div style="padding: 2rem;">
      <progress-bar :value=20></progress-bar>
    </div>`
  }))
storybook 실행

package.json에 storybook 실행을 위한 명령어를 script에 추가해준다

{
  "scripts": {
    "storybook": "start-storybook -p 9001 -c .storybook"
  }
}

이후에는 아래와 같이 storybook을 실행하면 된다

npm run storybook

style 파일 로딩하기

.css, .scss ...과 같은 작성한 스타일 파일 로딩하는 방법

preview-head.html
html 태그를 이용하여 import하는 방법이다. .stroybook/preview-head.html 파일을 생성하고 아래와 같은 형태로 작성한다.

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link href="https://use.fontawesome.com/releases/v5.0.8/css/all.css" rel="stylesheet">

좀 더 자세한 내용은 Add Custom Head Tags의 내용을 참고

webpack 빌드 설정

.storybook/webpack.config.js 파일을 생성해서 아래와 같이 작성한다.

const path = require('path')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = {
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src')
    }
  },
  module: {
    rules: [
      {
        test: /\.scss$/,
        loaders: ["style-loader", "css-loader", "sass-loader"],
        include: resolve('src')
      }
    ]
  }
}

좀 더 자세한 내용은 Custom Webpack Config의 내용을 참고

Addon

addon-actions

addon-actions은 이벤트 핸들러에 의해 전달받은 데이타를 ACTION LOGGER 화면에 출력해준다 Installation

npm install --save-dev @storybook/addon-actions

Usage
.storybook/addons.js에 아래와 같이 작성해준다

import '@storybook/addon-actions/register'

stories 파일에 해당 addon을 import 한 뒤에 이벤트에 연결해준다

// index.js
import { storiesOf } from '@storybook/vue'
import VueInfoAddon from 'storybook-addon-vue-info'
import { action } from '@storybook/addon-actions'

// component
import MyButton from '../src/components/button/MyButton.vue'

storiesOf('button', module) // 상위 카테고리 지정
  .addDecorator(VueInfoAddon)
  .add('MyButton', () => ({ // 하위 내용 지정
    components: { MyButton },
    template: '<my-button onClick={ action('button-click') }>Button</my-button>'
  }))

storybook-addon-console

storybook-addon-console은 디버그 콘솔에 출력되는 메시지를 ACTION LOGGER 창에 출력해준다.

addon-actions 이 사전에 설치되어있어야 한다. Installation

npm install --save-dev @storybook/addon-console

Usage
.storybook/config.js에 아래의 내용을 추가로 작성한다

// addons
import { setConsoleOptions } from '@storybook/addon-console';

// for redirect console log
const panelExclude = setConsoleOptions({}).panelExclude;
setConsoleOptions({
  panelExclude: [...panelExclude],
});

storybook-addon-vue-info

storybook-addon-vue-info은 컴포넌트의 정보를 추가로 화면에 출력해준다.

Installation

npm install --save-dev storybook-addon-vue-info

Usage
stories 파일에 해당 addon을 import 해준다

// index.js
import { storiesOf, addDecorator } from '@storybook/vue'
import VueInfoAddon from 'storybook-addon-vue-info'

// component
import ProgressBar from '../src/components/status/ProgressBar.vue'

addDecorator(VueInfoAddon)

storiesOf('status', module) // 상위 카테고리 지정
  .add('progressBar', () => ({ // 하위 내용 지정
    components: { ProgressBar },
    template: '<progress-bar :value=20></progress-bar>'
  }))

viewport

Storybook Viewport Addon

npm i --save-dev @storybook/addon-viewport
// .storybook/config.js
import '@storybook/addon-viewport/register'

addon-centered

Storybook Centered Decorator preview 화면을 가운데로 정렬한다.

npm install @storybook/addon-centered --save-dev
// .storybook/config.js
import previewCentered from '@storybook/addon-centered'
addDecorator(previewCentered)

addon-storysource

Storybook Storysource Addon는 해당 컴포넌트에 대하여 작성한 스토리 스크립트를 하단의 창에 출력해준다.

npm install @storybook/addon-storysource --save-dev
// .storybook/webpack.config.js
const path = require('path');

module.exports = (storybookBaseConfig, configType) => {
  storybookBaseConfig.module.rules.push({
    test: [/\.stories\.js$/, /index\.js$/],
    loaders: [require.resolve('@storybook/addon-storysource/loader')],
    include: [path.resolve(__dirname, '../stories')],
    enforce: 'pre'
  });

  // Return the altered config
  return storybookBaseConfig;
};

Reference