如何设计一个前端框架

Posted 听Eason聊成长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何设计一个前端框架相关的知识,希望对你有一定的参考价值。

在前端开发过程中,为了将业务逻辑和界面显示卸耦,需要采用一些架构设计手段。同时要求一些与 UI 无关的业务处理逻辑最好能重用,模块之间层次分明。如果让你来设计一个前端开发架构,是否能达到这样的目标呢?

在js 前端,已经有了像 React 和 Vue 这样出色的前端开发框架。在桌面应用,还是很少见优秀的前端开发框架。花了点时间,思考了一下。

关键类定义

ActionType (Action 常量类型)

ActionArg(Action 参数类)

Action(描述类,包含 ActionType 和 ActionArg)

ActionHandlerCallback(ActionHandler 中调用的回调函数,一般通过此回调函数用于更新 UI,回调函数在 UI 类中实现)

ActionHandler(Action 的处理逻辑实现类,用ActionType和ActionHandlerCallback初始化,暴露 excute 方法,接收 Action 参数)

ActionDispatcher(Action 转发类,暴露dispatch方法)

调用流程

UI 类初始化过程,初始化ActionDispatcher,用UI 类的ActionHandlerCallback和ActionType实例化各个ActionHandler,并且注册到ActionDispatcher中。

UI 类的事件处理器,从控件中获取数据和输入,构建Action实例调用ActionDispatcher的dispatch方法。

ActionDispatcher的 dispatch方法接收 Action 实例,根据 Action 中的ActionType 找到对应的 ActionHandler去调用excute方法。

ActionHandler 从 Action 中提取 ActionArg 去做业务处理,业务处理后,如果发现ActionHandlerCallback不为空,则调用ActionHandlerCallback。

ActionHandlerCallback接收业务处理结果作为参数,更新主界面。

基础约束

ActionHandlerCallback主要作用是更新UI 界面,与UI 类内聚,可以直接在UI 类实现,但ActionHandlerCallback在ActionHandler的excute方法中可以调用,达到 UI 显示和业务处理分离的目的。

UI 类中的一个事件处理器可以对应创建一个 ActionType 常量,一个ActionType一般对应一个Action类实例,然后对应一个ActionHandler。

所有的 Action逻辑调用都通过ActionDispatcher的 dispatch方法,就不依赖ActionHandler的具体实现。并且可以在dispatch方法中进行切面逻辑控制。

有外部接口调用,可以再创建 Service 类调用外部接口,ActionHandler的excute方法可以调用Service中的方法。

按业务功能分包,UI 类、ActionType、ActionArg、Action、ActionHandler都放在同样一个业务功能包里。

其他问题与改进。

是否在ActionHandler中调用其他功能包的Action 处理逻辑?

显然上面的设计方案是不行。因为UI 类初始化过程,初始化ActionDispatcher,用UI 类的ActionHandlerCallback和ActionType实例化各个ActionHandler,这里对 UI类有了依赖。

为了能调用其他功能包的Action 处理逻辑。ActionHandler需要在应用首次运行时就进行注册。最好能自动扫描所有的ActionHandler,自动实例化注册。

同时ActionHandler中不能再包含ActionHandlerCallback。那么这个时候可以将ActionHandlerCallback放到Action实例中,ActionHandler也就可以获得ActionHandlerCallback了。如果调用的是其他业务功能包中的Action逻辑,则不必设置ActionHandlerCallback参数。

这样虽然解决了问题,但是Action描述类却变得复杂了,包含了ActionType、ActionArg、ActionHandlerCallback等。是否有其他更好的处理方式?ActionHandler需要要更新 UI 时候,发布一个自定义的 UI 更新事件。UI 类实例监听这些事件,则更新自己的 UI 界面。回调函数方式类似 React,事件机制类似 Vue。这两种方式都是为了不同层次之间能卸耦。

另外一个问题,为了 Action 的处理逻辑能够复用,一个 ActionHandler 的中excute方法,如果能调用其他的Action 处理逻辑,需要获取它们的处理结果状态时又该怎么办?

简单的办法就是,让ActionDispatcher的dispatch方法有个泛化的返回结果值。

如果要让 UI 也形成组件,不同界面能共用相同的 UI 组件,又该怎么做呢?


以上是关于如何设计一个前端框架的主要内容,如果未能解决你的问题,请参考以下文章

如何选择一个Flex框架

浅谈现代前端框架技术思想

精选100个优秀的前端框架!

前端框架有哪些,最主流的是哪个?

移动webapp前端ui用哪个框架好

前端ui框架好看的都有哪些