React 组件库 Sass / Storybook / React Hooks / Typescript

965 阅读2分钟

介绍

chocolate-ui

觉得不错就点个 star 🦷

开发

  • React TypeScript

调试

Storybook是一个辅助UI控件开发的工具。通过story创建独立的控件,让每个控件开发都有一个独立的开发调试环境。

  • Storybook
    • 编写 stories
    • 添加 react-doc-gen ==> 可以根据注释生成文档页面
    • 添加和使用 addon ==> 丰富文档的一些功能
    • 生成静态页面 ==> 可以部署在服务器上

测试

  • 组件测试
  • React Testing Library
    • Jest
    • 行为模拟
    • 基础断言
    • mock 实现

部署

  • 代码提交:husky 做一些提交的规范校验
  • travis CI/CD 持续继承
组件库的开发流程

组件库开发流程

CI/CD

传统组件库的开发 传统组件库

每次修改代码都需要手动将静态文件上传服务器部署耗时耗力

可以使用 CI/CD

CI: 持续集成

  • 频繁将代码集成到主干(master) 好处:快速发现错误,每完成一点更新就更新到 master,快速发现错误然后修改
  • 防止分支大幅偏离主干,如果不是持续继承,主干又在大幅更新,导致以后的代码集成比较困难。 目的就是 产品快速迭代,保证代码质量 核心措施,继承到 master 之前需进行 自动化测试,都通过才去 merge 到 master

CD:持续交付、持续部署

  • 频繁将软件的新版本,交付给质量团队或用户
  • 代码通过评审,自动部署到生产环境

github 支持的持续部署工具【开源免费】 travis-ci.com

设计模式

发布订阅模式

举一个例子,你在微博上关注了A,同时其他很多人也关注了A,那么当A发布动态的时候,微博就会为你们推送这条动态。A就是发布者,你是订阅者,微博就是调度中心,你和A是没有直接的消息往来的,全是通过微博来协调的(你的关注,A的发布动态)。

发布订阅模式

发布订阅模式:订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Topic),当发布者(Publisher)发布该事件(Publish topic)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。

function eventUtil() {
  let eventList = {};
  this.eventList = eventList;
  this.on = function (key, fn) {
      if (!this.eventList[key]) {
          this.eventList[key] = []
      }
      this.eventList[key].push(fn)
  }
  this.emit = function (key, ...args) {
      fns = this.eventList[key];
      if (!fns || fns.length === 0) return false;
      for (let i = 0; i < fns.length; i++) {
          const fn = fns[i];
          fn.apply(this, args)
      }
  }
  this.remove = function (key, fn) {
      fns = this.eventList[key];
      if (!fns) return false;
      if (!fn) {
          fns.length = 0;
      } else {
          for (let index = 0; index < fns.length; index++) {
              if (fn === fns[index]) {
                  fns.splice(index, 1)
              }
          }
      }
  }
}

const eventKey = new eventUtil()
eventKey.on('custom', f1 = function (name) {
  console.log(name)
})
eventKey.emit('custom', 'hi')
eventKey.remove('custom', f1)
eventKey.emit('custom', 'hi')