Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端架构演进 - 从单体到微前端(理论篇)

前端架构演进 - 从单体到微前端(理论篇)

原创
作者头像
Teobler
修改于 2021-04-26 02:16:59
修改于 2021-04-26 02:16:59
7140
举报

我们首先需要认识到每一个系统的架构都不应该是一成不变的,为了应对业务的变化,我们不应该只有重写这一个选项。但往往架构的迁移业务方不会给开发人员预留充足的时间,在短时间内平滑地将旧的架构向新的架构演进就成为了一个需要解决的问题。

本文将从一个我最近经历的项目出发,讲解我们是如何在两周时间内将一个单体前端应用演化为一个微前端应用的。

为什么有这次演进

why
why

不是为了解决问题胡乱上莫名其妙的解决方案就是耍流氓。微前端和微服务一样都是为了解决问题而诞生的解决方案,先看看你的项目是不是也遇到了这些问题,再决定做不做吧。

首先我们项目是一个 To B 的交付项目,是某组织为其多个部门协调合作为愿景而设想的一个系统。各个部门的工作人员为了完成各自的业务需要访问该系统下的一个或多个子系统。

在这样的业务场景下在项目开始之初后端很自然地选择了微服务作为业务解耦和降低系统复杂度的解决方案,但前端因为考虑不周加上客户比较保守并没有采取微前端的解决方案,而是以分文件目录的方式尝试区分各个子系统。

在第一个子系统顺利完成交付后我们意识到了一些问题:

  • 一期项目上线后转由公司内另外的组维护,我们在做后面的项目时难免会修改到一期或者公用的代码,两个团队势必会造成代码冲突
  • 整个系统过于庞大,我们的体量没办法吃下整个合同,可预见未来会有第三方甚至第四方公司加入交付,现在的单体应用不但会造成大量的团队代码冲突,而且限定了整个项目的技术栈,不利于后期的跨团队合作
  • 虽然我们的应用通过 AWS EKS 部署,没有宕机的烦恼,但是现在的架构无法实现独立部署,每一次子系统的部署需要对整个应用进行打包,同时如果一个应用挂了,将会影响整个系统,微前端可以在这件事上做得更好

演进发生的时机

when
when

架构需要发生改变往往是因为开发人员发现当前的架构没办法应对业务的发展和变化,需要改变架构来适应新的业务。

也有可能是当前业务已经复杂到一定程度,需要对架构做一些改变来对业务做一些解耦降低整个系统的复杂度,使系统更易维护。

而不管是什么原因,在真正开始改变架构时都需要在交付的过程中花费额外的时间精力。但前面我们也提到过,往往业务方不会给足够的时间来让开发人员完成架构的演进。

选择一个恰当的时机也就成为了一个重要的点。

就我们的情况而言,时机在一期项目上线后,二期项目准备阶段,于是我们在新项目的第 0 个迭代启动了前端架构演进。

而如果我们就是连两个周的时间都没有,那么就真的只能在交付的过程中加入一些 tech 卡,在别的分支上边交付边改进。

目标

objective
objective

首先既然是架构的演进,那么就不会有完成的那一天,但是应该有一个最小的目标,只要达成了这个最小的目标,已经能解决开发过程中的主要问题,这次演进就算是达到目的了,基于此我们在演进开始前规划了相应目标:

  1. 不动基础设施,尽最大可能节省工作量,将所有应用打包后部署到同一个 nginx,将不同的应用放在不同的 folder 下,后续项目稳定后再推动客户拆分基础设施
  2. 先做最坏的打算,假如我们两个星期内完不成拆分该怎么办
    1. 保持 master 代码不动,计划后续如何在 master 代码分支上也能继续开发,同时新建分支完成代码拆分工作
    2. 保持现有 pipeline 不动,用于支持现有 master 分支代码,新建一条全新的 pipeline 适配新的应用
  3. 先只拆分整个应用的代码部分,时刻与 BA 和 后端小伙伴保持沟通,以业务形式和权限设计来指导前端如何拆分

技术选型

selection
selection

这个部分不一定每一次演进都会有,在我们的这个案例中,因为我们需要将一个单体应用拆分成微前端,为了减少拆分的工作量,增加项目的可维护性,我们需要挑选一个合适的微前端框架来解决这个问题。

说来也巧,在做出这个决定不久,公司发布了第23期技术雷达,我们关注到了 single-spa 做为一个微前端框架已经进入到了”实验“象限。同时进入我们视野的还有以 single-spa 为基础的 qiankun。

在使用 single-spa 完成一个小demo后我甚至都没有了解 qiankun 就已经决定使用 single-spa 了,原因有以下几点:

  • 生态完备,官网的文档很详细,并且有社区和官方的一系列代码库例子,同时还有上传在油管和B站的各种科普视频
  • 已经能解决我们想要解决的所有问题,并且从各个渠道搜索来看没有致命缺陷
  • 寻求帮助响应极快,我在写 demo 时遇到了一个没法实现的需求,当晚我在官方 slack 提问,第二天一早就收到解决回复

