在上一篇文章 《手摸手教你封装跨项目复用的 Vue 组件》 中,介绍了一例用 rollup.js 封装 Vue.js 组件库的实践;限于篇幅和复杂度,其中组件的即时调试预览部分,也一样采用了 rollup 一并配置出来,虽然彻底够用,但运行起来稍嫌麻烦,bigger 上感受也差强人意。javascript
本篇的内容就是尝试优化这部分的开发体验,用业界成熟的解决方案 Storybook 解决组件的统一展现和事实调试。css
更快更强的构建 UI 组件
Storybook 是一个为开发独立的 React、Vue 和 Angular UI 组件的开源工具。高效有序地构建炫酷用户界面html
以上是官网开宗明义的介绍,总之在 React 等领域,Storybook 已经很好的证实了本身,引入这个工具之后,即使是在普通的项目中,也能帮助开发者逐渐打理出各类低耦合的可复用组件;若是搭配 Lerna 等工具,甚至直接把组件分别发布到 npm 上也能安排的妥妥的。vue
由于是承接上一篇的内容,因此本文就不展开介绍 Storybook 的种种细节,反正用它作的事情和咱们以前已经作过的是同样的:实时编译调试、手动测试运行。java
基于以前的项目,直接说明改动步骤。node
首先,引入 Storybook 后项目结构将微调成这样:webpack
├─.babelrc
├─.eslintignore
├─.eslintrc.js
├─.gitignore
├─jest.config.js
├─package.json
├─postcss.config.js
├─rollup.config.js
├─CHANGELOG.md
├─README.md
├─dist/
├─node_modules/
├─src/
├─.storybook/
├─storybook-static/
├─__mocks__/
└─__tests__/
复制代码
其中,可见如下两个文件夹:ios
├─.storybook/
├─storybook-static/
复制代码
分别用来存放配置和生成的静态预览页面。git
要设置 Storybook 环境,须要先安装必要的依赖:web
npm install @storybook/vue --save-dev
npm install vue-loader style-loader css-loader sass-loader node-sass --save-dev
复制代码
执行初始化:
npx -p @storybook/cli sb init --type vue
复制代码
此时会自动增长两个 npm scripts:
"scripts": {
...
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook"
},
复制代码
删除默认生成的文件夹:
rm -rf ./stories/
复制代码
修改 .storybook/config.js 中的相应配置,直接把 .stories.js 文件和对应的组件源码放在一块儿:
const req = require.context('../src', true, /\.stories\.js$/);
...
复制代码
一样在以上文件中,作一些和项目中 main.js 类似的初始化工做:
// .storybook/webpack.config.js
import 'normalize.css';
import Vue from 'vue';
import Element from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(Element);
...
复制代码
为了正确解析 Vue 单文件组件中的样式部分,修改设置:
// .storybook/webpack.config.js
const path = require('path');
module.exports = async ({ config, mode }) => {
config.module.rules.push({
test: /\.scss$/,
include: path.resolve(__dirname, '../src'),
use: ['style-loader', 'css-loader', 'sass-loader'],
});
return config;
};
复制代码
在 .storybook/preview-head.html 中引入必要的样式等,项目中的相似工做多是在 index.html 等处完成的:
<link rel="stylesheet" href="//foo/bar/index.css">
复制代码
接下来就是动手编写各类组件的 story 用例,好比:
// src\projectA\components\HorizentalRadios.stories.js
import { storiesOf } from '@storybook/vue';
import HorizentalRadios from './HorizentalRadios';
storiesOf('projectA|超过个数变成下拉的raidos', module)
.add('列表少于预期个数时', () => ({
components: { HorizentalRadios },
template: `<horizental-radios v-model="value" @change="valueChange" :max-shown-count="3" :items="items" item-label="label" item-name="name" more-label="更多的呢" :list-style="false" />`,
data() {
return {
value: 'aaa',
items: [{
label: 'aaa',
name: 'name1'
}, {
label: 'bbb',
name: 'name2'
}],
};
},
methods: {
valueChange() {
console.log(this.value);
},
},
}))
.add('列表多于预期个数时+列表主题色', () => ({
components: { HorizentalRadios },
template: `<horizental-radios v-model="value" @change="valueChange" :max-shown-count="3" :items="items" item-label="label" item-name="name" more-label="更多的呢" :list-style="true" />`,
data() {
return {
value: 'aaa',
items: [{
label: 'aaa',
name: 'name1'
}, {
label: 'bbb',
name: 'name2'
}, {
label: 'ccc',
name: 'name3'
}, {
label: 'ddd',
name: 'name4'
}, {
label: 'eee',
name: 'name5'
}, {
label: 'fff',
name: 'name6'
}],
};
},
methods: {
valueChange() {
console.log(this.value);
},
},
}))
复制代码
可见对同一个组件,能够 add 多个用例,这点和单元测试时的作法很类似;
同时 storiesOf() 相似于单元测试的 describe() 部分,而且其第一个参数能够用 |
分割,表示层级。
运行 npm run storybook
查看效果:
最后发布前不要忘记 npm run storybook
,生成静态页面,以便其余开发者能够直接运行查看。
搜索 fewelife 关注公众号
转载请注明出处