随着我们中后台系统的复杂,往往会遇到多个团队独立维护的子应用接入统一的主应用中,这些子应用往往独立开发、独立部署、彼此完全解耦,这时候往常的单一应用无法满足业务的增长需求。而微前端便是用来解决随着时间的推移业务复杂度的提升,某个单应用演变为难以维护的“巨石应用”。
这便文章并不是一个源码解析以及上手教程的文章,我希望从一个宏观的角度介绍下微前端并且简单聊一下微前端在我们现在项目中的一些思考。
我一直认为抛离业务的技术改造都是没有太大价值并且很难走远的。这里我先简单介绍下我对目前项目所做的一个架构演变以及一些简单思考。我目前所处一个大型的 B 端项目团队,系统根据业务域划分的子应用有几十个,系统 PV 百万+,所以在这样一个庞大的系统中我们的系统架构也经历了以下一些变化。
在我刚加入团队的时候,我们的系统还是一个前后端未完全分离的架构,模版提供了一个入口挂载根节点,前端在根节点上渲染 React / Vue 应用。
不难发现这样的架构存在一定的弊端:
但是值得庆幸的是,这时候我们的系统已经有一定的分治思想了,主应用(这个时候应该说是 layout 层)和子应用单独挂载在不同的模版片段上,这也为后面的 iframe 和微前端改造减少了不少工作量
其实,这样的架构也有一定微前端的影子:) 。
后面随着后端微服务化的转型,后端已经不去关心路由的管控和页面的挂载,转而提供更加原子化的微服务。而对我们前端来说:
但是随着 iframe 架构的落地以及后续迭代的进行,我们也发现了 iframe 方案的一些弊端:
最后在今年中旬的时候我这边将 iframe 架构升级到了微前端 + iframe 并存的架构,并开发落地了一系列微前端相关的开发工具链(喜大普奔...)。
在我看来,微前端是一个思想,是一种开发模式和架构的演变,诸如 qiankun、icestark 等框架也仅是微前端实现的落地,合理的 iframe 实现未尝不算是一种微前端实现的落地。我们原来的 iframe 架构设计一定程度上也算是一种微前端思想,并且在我看来,iframe 对于这种跨团队的中后台巨无霸项目依然有着天然的优势,理由如下:
但是,与之而来的便是 iframe 的一些痛点:
尽管以上这些痛点或多或少的配合着一些 hack 的工具以及开发规范都有一定的解决方案,但是有更好的选择为什么不尝试呢:)
这里我不去讲概念,道理大家都懂,概念一搜全都是。例如微前端很官方的诠释:
Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently
就像巨石应用并不是一蹴而就的,接下来我来通过一个巨石应用的演变来向大家介绍我理解的微前端。
起初我们的系统可能仅有一个业务模块。路由硬编码在项目里,layout 层和业务子系统也写在一起。
随着业务的增长,我们的系统接入了更多的业务模块,这个时候其实通过一定的路由配置和多页的配置,项目也还算是没太大问题。
但是这个时候需要引起警觉,如果再接入了更多的业务模块还停留在当前的模式下,项目该怎么维护?
随着业务更进一步的增长,接入的业务模块越来越多,不仅我们以导航维度扩充的子应用增多,甚至诸如首页这样子的页面上也会有归属于多个业务域的区块。总结起来就会分为两类场景:
这时如果没有很好的处理和子系统的拆分,那么我们的应用就会变为巨石应用...
这时候我们往往将系统根据业务域的划分拆分成不同的子应用,而承载这些子应用的 layout 层我们拆分为主应用,各个子应用独立开发独立发布,并且由不同的业务团队维护,以此来解决复杂的单体应用带来的各种开发维护问题。
可以看出,微前端便是采取分治的思想来避免单体应用演变成巨石应用的。
在我看来,在微前端的思想中,重点强调了几点:
现在市面上的微前端框架有很多,例如阿里内部就有 icestack、qiankun 两大比较成熟的开源微前端框架,以及社区上 singleSPA 等。那么我们该如何选择适合我们项目的微前端框架呢,这里我简单罗列了我在选择微前端框架时候的一些思考:
最后,结合上面的一些思考以及我们现在的系统架构,我选择了 qiankun 来落地我们的微前端方案。并且为了保证微前端接入以及版本管控的便捷,我们
以上便是我在做微前端改造时候结合业务系统的一些思考,如果有不对的地方欢迎指正。之后我也会输出 qiankun 的源码解析以及我所做的一些微前端工具的原理分析等文章(撒花...)。