使用StoryBook——更好地管理我们的UI组件

安装vue脚手架:

Node.js>=8.9
没有vue-cli3的先安装一下:

npm install -g @vue/cli
# OR
yarn global add @vue/cli

安装完后查看版本:

vue --version

创建项目:

vue create storybook-test

选择相对应的配置,
等待项目创建完毕。

安装storybook,并初始化

cd storybook-test
npx -p @storybook/cli sb init

如果没检测到使用的是vue,可以尝试注明类型:

npx -p @storybook/cli sb init --type vue

或者自行添加:
教程链接https://storybook.js.org/docs/guides/guide-vue/

添加storybook,书写stories

为了清除了解storybook对项目进行了哪些改造,这里用手动添加的方法。

  1. 添加依赖

    npm install @storybook/vue --save-dev
    
  2. 添加npm脚本

    {
      "scripts": {
        "storybook": "start-storybook"
      }
    }
    
  3. 添加配置文件

    .storybook/config.js

    import { addParameters,configure } from '@storybook/vue';
    function loadStories() {
      /*根据特定的文件名加载stories,在这个例子,用xxx.stories.js命名文件*/
      const req = require.context('../src', true, /\.stories\.js$/);
      req.keys().forEach(filename => req(filename));
    }
    addParameters({
      options: {
        panelPosition: 'right' //操作面板在右边
      },
    })
    configure(loadStories, module);
    
    
  4. 添加必须的webpack配置

    .storybook/webpack.config.js

    const path = require('path');
    
    // Export a function. Accept the base config as the only param.
    module.exports = async ({ config, mode }) => {
      // `mode` has a value of 'DEVELOPMENT' or 'PRODUCTION'
      // You can change the configuration based on that.
      // 'PRODUCTION' is used when building the static version of storybook.
    
      // Make whatever fine-grained changes you need
      config.module.rules.push({
        test: /\.scss$/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
        include: path.resolve(__dirname, '../'),
      });
      Object.assign(config.resolve.alias,{
        '@': path.resolve(__dirname, '../src'),
         '@assets': path.resolve(__dirname, '../src/assets/')
      })
      // Return the altered config
      return config;
    };
    

    因为我使用了Sass和alias,在提供给storybook的webpack配置文件上加上相应的内容

  5. 添加我们的组件

    src/components/Button.vue

    <template>
      <button :class="type" class="btn">
        <slot></slot>
      </button>
    </template>
    
    <script>
    export default {
      name: "HelloWorld",
      props: {
        type: {
          type: String,
          default: "default" // default/primary/danger
        }
      }
    };
    </script>
    
    <style scoped lang="scss">
    .btn {
      border: 1px solid transparent;
      background: #fff;
      outline: none;
      color: #333;
      padding: 5px 10px;
    }
    .default {
      border: 1px solid #e3e3e3;
      color: #333;
      background-color: #fff;
    }
    .primary {
      border: 1px solid #007cff;
      color: #fff;
      background-color: #007cff;
    }
    .danger {
      border: 1px solid #cb191d;
      color: #fff;
      background-color: #cb191d;
    }
    </style>
    
  6. 为组件添加story

    /src/components/Button.stories.js

    import Vue from 'vue';
    import { storiesOf } from '@storybook/vue';
    import vButton from './Button.vue';
    
    storiesOf('GoodsCategory', module)
      .add('default', () => ({
        components: { vButton },
        template: '<v-button>default</v-button>',
      }))
      .add('primary', () => ({
        components: { vButton },
        template: '<v-button type="primary">primary</v-button>',
      }))
      .add('danger', () => ({
        components: { vButton },
        template: '<v-button type="danger">danger</v-button>',
      }));
      
    
    
  7. 运行storybook

    npm run storybook
    

    等待项目启动,自动打开默认浏览器。

    即可看到Botton组件的story


除了添加组件的story外,Storybook官方或社区提供了不少有趣的插件

例如这个能够利用控件更改story的插件@storybook/addon-knobs

  1. install 插件

    npm install @storybook/addon-knobs --save-dev
    
  2. 添加注册文件

新建文件.storybook/addons.js,并写入内容

import '@storybook/addon-knobs/register';
  1. 修改Button.stories.js

    import Vue from 'vue';
    import { storiesOf } from '@storybook/vue';
    import vButton from './Button.vue';
    import { withKnobs, number, object, boolean, text, select, date, array, color } from '@storybook/addon-knobs';
    storiesOf('vButton', module)
      .addDecorator(withKnobs)
      .add('default', () => ({
        components: { vButton },
        template: '<v-button>default</v-button>',
      }))
      .add('primary', () => ({
        components: { vButton },
        template: '<v-button type="primary">primary</v-button>',
      }))
      .add('danger', () => ({
        components: { vButton },
        template: '<v-button type="danger">danger</v-button>',
      }))
      .add('diy', () => {
        const btnText = text('btnText', 'DIY Button'); //文字控件
        const bold = boolean('Bold', false) //启用控件
        const selectedBgColor = color('bgColor', '#fff');//颜色选择器
        const selectedColor = color('Color', 'black');
        const fontSize = number('fontSize', 20)//数字
        const customStyle = object('Style', {
          fontFamily: 'Arial',
          padding: "20px",
        });
        const style = {
          ...customStyle,
          fontWeight: bold ? 800 : 400,
          fontSize: fontSize + 'px',
          color: selectedColor,
          backgroundColor: selectedBgColor
        };
        return {
          components: { vButton },
          props: {
            btnText: {
              default: btnText
            },
            style: {
              default: style
            }
          },
          template: '<v-button :style="style">{{btnText}}</v-button>'
        }
      })
    

    要注意的是,在调用add函数添加story前,调用了addDecorator添加我们的插件面板。

  2. 运行并打开对应的story即可看到操作面板


    除了addon-knobs,还有非常多有意思的addons,比如Info的提升版本readme.以及一键换背景的backgrounds。还有现成的Material-UI。还有直接显示Jsx源码的Storybook-addon-jsx.以及控制版本显示的storybook-addon-versions,让你直接对比多个版本的区别。一键生成所有截图的Storybook Chrome Screenshot Addon。这些社区的addons都非常实用。感兴趣可以自己增加。

总结内容

1. 首先说一下使用StoryBook的特点:
  • 组件驱动开发,由下至上,从底层组件开始一步步构建界面
  • 隔离开发环境展示组件,无需运行项目
  • 无需关心组件的依赖和要求
2. 在上面的例子,引入StoryBook,我做了下面这几件事:
  1. install storybook 依赖
  2. 新建storybook配置文件./storybook/config.js,添加相关配置,加载组件的stories
  3. 为storybook的组件运行添加对应的webpack配置(./storybook/webpack.config.js)
  4. 为组件添加story(即xxx.stories.js)
  5. 运行storybook

若要使用官方或社区的stroybook插件,则还需要:

  1. install 插件
  2. 新建.storybook/addons.js,在里面通过import的方式,注册插件
  3. 根据插件文档的描述,编写使用的代码
4. 对于新页面的开发方式,我所做的改变可能有

旧的:由上至下,即是:页面结构 -> 组件容器 -> ... ->组件容器 -> 组件

新的:组件驱动开发由下至上进行页面的开发:组件- -> 组件容器 -> ... ->组件容器 -> 页面结构

参考代码:https://github.com/helloyoucan/study-storybook-vue

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271