第八章(应用场景篇) 中大型项目的解构:从单体应用到微前端

简介: 第八章(应用场景篇) 中大型项目的解构:从单体应用到微前端

中大型项目的解构:从单体应用到微前端

随着业务的不断扩张和技术栈的日益复杂,许多中大型项目面临着维护性、可扩展性和团队协作等多方面的挑战。为了解决这些问题,越来越多的团队开始考虑将单体应用解构为微前端架构。本文将详细探讨这一解构过程,分析其中的挑战与对策,并通过案例分析来展示实际操作。

一、从单体应用到微前端

1.1 单体应用的困境

单体应用(Monolithic Application)指的是一个包含所有业务功能、由一个团队维护、并部署为单个单元的应用。随着业务的发展,单体应用往往会变得越来越庞大,导致以下问题:

  • 代码耦合度高:不同功能模块之间的代码相互依赖,修改一处可能影响到其他部分。
  • 团队协作困难:随着代码量的增长,开发人员之间的沟通成本和维护难度也随之增加。
  • 扩展性差:由于所有功能都集中在一个应用中,很难对某个功能进行单独的扩展或优化。
  • 部署不灵活:每次修改都需要重新部署整个应用,影响发布速度和用户体验。

1.2 微前端的优势

微前端(Micro Frontends)是一种将单个前端应用拆分为多个小型、独立的前端应用的方法,每个应用都可以由不同的团队独立开发、测试和部署。微前端的优势包括:

  • 技术栈多样化:不同团队可以根据需求选择最适合的技术栈,提高开发效率。
  • 独立部署:每个微应用都可以单独部署,加快发布速度,降低部署风险。
  • 增强可扩展性:微应用之间的依赖关系清晰,便于对单个功能进行扩展或优化。
  • 提高团队协作:每个团队专注于自己的业务领域,降低沟通成本,提高开发质量。

1.3 解构过程

image.png


将单体应用解构为微前端架构的过程可以分为以下几个步骤:

  1. 业务划分:首先,需要对单体应用的业务功能进行详细的划分,确定每个微应用的职责边界。
  2. 技术选型:为每个微应用选择合适的技术栈,包括前端框架、状态管理库等。
  3. 代码拆分:根据业务划分结果,将单体应用的代码拆分为多个独立的代码库。
  1. 通信机制:建立微应用之间的通信机制,如事件总线、REST API等。
  2. 集成与部署:将拆分后的微应用集成到一个主应用中,并实现独立部署。

二、案例分析

3.1 项目背景

以线教育系统系统为例,如何把他拆分成微前端

image.png


3.2 解构过程

  1. 业务划分:团队首先对业务功能进行了详细的划分,确定了商品展示、购物车、订单管理等微应用的职责边界。
  2. 技术选型:为每个微应用选择了合适的技术栈,如React、Vue等,并制定了统一的接口规范和数据格式。
  3. 代码拆分:使用代码分析工具识别代码之间的依赖关系,逐步将单体应用的代码拆分为多个独立的代码库。
  4. 通信机制:建立了基于事件总线的通信机制,实现了微应用之间的松耦合通信。
  1. 集成与部署:选择了qiankun作为微前端框架,将拆分后的微应用集成到一个主应用中,并实现了独立部署。

1. 项目分析

  • 业务功能梳理
  • 列出所有业务模块,如课程管理、用户中心、直播课堂、作业提交、考试系统、论坛交流等。
  • 分析模块间的依赖关系和数据流。
  • 技术栈分析
  • 确认当前项目使用的技术栈,如Vue3、Vite、Vue Router、Vuex等。
  • 评估技术栈在微前端架构下的兼容性和可维护性。
  • 性能与可扩展性评估
  • 分析当前系统的性能瓶颈。
  • 评估拆分后对性能和可扩展性的潜在提升。

2. 架构设计

  • 确定微前端框架
  • 选择适合的微前端框架,如qiankun、single-spa等。
  • 设计主应用(容器)与子应用(微前端)之间的交互机制。
  • 通信机制设计
  • 设计子应用之间的通信方式,如使用事件总线、自定义事件、全局状态管理库等。
  • 设计主应用与子应用之间的通信协议和API。
  • 路由管理
  • 设计统一的路由管理策略,确保子应用间的路由跳转无缝集成。
  • 考虑懒加载和代码分割以优化性能。
  • 状态管理
  • 确定子应用内部和跨应用的状态管理方案,如使用Vuex或其他状态管理库。
  • 构建与部署
  • 设计自动化的构建、测试和部署流程。
  • 考虑使用持续集成/持续部署(CI/CD)工具。

3. 技术选型

  • 前端框架:继续使用Vue3作为主要的开发框架。
  • 微前端解决方案:选择qiankun或single-spa进行微前端集成。
  • 状态管理:使用Vuex或Pinia进行状态管理。
  • 路由:使用Vue Router进行路由管理。
  • 构建工具:使用Vite或Webpack进行模块打包和构建。
  • 通信库:选择mitt或event-bus作为事件通信库。

下面是一个使用qiankun架构的主应用和子应用之间交互机制的示例:

1. 主应用配置

首先,在主应用中需要配置qiankun并注册子应用。以下是一个主应用的示例配置代码:

