背景:
elpis项目是我从前端进阶全栈的一个企业级个人项目。这个项目成立之初目标是为了解决自己职业生涯上的下面四个痛点,包括:
- 工作中重复性工作很高;
- CRUD体力活工作占比较高;
- 多套系统交付间产生大量重复性工作以及
- 作为前端基本上只聚焦于页面开发,而无法涉猎整个系统交付的全生命周期
一句话描述就是因为平常工作中CRUD体力活和重复性工作较多,并且所做的又全都是纯前端页面开发的体力活,导致成长受到了瓶颈。因此为了突破这个瓶颈,从而成立了这个项目。
既然是为了解决上面四个痛点,我们不妨具象化这四个痛点并各自设立其目标。因此根据分析就有了从痛点到目标下面这个映射表格
| 痛点 | 目标 |
|---|---|
| 工作中重复性工作很高 | 避免相似功能重复开发 |
| CRUD体力活占比很高 | 更多地参与系统框架开发迭代工作 |
| 多套系统交付间产生大量重复工作 | 支持多套系统建设,并且无需重新开发相同功能 |
| 技术同学很偏页面开发 | 技术及综合能力全面提升 |
那为了实现这四个目标,我们就需要对这些目标进行拆解,因为只有落地成为真实可执行的需求以后我们才能有下一步进行的实际行动。
| 痛点 | 目标 | 需求 |
|---|---|---|
| 工作中重复性工作很高 | 避免相似功能重复开发 | 一套解决方案沉淀80%的重复性工作,支持可配置化。同时对20%的定制化工作进行开发 |
| CRUD体力活占比很高 | 更多地参与系统框架开发迭代工作 | 方案需落地为系统平台且可持续集成 |
| 多套系统交付间产生大量重复工作 | 支持多套系统建设,并且无需重新开发相同功能 | 平台需支持多系统建设,且系统间功能能够复用 |
| 技术同学很偏页面开发 | 技术及综合能力全面提升 | 全栈开发,引入Nodejs,devOps等流程 |
总的来说,就是需要实现一个可配置化的支持多系统建设且系统间功能可以复用的可持续集成的系统平台,从而沉淀80%的重复性工作,同时对20%的定制化工作进行开发。此外,为了提升综合技术能力,我们需要引入Nodejs和devOps等技术进行全栈开发。
项目概览:
下面这张图是这个系统平台的总体技术架构,总体切分为三层,分别是展示层、BFF层以及数据层
其中展示层主要是由前端页面和组件构成,包含了前端的相关组件库、UI框架等等一系列工具组成
往下一层是BFF层,也就是我们的后端层(全称为Backend for Frontend),这一层又可以细分为三层,分别是接口接入层,以及专门负责处理业务逻辑的业务层还有就是封装了获取数据库数据的服务层。
最底层是数据层,这一层主要由数据库组成,是我们整个系统的数据存储/提供的层级。
技术选型:展示层使用的是Vue3 + Elementplus + Webpack5; BFF层采用的是Node + Koa的组合,数据层选择的是MySQL以及log4js(日志系统)。
这里同时记录一下技术选型的思路:
- 看与项目匹配程度。例如有些框架适合小型企业,主打多变灵活,有些框架则是比较适应大型企业,主打的是稳定并且能够承载高流量等等特质。例如MySQL对比于MongoDB,一个是关系型数据库一个是非关系型数据库。MYSQL由于是关系型数据库并且其内部支持事务特性,因此对于数据的一致性以及高并发负载均衡上有着一定能力。但是框架体积较大,需要花费大量的存储空间来维护,并且需要学习专门的语言才能驾驭这个框架(SQL)。另一方面MongoDB由于没有实现这些关系型数据库的特征也不支持事务特性,所以轻量化,体积较小。而且开发上面语言成本没有MYSQL高,因此适合小型企业迅速搭建项目。
- 看技术生态以及技术历史。优先选择技术生态好的并且技术历史比较悠久的技术栈、框架。因为这些框架生态好就意味着对各类语言的支持性较好,即便想为这个技术框架找一些辅助工具也很容易。不需要专门为其造轮子,简而言之可维护性更高。技术历史更悠久则代表这项技术经过了市场的验证,运行稳定,不容易出现BUG。还是拿MYSQL和MongoDB做比较,MySQL支持的语言类型比MongoDB更多。如果未来我们的系统需要拓展支持其他语言查库,则MySQL会更加方便。同时MySQL比MongoDB诞生历史更早,而且社区资源丰富,因此框架运行更稳定,相对来说出现BUG的概率更小。
- 看人员技术底蕴和人员对于技术栈的熟悉程度。内部人员习惯于哪种技术栈不习惯于哪种技术栈,以及团队内部人员的技术基础等因素也是影响着技术选型的关键点,例如对于一个新兴团队而言,团队内部成员之前都没怎么接触过前端框架亦或者团队成员工作经验比较少只有1-2年左右,那么Vue可能更合适,因为它的双向绑定和模板语法让人可能更加容易上手。但是如果对于一个工作有一定年限的团队来说(3-5年以上),React可能更加合适,因为它的生态更加全面,单向数据流让整个项目和组件库都更加容易维护。