前言
最近开发了一套自己的组件库,整个过程研究了不少东西,所以分享出来
这是我的React组件库和源码,目前更新了一些我常用的组件,后续也会持续更新
正文
Dumi
Dumi为组件研发而生的静态站点框架,类似的其实还有storybook、vitePress,为啥选择dumi,一个是框架比较简单易懂,在里面编写组件的时候也和你平时开发组件一样;另一个是他只支持React,默认会安装React,所以对React的支持度是比较好的,本质算是个React项目。
这里就不仔细介绍是啥了,可以看官网,然后框架搭建流程其实就是按照官网就行。
- 确保你的node在14+以上
node -v
v14+
- 创建一个空目录,运行git bash或者在ide终端进入到空目录,运行命令
# 通过官方工具创建项目,一开始可能先让你安装npx啥的,yes走下去就是了
npx create-dumi
? Pick template type › - Use arrow-keys. Return to submit.
❯ Static Site # 用于构建网站
React Library # 用于构建组件库,有组件例子
Theme Package # 主题包开发脚手架,用于开发主题包
# 选择包管理工具,看你自己
? Pick NPM client » - Use arrow-keys. Return to submit.
> npm
cnpm
tnpm
yarn
pnpm
# 项目的包名->package.json里的name属性
? Input NPM package name
# 项目描述
? Input project description » A react library developed with dumi
# 输入个邮箱,不能直接回车
? Input project author (Name <email@example.com>)
# 安装依赖后启动项目
$ npm start
- 运行项目,http://localhost:8000 基本就会看到这个页面了
- 接下来是一下配置,一些文件与UI的对应关系,其实文档基本都有解释,看文档最好了
.dumirc.ts,算是配置路由的地方,顶部导航栏
import { defineConfig } from 'dumi';
export default defineConfig({
outputPath: 'docs-dist',
base: '/czh_react_ui/',
publicPath: '/czh_react_ui/',
themeConfig: {
name: 'czh-ui',
nav: [
{ title: 'Think', link: '/guide' },
{ title: 'Component', link: '/components/input' },
],
socialLinks: {
github: 'https://github.com/czh13/czh_react_ui',
},
nprogress: true,
showLineNum: true,
lastUpdated: false,
editLink: false,
},
});
src,文件夹存放你开发组件的地方,我的组件文件结构是这样的
demo 写组件样例的地方
styles 写组件样式
index.md 组件描述页面
index.tsx 组件代码
- index.tsx开发组件没啥其他注意,就按你平时正常写代码,然后就是看你怎么封装了
- 主要是这个index.md,这个文件是对你组件描述的,可能需要去学习一些markdown怎么写,我之前就有一直在用Typora,所以感觉还行
<!-- 左侧侧边栏的描述,官方文档也有介绍 -->
---
title: NavBar
group:
title: 导航组件
order: 2
---
## 介绍
导航栏组件 NavBar
## 示例
<!-- 可以通过code加载示例代码,dumi会帮我们做解析 -->
<code src="./demo/base.tsx"></code>
## APi
<!-- 会生成api表格 -->
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :-------- | :------------------ | :----- | :---- | :----------------------------------------------------- |
| leftArrow | React.ReactNode; | true | false | 是否显示返回区域的箭头,也可以自定义箭头 |
| leftText | string | - | false | 返回区域文字 |
| right | React.ReactNode; | - | false | 右侧内容 |
| style | React.CSSProperties | - | false | 内联样式,可选样式`--nav-bar-height` `--border-bottom` |
| onBack | - | - | false | 左侧点击事件 |
GitHubPage
github有提供一个功能,可以部署一个属于我们自己的静态网站,可以将我们开发的组件文档部署在线上,这样我们就可以通过链接随时访问,官方文档也有教我们怎么部署d.umijs.org/guide/faq ,可惜我当初没看到,所以这个部署是自己折腾出来的,不过大差不差。
- 在github创建一个仓库,然后将我们的代码和仓库关联,上传我们的代码
- 我们要实现的是每次上传代码自动部署,所以需要使用到github的Actions
main.yml,这个文件最好还是从github里创建,我当时在代码创建上传到github部署没成功,不过我自己也不知道是不是因为这个创建导致失败。还有这个文件内容网上啥样都有,缺这缺那的,不用过分纠结,下面是我自己精简的
name: Build and Deploy
on: [push]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v2.3.1
# 打包代码,dumi的打包命令
- name: Install and Build 🔧
run: |
npm install
npm run docs:build
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@4.1.5
with:
branch: gh-pages # 部署分支
folder: docs-dist #dumi打包成功置换的文件夹
- gh-pages分支需要我们创建,当时以为会自己创建,搞半天,命令没要求,和上面文件对应上就行
- 修改.dumirc.ts路径,这块官网文档也有说,为什么要修改可以看这篇,还是很好理解的
export default defineConfig({
outputPath: 'docs-dist',
base: '/czh_react_ui/',
publicPath: '/czh_react_ui/',
themeConfig: {
...
},
});
-
我们需要到setting修改我们新建的分支
-
上传代码到仓库,基本就开始部署了,每次我们提交一次,会有两个部署过程,如果有证明成功
-
部署成功之后,就生成链接了czh13.github.io/czh_react_u… ,同时gh-pages也只有打包的内容
发布npm
- 需要用于个npm的账号www.npmjs.com/, 官网注册登录个
- 添加修改一些package.json的消息
{
"name": "xx-ui", // 包名,必须要独一无二
"version": "1.0.0", // 版本号
"author": "xxx", // 作者
"description": "common toolkit", // 描述信息
"keywords": ["utils", "format", "money", "phone"], // 关键词,提升SEO
"repository": {
// 代码托管位置
"type": "git",
"url": "https://github.com/xxx/xx-ui"
},
"license": "ISC", // 许可证
"homepage": "https://your-package.org", // 包的主页或者文档首页
"scripts": {
// 存放可执行脚本
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
// 运行依赖
},
"devDependencies": {
// 开发依赖
}
}
- 设置一下npm源,改回原始的源
npm config set registry https://registry.npmjs.org/
4.然后基本就配置完,终端登录,开始发包,过程中可能会遇到一些问题,401、forbidden等等,Google一个一个解决就是了
// 登陆
npm login
// 控制台会提示输入相关信息
Log in on https://registry.npmjs.org/
Username: // 用户名
Password: // 密码
Email: (this IS public) // 邮箱
Enter one-time password: // 邮箱会收到验证码
Logged in as xxx on https://registry.npmjs.org/.
结尾
至此,一条龙服务就结束了,中间可能会遇到各种问题,当初也花了不少时间,基本都可以解决的。