storybook使用记录

踩坑记录

Posted by Jorce on June 5, 2019

Update:新公司项目使用storybook进行组件展示


凭借着过人的理解能力和超乎常人的水平踏入了一家外企。 目前接手的项目是基于react的官网,要求使用storybook进行组件测试和管理。之前没用过,所以来踩踩坑 #####. 首先在项目根目录创建.storybook文件夹 其中包含了addons.js config.js webpack.config.js

  1. addons.js 用于管理插件 目前我引入了以下三个包
    1
    2
    3
    
    import '@storybook/addon-storysource/register';
    import '@storybook/addon-actions/register';
    import '@storybook/addon-links/register';
    
  2. config.js 用于引入需要展示的组件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    import { configure } from '@storybook/react';
    function loadStories() {
      require('../src/js/components/stories/lis.js');
      require('../src/js/components/stories/buttons.js');
      // require('../src/js/components/stories/heroSlider.js');
      require('../src/js/components/stories/sectionTitle.js');
      // You can require as many stories as you need.
      // 这里的路径需要注意
    }
    configure(loadStories, module);
    
  3. webpack.config.js 用于配置一些路径等问题

    遇到了两个问题 1.需要将组件代码展示在页面中,使用了addon-storysoure插件仍然需要添加代码 2.需要展示的组件中使用了alias,storybook默认不读取相关配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
     const path = require('path');
     const storysource = require.resolve('@storybook/addon-storysource/loader')
     const PATH_SRC = path.resolve(__dirname, '../src'); //这里的路径需要注意一下
     const PATH_JS = `${PATH_SRC}/js`;
     const resolve = {
       extensions: ['.js', '.jsx', '.css', '.scss', '.json', '.html', '.ico'],
       alias: {
         store: `${PATH_JS}/store`,
         controllers: `${PATH_JS}/controllers`,
         '@constants': `${PATH_JS}/constants`,
         '@pages': `${PATH_JS}/components/pages`,
         '@layouts': `${PATH_JS}/components/layouts`,
         routes: `${PATH_JS}/routes`,
         scss: `${PATH_SRC}/scss`,
         '@api': `${PATH_JS}/api`,
         '@components': `${PATH_JS}/components`,
         '@bootstrap': `${PATH_JS}/bootstrap`,
         '@utils': `${PATH_JS}/utils`,
         '@propTypes': `${PATH_JS}/propTypes`,
       }
     }
     module.exports = function({ config }) {
       config.module.rules.push({
         test: /\.jsx?$/,
         loaders: [storysource],
         include: path.resolve(__dirname, '../'), // 这里是解决问题1的地方
         enforce: 'pre',
       });
       config.resolve = resolve
    
       return config;
     }
    
    在components目录下创建storyies文件夹

    其中包含 sectionTitle.js等 这个就是在conifg中引入的文件

一般的普通组件代码如下

1
2
3
4
5
6
7
8
9
import React from 'react';
import { storiesOf } from '@storybook/react';
import { Button } from '@storybook/react/demo';
import { action } from '@storybook/addon-actions';
storiesOf('Buttons', module)
  .add('with text', () => (
    <Button onClick={action('clicked')}>Hello Button111</Button>
  ));

但是遇到的问题是组件嵌套过深,同时使用了redux 那么就需要在同级目录下先创建provider

1
2
3
4
5
6
7
8
9
10
11
import React from 'react'
import { Provider } from 'react-redux'

const ProviderWrapper = ({ children, store }) => (
  <Provider store={store}>
      { children }
  </Provider>
)

export default ProviderWrapper

然后在sectionTitle.js中引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import React from 'react';
import { storiesOf } from '@storybook/react';
import SectionTitle from '../paragraphs/SectionTitle';//此处是我使用的组件
import { createStore } from '../../store/index';//此处是本项目使用的redux
import ProviderWrapper from './ProviderWrapper';//此处是同级的provider
import { sectionTitle } from './data.js';//此处是该组件需要使用的data
/* eslint-disable */
const store = createStore();

const withProvider = (story) => (
  <ProviderWrapper store={store}>
    { story() }
  </ProviderWrapper>
)

storiesOf('sectionTitle', module)
  .addDecorator(withProvider)
  .add('normal', () => (
    <SectionTitle paragraph={sectionTitle}></SectionTitle>
  ));

其他的配置官方文档还是比较全的

这次坑先踩到这