随着咱们中后台系统的复杂,每每会遇到多个团队独立维护的子应用接入统一的主应用中,这些子应用每每独立开发、独立部署、彼此彻底解耦,这时候往常的单一应用没法知足业务的增加需求。而微前端即是用来解决随着时间的推移业务复杂度的提高,某个单应用演变为难以维护的“巨石应用”。css
这便文章并非一个源码解析以及上手教程的文章,我但愿从一个宏观的角度介绍下微前端而且简单聊一下微前端在咱们如今项目中的一些思考。html
我一直认为抛离业务的技术改造都是没有太大价值而且很难走远的。这里我先简单介绍下我对目前项目所作的一个架构演变以及一些简单思考。我目前所处一个大型的 B 端项目团队,系统根据业务域划分的子应用有几十个,系统 PV 百万+,因此在这样一个庞大的系统中咱们的系统架构也经历了如下一些变化。前端
在我刚加入团队的时候,咱们的系统仍是一个先后端未彻底分离的架构,模版提供了一个入口挂载根节点,前端在根节点上渲染 React / Vue 应用。web
不难发现这样的架构存在必定的弊端:chrome
可是值得庆幸的是,这时候咱们的系统已经有必定的分治思想了,主应用(这个时候应该说是 layout 层)和子应用单独挂载在不一样的模版片断上,这也为后面的 iframe 和微前端改造减小了很多工做量后端
其实,这样的架构也有必定微前端的影子:) 。跨域
后面随着后端微服务化的转型,后端已经不去关心路由的管控和页面的挂载,转而提供更加原子化的微服务。而对咱们前端来讲:浏览器
可是随着 iframe 架构的落地以及后续迭代的进行,咱们也发现了 iframe 方案的一些弊端:前端框架
最后在今年中旬的时候我这边将 iframe 架构升级到了微前端 + iframe 并存的架构,并开发落地了一系列微前端相关的开发工具链(喜大普奔...)。cookie
在我看来,微前端是一个思想,是一种开发模式和架构的演变,诸如 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 的源码解析以及我所作的一些微前端工具的原理分析等文章(撒花...)。