如何使用 dumi 和 father-build 创建组件库

简介: 如何使用 dumi 和 father-build 创建组件库

在这个文章中,将会简单的介绍如何使用 dumi 和 father-build 来创建组件库和维护组件库。最终我们会演示如何组织组件库的代码。还会输出一个简单的组件库。


脚手架初始化

新建一个空文件夹,然后使用脚手架初始化项目。

mkdir myapp && cd myapp
npx @umijs/create-dumi-lib
# or
yarn create @umijs/dumi-lib

值得注意的是,项目中会有两个配置文件。


.umirc.ts

作为 umi 项目的配置文件,因为 dumi 其实是 umi 在组件库开发这个领域的一个最佳实践。但它本质上还是一个 umi 插件,这意味着,在 umi 上可用的插件,在 dumi 中仅可正常使用,但是是否能够对开发的组件库,产生影响,就需要看对应的插件,是否在这方面进行支持了


.fatherrc.ts

作为 father-build 的配置文件,这里将会配置,组件库被如何编译和编译产物的类型。一般我们都是针对组件库使用场景,进行简单的声明即可。也就是说,一般设置 esm: 'rollup', 就够用了。



启动项目

yarnyarn 
start


dumi 的 Demo 理念

dumi 只有一个理念——开发者应该像用户一样写 Demo

官网上是这么描述的,但是我比较喜欢从开发者的角度去阐述它,像写业务一样写组件。也就是官网上提到的“易于维护”,因为在开发者工具上,比如 VS Code,他的格式化工具,通常都是默认读取文件的后缀名来启用的,也就是说,你在文档的 md 文件中,编写代码,就没有很好的格式化和代码联想功能。(最新的VS Code,当你标记代码段时,可以使用相对应的代码片段,我这里只是一个举例。)


所以 dumi 支持,直接从其他文件中引入代码的功,这样可以依旧保持编译器的能力。

<code src="/path/to/Demo.tsx" />


自动 link

dumi 项目会自动使用别名来对应当前的包名,效果很像是自动 link,就是说,你可以在文档中编写 import { Foo } from 'dumi-oni';,然后读者可以直接复制你的代码段,到真实的项目环境中,直接运行,而无需修改引入路径。比如在某些知名的组件库方案中的引入是 import { Foo } from './index';。用户复制代码段之后,还要修改 from 的路径。


默认文档目录

dumi 会默认使用 srcdocs 目录下的 md 文件生成对应的文档。


创建自己的组件

我们参考 antd 的代码组织方式,来编写一个 button 组件

// src/Button/index
import React, { FC } from 'react';
import './index.less';
interface ButtonProps {
  onClick?: React.MouseEventHandler<HTMLElement>;
  type?: 'default' | 'primary' | 'secondary';
  disabled?: boolean;
}
const prefixCls = 'dumi-oni-btn';
const Button: FC<ButtonProps> = ({ children, onClick, type = 'default', disabled }) => {
  const className = `${prefixCls} ${prefixCls}-button ${prefixCls}-${type}`;
  return (
    <button className={className} onClick={onClick} disabled={disabled}>
      {children}
    </button>
  );
};
export default Button;

对应的样式编写,如下。我们这里使用和 antd 一样的方式来实现。

@btn-prefix-cls: ~'dumi-oni-btn';
.@{btn-prefix-cls} {
  &-button {
    padding: 6px 16px;
    font-size: 12px;
    min-width: 64px;
  }
  &-button[disabled] {
    color: rgba(0, 0, 0, 0.26);
    background-color: rgba(0, 0, 0, 0.12);
  }
  &-default {
  }
  &-primary {
    color: #fff;
    background-color: #1976d2;
  }
  &-secondary {
    color: #fff;
    background-color: #dc004e;
  }
}


为组件编写用例

// src/Button/index.md
import React from 'react';
import { Button } from 'dumi-oni';
export default () => <Button onClick=
{()=>alert('onClick')}>default</Button>;