// main.js
import { registerMicroApps, start } from 'qiankun';

// 子应用的注册信息
const apps = [
  {
    name: 'course-app', // 子应用名称
    entry: '//localhost:8081', // 子应用的入口地址
    container: '#course-container', // 子应用挂载的容器
    activeRule: '/courses', // 激活子应用的路由规则
  },
  // ... 其他子应用配置
];

// 注册子应用
registerMicroApps(apps);

// 启动 qiankun
start();
2. 子应用开发

子应用需要导出三个生命周期钩子:bootstrapmountunmount,以供主应用在适当的时机调用。

// 子应用的入口文件
export async function bootstrap() {
  console.log('course-app bootstrapped');
}

export async function mount(props) {
  console.log('course-app mounted', props);
  // 子应用挂载后可以进行一些初始化操作
}

export async function unmount() {
  console.log('course-app unmounted');
  // 子应用卸载前可以进行一些清理操作
}

// 如果子应用需要进行状态或事件通信,可以在这里导出相应的方法或对象
export const CourseApp = {
  // ... 子应用导出的方法和对象
};
3. 子应用间通信

在qiankun中,子应用间的通信可以通过以下几种方式实现:

a. 使用props进行通信

主应用在加载子应用时,可以通过props传递数据给子应用。子应用在mount方法中可以接收这些数据。

// 主应用传递props给子应用
const apps = [
  {
    // ... 其他配置
    props: {
      user: {
        name: 'John Doe',
        id: '123',
      },
      // ... 其他数据
    },
  },
];

// 子应用接收props
export async function mount(props) {
  console.log(props.user); // 输出:{ name: 'John Doe', id: '123' }
}
b. 使用全局状态管理库

如果子应用之间需要共享状态,可以考虑使用全局状态管理库,如Redux、Vuex(如果每个子应用都是Vue应用)或Pinia等。但是,这需要在主应用中设置好状态管理库,并在子应用中正确连接。

c. 使用事件总线(Event Bus)

qiankun提供了一个简单的事件机制,允许主应用和子应用之间通过事件进行通信。

// 在主应用中触发事件
window.microAppDispatchEvent({
  type: 'event-name',
  detail: { /*...*/ },
});

// 在子应用中监听事件
window.addEventListener('event-name', (e) => {
  console.log(e.detail);
});


但更推荐的做法是使用一个专门的事件库(如mitt或tiny-emitter),在子应用之间传递事件。

d. 使用自定义事件

除了qiankun提供的事件机制外,还可以使用原生的自定义事件进行通信。

// 子应用A中触发事件
const event = new CustomEvent('customEvent', { detail: { message: 'Hello from App A' } });
window.dispatchEvent(event);

// 子应用B中监听事件
window.addEventListener('customEvent', (event) => {
  console.log(event.detail.message); // 输出:Hello from App A
});

4. 应用拆分

  • 代码拆分
  • 按照业务模块将代码拆分为独立的子项目。
  • 提取公共组件和工具库为独立包,供各子应用共享。
  • 子应用创建
  • 为每个业务模块创建独立的Vue3子应用。
  • 配置子应用的入口、路由、状态管理等。
  • 集成与测试
  • 在主应用中集成各子应用。
  • 编写集成测试用例,确保子应用之间的交互无误。
  • 进行端到端测试,验证整个系统的功能完整性。
  • 部署
  • 配置独立的部署流程,允许子应用独立发布。
  • 搭建监控系统,实时追踪各子应用的运行状态。


相关文章
|
5月前
|
前端开发 JavaScript 应用服务中间件
在Docker部署的前端应用中使用动态环境变量
以上步骤展示了如何在 Docker 配置过程中处理并注入环墨遁形成可执行操作流程,并确保最终用户能够无缝地与之交互而无须关心背后复杂性。
263 13
|
12月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
755 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
11月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
580 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
11月前
|
人工智能 前端开发 JavaScript
AI程序员:通义灵码 2.0应用VScode前端开发深度体验
AI程序员:通义灵码 2.0应用VScode前端开发深度体验,在软件开发领域,人工智能技术的融入正深刻改变着程序员的工作方式。通义灵码 2.0 作为一款先进的 AI 编程助手,与广受欢迎的代码编辑器 Visual Studio Code(VScode)相结合,为前端开发带来了全新的可能性。本文将详细分享通义灵码 2.0 在 VScode 前端开发环境中的深度使用体验。
1812 2
AI程序员:通义灵码 2.0应用VScode前端开发深度体验
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
796 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
12月前
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
576 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
12月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
697 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
12月前
|
人工智能 前端开发 JavaScript
详解智能编码在前端研发的创新应用
接下来,人与智能体的交互将变得更为紧密,比如 N 年以后是否可以逐渐过渡。这个逐渐过渡的过程实际上是温和的,从依赖人类到依赖超大规模算力的转变,可能会取代我们的一些职责。这不仅仅是简单的叠加关系。对于AI和超大规模算力,这是否意味着我们可以大幅度提升软件质量,是否可以缩短研发周期并提高效率,还有创造出更优质的软件并持续发展,这无疑是肯定的。
770 25
|
12月前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
383 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
11月前
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章