搭建组件库/npm包
- 脚手架
- 构建工具选择,bundless打包
- 本地开发服务器
- 使用ts编写/生成ts类型声明
- 组件库文档
- 基础组件库单测/业务组件库可以省略
- 自动化发版,包括beta、alpha、release版本
- 核心维护人员专项负责,收口需求、fix问题、版本迭代
搭建项目
- 脚手架
- 路由/路由模式
- 工具函数
- 基础组件库/业务组件库/仓库组件库
- 状态管理
- pages
- 请求管理
设计模式
单例模式
工具类封装、axios、全局状态管理
外观模式
封装的组件提供统一的api,供外部业务使用
对三方库做一个二次封装,提供一个统一的外观,业务不是直接依赖三方库,方便后续更换三方库。
比如自定义业务监控告警的函数封装、埋点的函数封装、组件的二次封装(类似于适配器模式)
装饰者模式
高阶组件(例如权限组件之类)、装饰器
发布-订阅模式
事件总线进行数据传递/通信、NativeEvent
与观察者模式区别:存在独立的事件中心(Event Bus/Broker),发布者和订阅者通过中介通信,双方无直接交互。
// 事件总线类
class EventBus {
constructor() {
this.events = {}; // 存储事件及其对应的回调函数列表
}
// 订阅事件
subscribe(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
}
// 取消订阅事件
unsubscribe(event, callback) {
if (this.events[event]) {
this.events[event] = this.events[event].filter(cb => cb !== callback);
}
}
// 发布事件
publish(event, data) {
if (this.events[event]) {
this.events[event].forEach(callback => callback(data));
}
}
}
// 示例使用
const eventBus = new EventBus();
// 定义回调函数
const callback1 = (data) => console.log('Callback 1 received:', data);
const callback2 = (data) => console.log('Callback 2 received:', data);
// 订阅事件
eventBus.subscribe('myEvent', callback1);
eventBus.subscribe('myEvent', callback2);
// 发布事件
eventBus.publish('myEvent', 'Hello Subscribers!');
// 取消订阅事件
eventBus.unsubscribe('myEvent', callback1);
// 再次发布事件
eventBus.publish('myEvent', 'Callback 1 has been removed.');// 主题类
class Subject {
constructor() {
this.observers = []; // 观察者列表
}
// 注册观察者
addObserver(observer) {
this.observers.push(observer);
}
// 移除观察者
removeObserver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
// 通知所有观察者
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
// 观察者类
class Observer {
update(data) {
console.log('Received data:', data);
}
}
// 示例使用
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();
subject.addObserver(observer1); // 添加观察者1
subject.addObserver(observer2); // 添加观察者2
subject.notify('Hello Observers!'); // 通知所有观察者
subject.removeObserver(observer1); // 移除观察者1
subject.notify('Observer1 has been removed.'); // 再次通知所有观察者代理模式
proxy代理对象的访问
状态模式
不同的状态决定了不同的行为,使用状态模式(类似于策略表)来避免过多的if/else逻辑判断。