背景
公司缺少一个通用的轻量级c端 H5 UI组件库。旧组件库当时是为了适用B、C两端,基本在同一个组件里面开发了两套代码,而且长期对组件无规范的修改,导致 组件库代码臃肿,不好维护,兼容性差。
技术
- Dumi
- React
- TypeScript
特点
- 轻量级
- 兼容性好
- 纯粹
搭建流程:
-
根据 dumi 文档进行 初始化
-
我们是基于react开发,所以选择React Library
-
生成的项目目录有.dumirc.ts.fatherrc.ts.prettierrc.js等,解释一下。
-
src目录就是编写组件的地方。每个组件都在src里面新建一个文件,文件内有index.tsx\index.less\index.md, 解释一下。src下有一个index.ts,负责把所有组件模块export导出。
-
UI开发的组件库文档首页,主题、文案都可以自定义修改。例如:文案修改 docs 文件下的 index.md,主题结构可以在.dumirc里面配置。
-
组件开发也要统一规范,例:
项目使用 typescript 文档生成使用 dumi - dumirc dumi 配置文件 项目构建使用 father - fatherrc father 配置文件 css 风格使用 umijs eslint - stylelintrc css 配置文件 js 风格使用 umijs stylelint - eslintrc js 配置文件 -
最后完善一些配置就差不多搭好了,例 package.json 的 publishConfig 中 registry 需要设置成我们公司的npm地址。
-
命令行也是内置配置好的,build打包组件库输出到lib, docs:build 打包文档输出到dist。
图片组件
通用组件我们开发时通常会去保持它的纯粹性,单一性,不加太多额外的功能;
但是图片组件不太一样,因为我们的H5页面是C端的,会展示大量的商品图。所以就必须加一些额外的功能去提高它的加载性能
- 第一个是七牛云支持图片的裁剪,我们要支持图片组件使用时可以加一些特定参数,如 切割图片宽度width、图片质量quality、支持webp格式等,参数拼接时要遵守七牛云定义的规范。
- 第二个就是支持onload后做一些事情,像监听到低画质图快速渲染完毕后,请求原图片并替换为高清图,还有判断是否支持webp格式等。
Loading组件
loading组件中,因为我们需要获知哪个模块加载时间过长,就需要对loading时长进行监听上报。我们做法是:
loading组件自身判断加载时长,超过两秒dispatch一个事件,然后在我们项目里面监听这个事件并上报。
`
js
//组件dispatch事件:
window.dispatchEvent(new CustomEvent('h5_loading_open'))
window.dispatchEvent(new CustomEvent('h5_loading_hide'))
//项目监听:
let open_time: number;
window.addEventListener("h5_loading_open", () => {
open_time = new Date().getTime();
});
window.addEventListener("h5_loading_hide", () => {
const costTime = new Date().getTime() - open_time;
if (costTime > time) {
const data = {
yh_costTime: costTime,
page_url: window.location.href,
}
this.handleReport(data)
}
});
`
总结
归纳一下,组件库用的是React + dumi + ts 技术搭建并开发。一些配置参数需要自定义。组件开发尽可能保持功能纯粹,特定情况下也要视具体情况而定。