好多前端小伙伴干了五六年,一直在做切图仔,一看项目没啥亮点。今天开始,我就分享下自己开发组件库的历程。
注:文章会持续更新
"dumi": "^2.2.0",
"father": "^4.1.0",
这里我们站在巨人的肩膀上,先整出来组件库,从零自己搞也可以,不过会非常浪费时间。
注意:版本很重要,后面会列举father在打包过程中的坑,这里就不展开了。
先创建空文件夹,并进入,执行
npx create-dumi
// 选择组件库模板
React Library # 用于构建组件库,有组件例子
// 启动
npm start
主要是导航和菜单的配置: .dumirc.ts
这块比较简单,看官网即可
修改Foo选项为组件库,在.dumirc.ts文件中添加配置
import { defineConfig } from 'dumi';
export default defineConfig({
// ...
themeConfig: {
name: 'dumi2-demo',
nav: [
{ title: '介绍', link: '/guide' },
{ title: '组件', link: '/components/Foo' }, // components会默认自动对应到src文件夹
],
},
// ...
});
.dumirc.ts
export default defineConfig({
// ...
styles: [
`.dumi-default-header-left {
width: 220px !important;
}`,
],
});
问题:demo中使用less是可以的,但是组件用less打包时会报错; 环境:father v4
解决方案:安装 @babel/runtime 即可 ,会自动处理
yarn add @babel/runtime -D
注意:版本的坑来了,网上找到解决方案(如配置lessInBabelMode)大多是 father v2版本的,好多配置已失效。
src/Button/index.tsx
import React, { type FC } from 'react';
export interface ButtonProps {
type?: 'primary' | 'default';
children?: React.ReactNode;
}
const Button: FC<ButtonProps> = ({
children
}) => {
return (
<div>
<button>{children}s</button>
</div>
)
};
export default Button;
组件源代码添加好后,需要在src/index.ts中引入后暴露一下:
// src/index.ts
export { default as Button } from './Button';
在这里引入并暴露出去以后,就可以在项目中通过import { Button } from ‘dumi2-demo’;来引入了。
每一个组件我们可以加一个demo示例,方便使用者能更方便的使用。
在Button目录下新建一个demo文件夹,内建一个基础演示base.tsx文件
// src/Button/demo/base.tsx
import React from 'react';
import { Button } from 'dumi2-demo';
export default () => {
return (
<>
<Button type="default">默认按钮</Button>
<Button type="primary">主要按钮</Button>
</>
);
}
再在该文件同目录新建一个index.md文件作为文档说明,这也是生成静态文档站点所需要的。
src/Button/index.md
---
category: Components
title: Button 按钮 # 组件的标题,会在菜单侧边栏展示
toc: content # 在页面右侧展示锚点链接
group: # 分组
title: 基础组件 # 所在分组的名称
order: 1 # 分组排序,值越小越靠前
---
# Button 按钮
## 介绍
基础的按钮组件 Button。
## 示例
<!-- 可以通过code加载示例代码,dumi会帮我们做解析 -->
<code src="./demo/base.tsx">基础用法</code>
## APi
<!-- 会生成api表格 -->
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| ---- | ---------------------- | -------- | ---- | ---- |
| type | 'primary' | 'default' | 'default | false | 按钮类型 |
参考3.5节 https://juejin.cn/post/7222804347830206525#heading-10
今天先写到这,有时间继续写