Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

学习 storybook 总结 #74

Open
liyatang opened this issue Jun 17, 2019 · 0 comments
Open

学习 storybook 总结 #74

liyatang opened this issue Jun 17, 2019 · 0 comments

Comments

@liyatang
Copy link
Contributor

liyatang commented Jun 17, 2019

why storybook?

总在一些技术文章中看到 storybook ,也没有去关注,只是知道用来高效构建 UI 组件的东东。 之前也花了点时间了解过,体会不到其好。
最近组件库碰到了维护消极的阻碍,正打算寻找合适的方案来优化。于是周末花了点时间接触了下,还是眼前了一亮。

我对组件文档的要求是

  • 有实际运行的组件效果
  • 有源代码
  • 有说明,且是 MD 写的

参考了各大库对文档的做法,比较喜欢 Element 的做法,不过他之前是 Vue 的。于是学习了下,折腾了下 markdown-it 方案,搞了个插件 markdown-it-react-loader 。都已经是 3 years ago,:cry:

目前遇到的问题

  • 代码和文档不同步
  • 文档编写靠约定,随着维护者越来越多,质量也下去了
  • 写业务用库的时候,除了看文档外,还会看库的代码。但是往往得结合代码和文档一起看

周末也看了 create-react-app,里面也建议使用 storybook 来构建 UI 组件。

那 storybook 带来了什么?

  • 以上痛点都解决了
  • 很容易入门。生态也不错, storybook + 几个 Addons 即可搞定。自定义程度高。
  • 喜欢其目录形式。以 故事 + 场景 为目录,组件使用者很容易就找到对应的文档。 以前目录是组件,一个组件一个页面,需要看完页面才能知道什么情况下怎么用。
  • 代码即文档,不怕代码和文档不同步了
  • 其他,自动化测试等。

怎么用 storybook

就不细讲了,storybook 入门真的超级简单。 具体见 react-gm

可能会遇到的疑惑

组件样式不生效?

storebook 是一个独立的环境,所以需要再 .storybook/config.js 里 引入你的 css
如果你是 less,还需要有个 .storybook/webpack.config.js,加入处理 less 的相关配置

babel 没构建到 node_modules 的模块?

storybook 默认的配置会默认 include 项目跟目录 和 exclude node_modules。所以 node_modules 的模块是不会构建的,此时重写即可

config.module.rules[0].exclude = function(filepath) {
    if (filepath.includes('/node_modules/gm-util/')) {
      return false
    }

    return filepath.includes('/node_modules/')
  }

逻辑组件没用?

storybook 展示UI组件很方便,直接写组件即可,但是写逻辑组件就要转换下思路了。
使用 mobx 数据流
.storybook/config.js 上加入代码

addDecorator(storeFn => <Observer>{() => storeFn()}</Observer>)

在 stories.js 中

import React from 'react'
import { storiesOf } from '@storybook/react'
import Button from './index'
import { observable } from 'mobx'

const store = observable({
  count: 0,
  addCount() {
    this.count++
  }
})

storiesOf('Button', module)
  .add('with mobx', () => (
    <Button onClick={() => store.addCount()}>aaa{store.count}</Button>
  ))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant