《n 天微前端技术深度挑战》掘金专栏代码仓库,掘金专栏地址:juejin.cn/column/7287...
专栏所有代码位置:github.com/Sunny-117/m...
什么是微前端?
微前端 这个名词,是2016年底在 ThoughtWorks Technology Radar 被提出。这个概念天生其实就是和后端的微服务概念相对应的。
大家对微服务都比较熟悉了,微服务允许后端体系结构通过松散耦合的代码库进行扩展,每个代码库负责自己的业务逻辑,并公开API,每个API均可独立部署,并且各自由不同的团队拥有和维护。
现代的前端应用的发展趋势正在变得越来越富功能化,富交互化,也就是传说中的SPA (单页面应用);这样越来越复杂的单体前端应用,背后的后端应用则是数量庞大的微服务集群。被一个团队维护的前端项目,随着时间推进,会变得越来越庞大,越来越难以维护。所以我们给这种应用起名为巨石单体应用。
在微服务的架构中,后台的服务已经按照业务进行了分离,而前端仍然是一个单体构建,通过网关来调用不同的后台服务。这个与微服务的思路是相违背的,这也就造成了你的后端团队是按照业务分割的,但是前端团队仍然是一个整体。微前端可以有效地改进这一点。
前端架构经历了从单体,到前后端分离,再到微服务,最终发展到现在的微前端,如下图
微前端解决了哪些问题
优化功能开发
微前端和其他架构最显著的区别在于团队结构。
在传统的项目架构中,功能的完成时间取决于最后一个团队的完成时间
减少团队间的等待时间是微前端的主要目标之一
在微前端的模型中,所有参与创建功能的人员都在同一个团队中,虽然需要完成的工作总量是相同的,但是团队内的沟通会更加的快速,可能不需要跨部门,也不需要那么正式,迭代会进行的更快。不必等待其他团队,也不必讨论任务的优先级。
不再有前端巨石架构
有了微前端,包括前端在内的应用程序被分割成更小的垂直系统。每个团队都有自己的一小块前端。这与一个前端巨石应用相比,构建和维护一个较小的前端更具有优势
能更快的适用变化
处理遗留系统在前端也日益成为一个较普遍的话题。开发人员要花费大量时间重构遗留代码和执行迁移策略,这将花费公司大量精力。
技术是在不断发展的,当你构建特定规模的应用程序,并希望保持竞争力时,如果新技术能为你的团队提供价值,那么能够自由的转向新技术,并且还能将试错的成本保持最小,这至关重要。
如果使用微前端,那么就意味着你不需要每隔几年重写整个前端项目以使用当前流行的技术,微前端的每一块应用都可以本地决策。我们甚至可以先拿出一个应用模块进行试错,然后直接整合到现有的平台上即可。
自主的优势
微服务架构的核心优势之一是自治,微前端也是这样
如果某一个应用团队需要更新某个新的功能,这个功能可能甚至导致整个JS框架的升级。在微前端框架中,你完全不必纠结,直接处理就行。但是如果是以前的巨石应用,那就是一个头痛的大问题了。你不知道要协调多少部门,多少人员,多少代码。
团队之间的沟通是昂贵的,当你想要更改别人的一段代码,即使只是一个工具库,也需要通知所有人,等待他们的反馈,也许还要讨论其他的选项。参与的人越多,处理起来越麻烦。
微前端的核心价值
微前端所解决的问题,正是它所体现的核心价值所在,总结其实就是下面几点:
-
技术栈无关
-
可独立开发、部署
-
增量升级
-
独立运行时
微前端架构的实现方式
无论如何,微前端架构需要落地的实现,我们划分了之前的垂直体系的团队结构,而每个团队的前端页面,我们最终都需要整合集成,将所有内容组装到一起。而且很多时候,也并不是每个团队提供的都是一整个页面,可能是一个页面,也可能是一个或者多个页面的片段,根据具体的业务需求来整合集成。
因此这种前端的集成,我们大体也就分为三类,路由、组合和通信
我们可以通过路由,直接跳转到其他子应用,这个过程可以做的很简单,一个超链接搞定。也可以把每一个子应用看成一个SPA的单页应用,然后我们进行路由单页跳转。
也可以再页面进行组合,比如简单点使用iframe嵌套,也可以使用最新的HTML5的API,web component把每一个应用做成一个组件进行嵌套。
如果页面有一些比较复杂的业务,需要应用之间传递信息,然后获取不同的页面效果,那么就需要页面之间的通信。
微前端架构的解决方案
- iframe
- single-spa
- web component
- webpack5 模块联邦
国内常见的微前端框架
集成了页面,还有一大堆事情要做:
- CSS样式隔离:不同项目,相同的样式名在页面中是会相互污染的
- js隔离:不同项目,在向window挂在变量时,有可能会互相污染
- 路由状态:子应用的路由改变需要同步到主应用上
- 通信方式:子应用之间互相通信也是必不可少的,要尽量解耦不要互相调用。
- 预加载:利用用户浏览空闲时间,提前加载其他项目的JS文件,提高用户体验
- ......
这些都是页面集成之后需要去解决的问题。当然了现在市面上已经有了一些比较成熟的微前端框架.
- qiankun
- micro-app
- 无界
- ......
不过即使有了这些框架,并不能解决我们所有企业在微前端中遇到的问题,包括微前端自己,也并非一颗银弹。因此,我们学习的重心不是在这些框架应该怎么使用,应该去探究这些框架底层是如何实现的。这样以后如果出现了问题,我们也能脱离框架,自行解决。