其他
干货 | Trip.com 机票React Native整洁架构2.0实践
作者简介
本文作者为携程国际部门机票App团队的佳璐、熠暘、文焕。
一、前言
二、架构优化
View - React代码,只负责界面展示、样式和响应用户交互。 Presenter - 连接View和Model,连接外部模块,不存在业务逻辑。 Model - 业务实体,封装了业务逻辑和展示逻辑供Presenter调用。
业务逻辑实现在业务模块内,与展示逻辑强耦合。当界面不展示业务模块时,对应的业务逻辑也无法执行,容易出现程序bug。
业务逻辑与展示逻辑难以复用。
页面内多个业务模块实现同一业务逻辑时,只能通过拷贝相关代码解决。 跨页面复用模块时,由于不同页面间的业务逻辑存在差异,导致无法直接复用。
模块间数据通信方式复杂,由于业务逻辑实现在不同业务模块内且业务模块在页面中呈树状结构,页面逻辑复杂时数据通信容易出现下图中的状态。
优化数据通信方式,模块只与Service通信,实现单向数据流。 新增业务Service概念,承载页面业务逻辑,业务模块调整为只承载展示逻辑。
单向数据流
业务Service
三、插件功能优化
// ModuleA/Presenter/index.ts
export class ModuleAPresenter {
private monitor: Monitor;
constructor(monitor: Monitor) {
this.monitor = monitor;
}
public updateView() {
// 收集模块A的最新状态。
this.monitor.updateState(this.model.getViewModel(), 'ModuleA');
this.view.updateView(this.model.getViewModel());
}
}
// Monitor/index.ts
export class Monitor {
private stateMap = new Map();
public updateState(state, moduleName) {
this.stateMap.set(moduleName, state);
// 检查模块A、模块B的状态是否同步。
this.checkState();
}
}
// ModuleA/Presenter/index.ts
export class ModuleAPresenter {
public updateView() {
// 业务模块中不再有无关逻辑
this.view.updateView(this.model.getViewModel());
}
}
// Monitor/index.ts
export class MonitorPlugin implements IGrtPlugin {
private stateMap = new Map();
// ”切面“方法
public onUpdateState(state, moduleName) {
this.stateMap.set(moduleName, state);
// 检查模块A、模块B的状态是否同步。
this.checkState();
}
}
四、小结
【推荐阅读】
携程机票 React Native 整洁架构实践 携程桌面应用的前端内存优化与监控 从0到1,搭建一个体系完善的前端React组件库 携程度假无线前端架构演进之路 《携程架构实践》《携程人工智能实践》上市啦!
“携程技术”公众号后台回复“新书”,
可免费获得两本书的试读样章~
《携程架构实践》
京东
当当
《携程人工智能实践》
京东
当当
“携程技术”公众号
分享,交流,成长