一、简介
Storybook是一款开源的组件开发工具,它能够运行在主程序之外,因而开发者能够用它来独立开发UI组件,或者用它来疾速构建ui组件文档。
目前Storybook反对的框架有:
- React
- React Native
- Vue
- Angular
- Marionette.js
- Mithril
- Marko
- HTML
- Svelte
- Riot
- Ember
- Preact
- Rax
能够看到,Storybook的性能是相当丰盛的。本文将以Vue为例,从零开始搭建一个本人的Storybook。
二、装置Storybook
首先本人创立一下文件夹,storybook-demo。
官网文档中给的装置形式有2种,第一种是自动化装置,有点相似vue的脚手架,它会主动将环境配置好,开发者无需手动初始化相干配置文件。
npx -p @storybook/cli sb init --type vue
第二种是能够手动进行配置,读者能够参照官网的教程来进行装置。附送地址:https://storybook.js.org/docs/guides/guide-vue/。
然而笔者通过尝试,应用官网的办法装置的时候会短少局部依赖导致运行失败,上面将介绍一下笔者本人应用的装置办法。
首先,装置vue脚手架,而后初始化我的项目:
vue create storybook-demo
抉择babel和css预处理, 并且在第三部抉择装置node-sass,这几项是必须的,其余可依据须要进行抉择。
脚手架装置实现后,删除无关文件,并在根目录下新建.storybook、stories文件夹,在.storybook下新建以下文件:addons.js、main.js、config.js、webpack.config.js。实现之后目录如下:
上面再进行storybook的相干装置。
装置storybook for vue:
npm install @storybook/vue --save-dev
在根目录下找到package.json文件并配置疏导:
{ "scripts": { "storybook": "start-storybook" }}
当然,你也能够在前面跟上-p port来设置默认端口号,如:
{ "scripts": { "storybook": "start-storybook -p 6006" }}
在根目录下新建.storybook文件夹,并在外面新建main.js文件,进行相干配置:
module.exports = {
stories: ['../stories/**/*.stories.js', '../stories/*.stories.js']
};
这样零碎就会主动解析src目录下的*.stories.js、*.stories.ts文件了。
之后,在根目录下新建src文件夹,在外面新建index.stories.js文件并编写本人的组件:
import Vue from 'vue';import MyButton from './Button.js';export default { title: 'Button' };export const withText = () => '<my-button>with text</my-button>';export const withEmoji = () => '<my-button> </my-button>';export const asAComponent = () => ({ components: { MyButton }, template: '<my-button :rounded="true">rounded</my-button>'});
Button.js(因为这里没有装置vue文件的解析依赖,所以只能用js文件来进行代替,如果想引入vue来代替js,可自行装置相干loader):
export default { name: 'my-button', data() { return { buttonStyles: { border: '1px solid #eee', borderRadius: 3, backgroundColor: '#FFFFFF', cursor: 'pointer', fontSize: 15, padding: '3px 10px', margin: 10, }, }; }, template: ` <button :style="buttonStyles" @click="onClick"> <slot></slot> </button> `, methods: { onClick() { console.log('click'); this.$emit('click'); }, },};
这样,一个简略的storybook就搭建实现了。在命令行输出:
就会主动关上方才的storybook。
三、storybook的插件 - addons
通过下面的搭建能够看到,咱们本人搭建的storybook与一开始的看到的图片几乎就是买家秀和卖家秀的区别。这是因为在storybook中,它提供了很多插件供开发者应用,开发者能够应用addons给每个story减少额定的性能,如应用文档、查看源码、查看事件等,使每个story的性能更加丰盛。
storybook自带的addons已足够应用,当然官网也提供了相干api能够让开发者编写本人的addon,具体实现可移步到官网文档中进行查看。
官网自带的addons可参考:
https://storybook.js.org/addons/
https://github.com/storybookjs/storybook/tree/master/addons
当然,应用addons之前必须先到https://github.com/storybookjs/storybook/blob/master/ADDONS\_SUPPORT.md查看相干addon是否反对以后框架,比如说info插件就只反对react然而不反对vue,之前笔者还在这里钻研了半天为什么info始终配置失败。
上面介绍几个笔者本人用过的addon以及配置办法,其余addon可照猫画虎,依据官网文档给的参数进行配置即可。
1. story-source - 查看以后story源码
装置:
npm i @storybook/addon-storysource --save-dev
配置:
.storybook/main.js
const path = require("path");module.exports = { stories: ["../stories/**/*.stories.js", "../stories/*.stories.js"], addons: [ { name: "@storybook/addon-storysource", options: { rule: { // test: [/\.stories\.jsx?$/], This is default include: [path.resolve(__dirname, "../stories")], // 找到本人寄存stories的文件夹 }, loaderOptions: { prettierConfig: { printWidth: 80, singleQuote: false }, }, }, }, ],};
其中,loaderOptions的默认值为:
{ printWidth: 100, tabWidth: 2, bracketSpacing: true, trailingComma: 'es5', singleQuote: true,}
在.storybook/addons.js外面进行插件注册:
import '@storybook/addons';import '@storybook/addon-storysource'
到这里就能够了,从新运行一下看一下后果:
2. readme - 以后组件的文档阐明
装置:
npm install --save-dev storybook-readme
注册:
.storybook/addons.js
import 'storybook-readme/register';
配置:
这里可分为全局配置和部分配置,全局配置能够在.storybook/config.js外面进行相干配置,部分配置可在制订的*.stories.js文件里进行配置。区别如下:
全局配置需调用以下办法:
import { addDecorator } from '@storybook/vue';import { addReadme, configureReadme } from 'storybook-readme';configureReadme({ // ...some code});addDecorator(addReadme);
部分配置:
import { storiesOf } from "@storybook/vue";import MyButton from "./MyButton.vue";import ButtonReadme from "./MyButton.md";storiesOf("Demo", module) .addParameters({ readme: { codeTheme: "duotone-sea", content: ButtonReadme, sidebar: ButtonReadme, } }) .add("Button", () => { return { components: { MyButton, }, template: `<my-button type="primary">My Button</my-button>`, }; });
因为这个addon是没有官网文档的,笔者花了好长时间才找到一个开源文档,可移步到https://github.com/tuchk4/storybook-readme进行参考,外面也有相干demo能够查看。
略微解释一下外面各办法参数的作用:
configureReadme({ /** * Wrapper for story. Usually used to set some styles * React: React.ReactNode * Vue: Vue component */ // 组件区域的预处理,相当于在组件展现的时候里面套上一层div,组件作为插槽插入到这个div外面,在这里能够设置div的款式,如果是应用vue的话能够以vue组件格局插入,上面同理 StoryPreview /** * Wrapper for content and sidebar docs. Usually used to set some styles * React: React.ReactNode * Vue: Vue component */ // 文档局部的款式,即插件外面的content DocPreview/** * Wrapper for header docs. Usually used to set some styles * React: React.ReactNode * Vue: Vue component */ HeaderPreview/** * Wrapper for footer docs. Usually used to set some styles * React: React.ReactNode * Vue: Vue component */ FooterPreview /** * Header docs in markdown format */ header: '', /** * Footer docs in markdown format */ footer: '',});
不了解preview的能够看一下上图,比方header的内容就为“用户交互组件demo”,headerPreview就是上面那层border,如果有将readme注册到addons.js外面,在绿色方框里还会有一个readme选项,能够查看文档。
在给特定story增加readme的时候,能够看到能够增加两个文档,如:
storiesOf("Demo", module) .addParameters({ readme: { codeTheme: "duotone-sea", content: ButtonReadme, sidebar: ButtonReadme, } }) .add("Button", () => { return { components: { MyButton, }, template: `<my-button type="primary">My Button</my-button>`, }; });
其中,这里可能会有读者不了解。外面是content是对应图中红色方框的内容,sidebar则是对应绿色方框里的内容(如果有注册),codeTheme是md文档的款式,可自行设置。
这里还有一个小技巧,就是在编写content的时候,能够在文档中插入以下代码:
这段代码能够管制咱们的组件要在文档的哪个局部呈现。如果不填写,则默认会先显示文档内容,再显示组件内容。所以咱们最好在文档的最后面先增加上述代码,先将咱们的组件展现进去,再进行文档编写。
这就是笔者目前用过的两个addon了,其余addons读者能够本人尝试,能够让本人的storybook更加个性化,性能更加欠缺。