任务拆解

tasking
tasking

遇到了合适的时机,明确了需要达成的目标,完成了选型后要做的就是开动了,但是不得不再次提醒的是,我们需要做的是平滑演进,所以最重要的步骤其实是区分各类任务的优先级,通常我们会将任务划分成以下几类:

  • 必须要在短时间内完成的任务 - 这些任务如果不在这段时间内完成可能会 block 接下来的业务开发,可能会对未来的交付产生风险
  • 可以晚点做的任务 - 这些任务不会 block 业务的开发,但是从业务和技术上来说都是应该完成的,而且越往后做这些任务所花费的资源将越多
  • 可做可不做的任务 - 这些任务往往是为了提升开发体验,不会直接影响整个应用或业务
  • 可以不用做的任务 - 这些任务可以做,但是由于各种原因不在此次计划中,可以推迟到未来时机成熟后完成

总结

在日常开发过程中,我们需要站在一个高位往前看,确认现在的架构是否能支撑未来的业务形式和变化,及时计划架构调整和演进。

最重要的是,大多数架构的演进都是在时间不允许的情况下开始的,这时候我们需要对整个演进有一个计划,对所有的任务排列优先级,先做最重要的那一部分,不重要的延迟决定,然后舍弃一些东西。

另一件重要的事情是千万不要在这个过程中自己给自己加戏,作为开发人员,大家都想把每一个技术改进做到最好,但是给自己加戏的后果往往就是啥都想做好但是最后啥也没做好。

