6

Storybook 3.2 引入 Vue.js 支持从属于笔者的前端每周清单系列,更多 Vue.js 相关资料参考 Vue.js 学习实践资料索引

Vue.js Storybook

在 React 开发中我们已经习惯了使用 Storybook 来进行组件交互式开发与预览,也就是所谓的 Storybook Driven Development;而在近日发布的 Storybook 3.2版本中,其引入了对于 Vue.js 的支持。这里我们为笔者的基于 Webpack 3 的 Vue.js 工程项目脚手架添加 Storybook 支持:

# 安装 Storybook 依赖
npm i -g @storybook/cli
cd my-vue-project

# 项目目录下获取 Storybook
getstorybook

# 运行 Storybook
npm run storybook

我们在 src/component 文件夹下添加简单的按钮组件:

<template>
  <button class="button-styles" @click="onClick">
    <slot>Fallback Content</slot>
  </button>
</template>

<script>
  export default {
    name: 'my-button',
  
    methods: {
      onClick () {
      }
    }
  }
</script>

<style>
  .button-styles {
    border: 1px solid #eee;
    border-radiuas: 3px;
    background-color: #FFFFFF;
    cursor: pointer;
    font-size: 15pt;
    padding: 3px 10px;
    margin: 10px;
  }
</style>

然后在 src/stories 目录下,可以利用 Storybook 提供的接口注册 Story:

/* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions */

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

import MyButton from '../component/MyButton.vue';

storiesOf('Button', module)
  .add('with text', () => ({
    components: { MyButton },
    template: '<my-button @click="action">Hello Button</my-button>',
    methods: { action: action('clicked') },
  }))
  .add('with some emoji', () => ({
    components: { MyButton },
    template: '<my-button @click="action">? ? ? ?</my-button>',
    methods: { action: action('clicked') },
  }));

最后在 .storybook/config.js 文件中指明 stories 的配置地址:

import { configure } from '@storybook/vue'

function loadStories() {
  require('../src/stories')
}

configure(loadStories, module)

我们也可以自定义 Webpack 配置,在 .storybook 中添加 webpack.config.js:

// @flow

const webpack = require('webpack');
const autoprefixer = require('autoprefixer');

module.exports = {
  plugins: [
    new webpack.LoaderOptionsPlugin({
      options: {
        context: '/',
        postcss: [
          autoprefixer({
            browsers: [
              'ie >= 9',
              'ie_mob >= 10',
              'ff >= 30',
              'chrome >= 34',
              'safari >= 7',
              'opera >= 23',
              'ios >= 7',
              'android >= 4.4',
              'bb >= 10'
            ]
          }),
          require('postcss-flexibility')
        ]
      }
    })
  ],
  module: {
    rules: [
      {
        test: /\.(css|scss)$/,
        loaders: ['style-loader', 'css-loader', 'sass-loader']
      }
    ]
  }
};

同样的,也可以使用 Storybook 丰富的插件系统:

// @flow

import { configure, setAddon } from '@storybook/react';
import infoAddon from '@storybook/addon-info';
import { setOptions } from '@storybook/addon-options';

setAddon(infoAddon);

# 设置 全局信息展示
setOptions({
  name: 'fractal-components',
  url: 'https://github.com/wxyyxc1992/fractal-components',
  showDownPanel: false
});


function loadStories() {
  ...
}


configure(loadStories, module);

王下邀月熊_Chevalier
22.5k 声望8.5k 粉丝

爱代码 爱生活 希望成为全栈整合师