Storybook入门安装启动
Author:zhoulujun Date:
对于大型的项目,必须面对的就是组件化开发。
为什么选择StoryBook
StoryBook是一个可视化的组件展示平台,并为 UI 组件提供 playground. 该工具可以让开发者独立的创建可以交互展示的 UI 组件。
UI 组件独立运行在于 StoryBook 框架无关的环境中,并且无需担心 UI 组件的特殊依赖和需求。
StoryBook给开发这提供了一个强大的组件开发的生态环境,其中涉及组件的测试、实景展示、文档,以及术语。常见术语解释如下:
Addon:类似Plugin,StoryBook中的功能组件以及扩展以Addon形式存在,开发者亦可以自行编写Addon来扩展StoryBook的功能;
Story:类似用例,是组件的各种使用场景;
Decorator:就是给Story做个包装,可以是样式包装、模块元数据包装、类型包装等。
Notes:备注,可以为每个Story设置Notes,支持MarkDown语法。
如下是常用的Addon:
addon-actions:组件操作事件,如click、change
addon-links:链接,如某个Story中单击按钮,链接到另一个Story中
addon-notes:Story的备注
addon-options:调整StoryBook的外观
addon-knobs:在页面上改变变量
storybook的很多功能都是靠插件来实现的
storybook常用插件安装
npm add -D @storybook/addon-actions @storybook/addon-notes @storybook/addon-links @storybook/addon-options @storybook/addon-links @storybook/addon-knobs storybook-addon-specifications @storybook/addon-info storybook-readme
大多数插件都需要提前注册,在页面中有一个单独的tab来对storybook进行增强。
添加插件,在.storybook/addons.js添加如下
import '@storybook/addon-actions/register';
import '@storybook/addon-notes/register';
import '@storybook/addon-options/register';
import '@storybook/addon-links/register';
import '@storybook/addon-knobs/register';
// import '@storybook/addon-info/register';
import 'storybook-addon-specifications/register';
@storybook/addon-info插件比较特殊,不需要提前注册,它可以显示story的源码,并针对props提供一些文档。
StoryBook入门项目搭建
Storybook入门没有什么好书的,看官方文档即可:https://storybook.js.org/docs/basics/writing-stories/
受伟大墙影响,推荐看国内中文版的:https://www.bookstack.cn/read/learnstorybook-react-zh/6da1274cb7d081bc.md
如不过会react的,还是以react入门好,毕竟angularJS、Vue都是后面加入的支持。总之在 React 等领域,Storybook 已经很好的证明了自己,引入这个 工具 以后,即便是在普通的项目中,也能帮助开发者逐渐打理出各种低耦合的可复用组件;
cd storybook-react
npm init
npx -p @storybook/cli sb init --type react
npm i react react-dom @storybook/react @storybook/addon-knobs babel-loader @babel/core
// npx create-react-app storybook-react
Vue也是一样的
npm init
npx -p @storybook/cli sb init --type vue
npm i @storybook/vue vue vue-loader vue-template-compiler @babel/core babel-loader babel-preset-vue
配置StoryBook
创建storybook 目录 .storybook/config.js storybook默认配置存在在.storybook文件夹
import { configure } from '@storybook/react';
// configure(require.context('../src/stories', true, /\.stories\.js$/), module);
configure(
[
require.context('../src/stories', true, /\.stories\.js$/),
// require.context('../lib', true, /\.stories\.js$/),
],
module
);
创建测试 ../src/button.stories.js
import React from 'react';
import { Button } from '@storybook/react/demo';
export default { title: '组件分类-Button' };
export const withText = () => <Button>Hello Button</Button>;
export const orginButton = () => (
<button><span role="img" aria-label="so cool">Test</span></button>
);
增加交互的,代码来自:https://github.com/Red626/storybook-react/
import React from 'react';
import { storiesOf } from '@storybook/react';
import { action } from '@storybook/addon-actions';
import { linkTo } from '@storybook/addon-links';
import LinkTo from '@storybook/addon-links/react';
import { withKnobs, text, boolean, number, color } from '@storybook/addon-knobs';
storiesOf('Select', module)
.add('Index', () => (
<select value="Index" onChange={linkTo('Select', e => e.currentTarget.value)}>
<option>Index</option>
<option>First</option>
<option>Second</option>
<option>Third</option>
</select>
))
.add('First', () => <LinkTo story="Index">Go back</LinkTo>)
.add('Second', () => <LinkTo story="Index">Go back</LinkTo>)
.add('Third', () => <LinkTo story="Index">Go back</LinkTo>);
storiesOf('Storybook Knobs', module)
.addDecorator(withKnobs)
.add('with a button', () => {
const disabled = boolean('Disabled', false);
// const Label = text('label','')
return (
<button
disabled={disabled}
className={disabled ? 'disabled' : ''}
>
{text('Label', `abc${disabled ? '(disabled)' : ''}`)}
</button>
);
})
.add('as dynamic variables', () => {
const name = text('Name', 'Arunoda Susiripala');
const age = number('Age', 89);
const content = `I am ${name} and I'm ${age} years old.`;
return (<div>{content}</div>);
})
.add('with color', () => {
const label = 'Color';
const defaultValue = '#ff00ff';
const value = color(label, defaultValue);
return (<div style={{ color: value }}>{value}</div>);
});
在package.json package.json,scripts 增加:
"scripts": {
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook -c .storybook -o .out"
}
不必赘述,按照官方操作不走,试了了vue和react,没有发现任何问题
storybook经验总结
story 位置放哪儿
为了维护方便,一般与component平级,如组件目录为:'./src/components';则 story 目录最好为:'./src/stories'
添加 story,使用 add 添加
// param1 表示 story 名称,会显示在侧边栏;
// func 是一个返回待测试组件的函数
add(param1,func)
动态加载 story,借用了 webpack 的 context API
// .storybook/config.js
import { configure } from '@storybook/react';
const req = require.context('../src/stories', true, /\.js$/);
function loadStories() {
req.keys().forEach(filename => req(filename));
}
configure(loadStories, module);
使用装饰器
同一个组件可对应多个story,装饰器的作用是把这些 story 包起来,形成一个父级元素,然后可以对这个父级元素做些修饰,比如让所有子元素居中对齐。/react-storybook/stories/2-Pagintion.stories.js
import React from 'react'
import { storiesOf } from '@storybook/react'
import { withKnobs, number } from '@storybook/addon-knobs'
import Pagination from '../src/component/Pagination/Pagination'
import paginationDoc from '../src/component/Pagination/readme.md'
export default {
title: 'Pagination',
}
storiesOf('Custom UI', module)
.addDecorator(story => <div style={{ textAlign:'center',marginTop: '50px' }}>{story()}</div>)
.addDecorator(withKnobs)
.add('Pagination', () => {
const totalPage = number('totalPage', 100)
const page = number('currentPage', 45)
return (<Pagination totalPage={totalPage} page={page} pageSize={10}/>)
}, {
notes: { markdown: paginationDoc },
})
Pagination组件测试 /react-storybook/src/component/Pagination/Pagination.js
/**
* Authour: zhoulujun.cn
* Date: 2020-02-21 14:51
**/
import React from 'react'
class Pagination extends React.Component {
constructor (props) {
super(props)
this.state = { currentPage: 1 }
this.nextPage = this.nextPage.bind(this)
}
render () {
let { totalPage, pageSize, page } = this.props
return (
<div>
total:{totalPage},pageSize:{pageSize},currentPage:{page}
</div>
)
}
}
export default Pagination
推荐与参考文章:
使用storybook管理React组件 https://imweb.io/topic/5c0d3e6a611a25cc7bf1d7fe
StoryBook 使用指南 https://www.jianshu.com/p/9cb75ae50515
StoryBook实战 (angluarJS) https://blog.dteam.top/posts/2019-06/storybook实战.html
手摸手教你用 Storybook 改善组件库的开发(Vue) https://juejin.im/post/5cd6dd94e51d453a8f348bef
转载本站文章《Storybook入门安装启动》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/storybook/8316.html