成功交付的前提是平滑演进。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你必须知道的11个微前端框架
微前端将前端整体分解为许多更小、更易管理的片段。每个团队可以端到端地拥有自己的功能,可以在自己的代码库中工作,可以独立发布版本,可以不断进行小的增量升级,还可以通过 API 与其他团队集成,以便他们可以一起组建和管理页面和应用程序。本文中,作者收集了 11 个最杰出的微前端构建工具,并提供了进一步学习的链接和视频。将单体后端分解成为微服务之后,后端开发流程已在效率和规模上取得了显著进步。然而,当今大多数前端应用程序架构仍然是单体式的,使得前端开发流程很难加速和扩展。
深度学习与Python
2020/11/05
2.5K0
聊聊微前端的原理和实践
本文对微前端的概念和场景进行科普,介绍一些主流的微前端的实现库及其用法,并讲解部分这些库的原理和实践知识。
2020labs小助手
2020/07/27
2.2K0
微前端架构初探以及我的前端技术盘点
最近几年微前端一直是前端界的热门议题, 它类似于微服务架构, 主要面向于浏览器端,能将一个复杂而庞大的单体应用拆分为多个功能模块清晰且独立的子应用,且共同服于务同一个主应用。各个子应用可以独立运行、独立开发和独立部署。
徐小夕
2020/04/07
1.1K0
微前端架构初探以及我的前端技术盘点
微前端拆分实践
微前端作为近两年兴起的一种解决方案,也不是什么新东西了,既然是解决方案,那么微前端帮我们解决了什么问题呢?这里我以我们项目组为例子讲讲:
Teobler
2021/09/14
1.3K0
微前端拆分实践
一文读懂微前端架构
前端开发在程序猿中无疑是一个比较苦逼的存在,作为一个前端开发,你必须要掌握Javascript,HTML,CSS这三大基础。Javascript作为网络时代最为重要的开发语言,由于其设计上的限制,一直在演进,经历了ES3,ES5,ES6(ECMAScript 2015)... ... 而简单的CSS也无法完成你复杂的需求,你需要Less/Sass/Sytlus来增强你的CSS的功能。这些还远远只是一小部分,你还需要了解:
yuanyi928
2021/05/27
3.1K0
一文读懂微前端架构
微前端自检清单
最近在做公司微前端,整理了一份微前端搭建清单,如果你正在考虑是否要做微前端,不妨做个参考。
疯狂的技术宅
2020/07/22
9650
了解一下微前端
微前端不知道什么时候开始变得非常火,结合后台的微服务,可以把一个系统切分为一个个子模块。比如用户模块、权限模块、订单模块等,每一个模块可以单独开发、测试、部署,每个模块还可以使用不同的技术,最后通过主应用加载这些模块。
wade
2020/08/11
5650
微前端从singleSpa到qiankun
微前端解决什么问题?近几年前端的工程化知识开发愈演愈烈,后端解耦,前端聚合,兴起微前端的技术主要是因为SPA项目工程,得到了长足的发展,所有的微前端都是为了解决工程与工程之间的粘合问题即是 从所有收集的部分组成并返回一个无缝的HTML页面
用户10106350
2022/10/28
1.3K0
微前端从singleSpa到qiankun
面向未来与浏览器规范的前端DDD架构设计
Hello 大家好,我是来自字节跳动的郑仁杰,目前是公司微前端开源项目 Magic(https://github.com/bytedance/magic-microservices)的负责人及核心贡献者,今天我带来的分享主题是《面向未来与浏览器规范的前端 DDD 架构设计》,这次我们站在了一个与行业传统微前端解决方案完全不同的全新的视角去思考如何设计和实践前端微服务,如何更优雅的借助浏览器原生能力将微前端的粒度做到组件级别,期待能给大家带来不一样的收获和体验。
ConardLi
2021/12/13
2K0
面向未来与浏览器规范的前端DDD架构设计
[14章附电子书]从0到1落地微前端架构, MicroApp实战招聘网站
能够应对不同技术栈、不同构建工具的巨石应用架构是前端高级工程师的衡量标准之一。本文为你提供一套大型中台项目构建、多技术栈项目融合的最佳落地方案,并结合主流微前端框架MicroApp,流行技术栈Vue3、React18、Nuxt2、Vue2、Vite、Webpack最终聚合实现多个子应用的大型招聘网站,助力你成长为独当一面、具备team leader潜质的前端高级工程师。
小企鹅204415010
2024/04/22
3230
微前端究竟是什么?微前端核心技术揭秘!
导语 | 微前端是将Web应用由单一的单体应用转变为多个小型前端应用聚合为一的一种手段。本文从微前端的基础理论出发,对其核心技术进行阐述,最后结合项目进行简单的应用实践。 一、微前端背景 (一)什么是微前端 微前端提供了一种技术:可以将多个独立的Web应用聚合到一起,提供统一的访问入口。一个微前端应用给用户的感观就是一个完整的应用,但是在技术角度上是由一个个独立的应用组合通过某种方式组合而成的。 为了防止概念有点抽象,可以看一个具体的例子:上图是一个微前端的demo,主应用中有导航栏,footer组件以及
腾讯云开发者
2022/02/24
2.5K0
从微前端聊聊架构演进
就目前来看,微前端已经不是一个新话题了。随着越来越多的公司的深入研究,当前也提出了很多的解决方案。不过本文不是想要来介绍微前端,更想介绍项目如何一步步到达微前端架构的实际需求。
ConardLi
2020/02/20
6340
微前端在小米 CRM 系统的实践
大型组织的组织结构、软件架构在不断地发生变化。移动优先(Mobile First)、App中台(One App)、中台战略等,各种口号在不断的提出、修改和演进。同时,业务也在不断地发展,导致应用不断膨胀,进一步映射到软件架构上。
苏南
2020/12/16
1.1K0
微前端在小米 CRM 系统的实践
微前端方案 qiankun 只是更完善的 single-spa
一个前端应用能够单独跑,也能被作为一个模块集成到另一个应用里,这种架构方式就叫做微前端。
神说要有光zxg
2022/11/11
1.1K0
微前端方案 qiankun 只是更完善的 single-spa
万字解析微前端、微前端框架qiankun以及源码
本文将针对微前端框架 qiankun 的源码进行深入解析,在源码讲解之前,我们先来了解一下什么是 微前端。
前端达人
2020/05/13
3K0
微前端——理论
天下大势,分久必合合久必分。大型组织的组织结构、软件架构在不断的发生变化。一款软件从最初的单一,进行不断的细化,最终变得庞大,从而不得不拆分到不同部门,出现多样化。然而在多样化的道路上,用户厌倦了一家公司的软件却要分散于不同的应用中,于是应用又再一次走向聚合。
maureen
2022/09/25
2.4K0
微前端建设方案
为解决项目前端的高耦合、改动牵一发而动全身、多种技术栈强制混用、前端反复重构不彻底的问题,提出微前端的建设。
Dawnzhang
2022/05/10
5580
微前端学习笔记(1):微前端总体架构概述,从微服务发微
从最初的CS架构,如MFC Java Swing 等,到BS架构,JSP PHP,再到前端后端分离,前端从jquery  GWT-Ext  到 Handlebars ,再到angularJS/Vue/React,反观java 世界,学好 Spring MyBatis ,一路无忧,哎……
周陆军博客
2024/06/06
3960
微前端学习笔记(4):从微前端到微模块之EMP与hel-micro方案探索
Module Federation就是一个JavaScript远程模块加载架构,即:Module federation allows a JavaScript application to dynamically run code from another bundle/build, on both client and server。
周陆军博客
2024/06/06
5510
微前端架构实战
之前比较多的处理方式是npm包形式抽离和引用,比如多个应用项目之间,可能有某业务逻辑模块或者其他是可复用的,便抽离出来以npm包的形式进行管理和使用。但这样却带来了以下几个问题:
西岭老湿
2021/04/25
4K0
微前端架构实战
相关推荐
你必须知道的11个微前端框架
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档