dumi 会默认取文档的第一个标题作为菜单栏的名称,你也可以通过注视手动编写名称,如

---
title: 按钮
---


运行查看效果

$ npm start

访问开发服务 http://localhost:8000

image.png


打包编译

npm run build

编译使用的是 father-build,有一个特别需要注意的地方,如果组件中使用到第三方的库,那么需要这些库在 package.json 中的 dependencies 或者 preDependencies 中,一般的打包出错问题,几乎都是这个原因引起的。注意 dependencies 或者 preDependencies 中的包是我们需要的依赖,注意将组件库不需要的依赖,移到 devDependencies 中,如脚手架创建的项目,最终修改为

"dependencies": {
    "react": "^16.12.0"
  },
  "devDependencies": {
    "@umijs/preset-react": "1.x",
    "@umijs/test": "^3.0.5",
    "dumi": "^1.0.5",
    "father-build": "^1.17.2",
    "lint-staged": "^10.0.7",
    "prettier": "^1.19.1",
    "yorkie": "^2.0.0"
  }


发布组件库

确定组件库名称,并确定名称未被其他人使用。如这里修改为 dumi-oni。然后执行 npm publish 将组件库发布到 npm 上。


使用组件库

yarn add dumi-oni

在页面中使用

import React from 'react';
import { Button } from 'dumi-oni';
export default () => <Button type="secondary">secondary</Button>;

不难发现,其实在项目中使用,和我们 demo 中编写的方式是一致的,这也是我们前面提到的 dumi 的 demo 理念。


目录
相关文章
|
Web App开发 前端开发 JavaScript
看看人家 阿里的 低代码引擎,多优雅!
特性 引擎协议 使用示例 工程化配置: cdn 可选方式:
|
Web App开发 前端开发 JavaScript
React 之 requestIdleCallback 来了解一下
React 之 requestIdleCallback 来了解一下
1309 0
|
存储 前端开发 JavaScript
ahooks 正式发布:值得拥抱的 React Hooks 工具库
ahook定位于一套基于 React Hooks 的工具库,核心围绕 React Hooks 的逻辑封装能力,降低代码复杂度和避免团队的重复建设为背景,共同建设和维护阿里经济体层面的 React Hooks 库。
23802 1
ahooks 正式发布:值得拥抱的 React Hooks 工具库
|
8月前
|
人工智能 自然语言处理 API
Cline:29.7K Star!一文详解VSCode最强开源AI编程搭子:一键生成代码+自动跑终端+操控浏览器...
Cline 是一款集成于 VSCode 的 AI 编程助手,支持多语言模型,实时检查语法错误,帮助开发者提高编程效率。通过智能化手段,Cline 可以生成代码、执行终端命令、调试 Web 应用,并扩展更多功能。
2687 73
|
存储 缓存 JavaScript
npm link 与 pnpm link 的用法以及不同之处
npm link 与 pnpm link 的用法以及不同之处
1100 0
|
11月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
12月前
|
前端开发 JavaScript 开发工具
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
2048 0
|
JSON 前端开发 JavaScript
使用vite搭建一个React项目!真香!
【8月更文挑战第13天】使用vite搭建一个React项目!真香!
2142 3
使用vite搭建一个React项目!真香!
Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息
这篇文章介绍了在Nest.js应用中使用Server-Sent Events (SSE)的技术。文章首先讨论了在特定业务场景下,为何选择SSE而不是WebSocket作为实时通信系统的实现方式。接着解释了SSE的概念,并展示了如何在Nest.js中实现SSE。文章包含客户端实现的代码示例,并以一个效果演示结束,总结SSE在Nest.js中的应用。
429 0
Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息
|
JavaScript 前端开发 Java
小笔记:如何使用代码注释:关于JavaScript与TypeScript 注释和文档的自动生成
小笔记:如何使用代码注释:关于JavaScript与TypeScript 注释和文档的自动生成
1027 0