微前端架构及其解决方案对比

news2024/10/22 2:42:16

微前端架构及其解决方案对比

微前端架构是一种通过将大型前端应用拆分为多个独立的、可单独部署的小型应用的设计模式。随着这种模式的流行,诞生了多种微前端实现方案,每个方案都有其独特的特点和适用场景。以下是常见的微前端解决方案及其优缺点对比,并提供了每个方案的官方网址,方便参考。

1. iframe

iframe 是一种最早期的微前端实现方式,它允许在主应用中嵌入独立的子应用,并通过 iframe 标签加载不同的 URL。

优点:
  • 简单易用:无需对子应用进行额外改造,直接嵌入即可。

  • 技术栈无关:子应用可以使用任意前端技术,互相完全独立。

  • 隔离性强iframe 自带样式和 JavaScript 隔离。

缺点:
  • 用户体验差iframe 切换有明显的闪屏现象,加载性能较差。

  • 跨域通信复杂:主应用和子应用之间的数据共享困难,需处理跨域问题。

  • SEO 不友好iframe 内容无法被搜索引擎有效抓取。

适用场景:
  • 子应用之间完全独立、不需要频繁交互的场景。

官方网址:
  • HTML Iframe Documentation


2. 基于路由的微前端

通过前端路由切换,将不同的子应用嵌入到主应用的路由体系中,主应用负责全局布局和路由管理,子应用通过路由按需加载。

优点:
  • 用户体验良好:路由切换流畅,与传统单页应用相似。

  • 技术栈灵活:支持不同技术栈的子应用,如 Vue、React 等。

  • 资源按需加载:可根据路由动态加载子应用,减少初次加载时间。

缺点:
  • 依赖管理困难:主应用和子应用的全局依赖管理需要手动处理,可能产生版本冲突。

  • 样式冲突:子应用的样式可能影响主应用或其他子应用,需自行处理样式隔离。

  • 状态共享困难:应用间状态共享和通信较复杂。

适用场景:
  • 需要子应用间保持一定交互和状态同步的项目,适用于多个页面的应用集成。

官方网址:
  • Vue Router

  • React Router


3. Webpack 5 Module Federation

Webpack 5 引入的 Module Federation 特性,允许多个应用共享模块,子应用可以在不重新构建的情况下被主应用加载和使用。

优点:
  • 模块共享:可以复用多个应用间的相同模块,避免重复加载资源,优化性能。

  • 独立构建与部署:子应用可以单独构建、独立部署,但仍能与主应用动态协作。

  • 灵活的动态加载:通过 Webpack 的动态模块加载,按需引入远程模块。

缺点:
  • 配置复杂:Module Federation 的配置较为复杂,尤其是涉及共享依赖和模块冲突时。

  • 技术栈要求:必须使用 Webpack 5,限制了技术栈的选择。

  • 样式冲突:子应用样式需要额外处理以防止全局样式污染。

适用场景:
  • 适用于多个子应用间存在大量共享模块和依赖的大型项目。

官方网址:
  • Webpack Module Federation


4. Single-SPA

Single-SPA 是一个用于构建微前端的框架,它允许多个前端框架应用(如 Vue、React、Angular)同时工作在同一个页面上。

优点:
  • 技术栈独立:每个子应用可以使用不同的框架,技术栈灵活。

  • 共享依赖:提供依赖共享机制,避免多个应用加载相同的依赖包。

  • 生态完善:丰富的社区插件和工具,支持复杂的微前端架构需求。

缺点:
  • 学习曲线陡峭:Single-SPA 的概念和配置较为复杂,需要专门学习。

  • 性能问题:同时加载多个子应用时,性能可能受影响,需手动优化。

  • 开发复杂度高:管理多个框架和应用时,开发难度较大。

适用场景:
  • 适合多团队协作,且项目中需要多技术栈共存的复杂微前端场景。

官方网址:
  • Single-SPA


5. Qiankun

Qiankun 是基于 Single-SPA 实现的微前端解决方案,提供了更加简单的 API 和丰富的功能,尤其适合 Vue 和 React 等流行前端框架。

优点:
  • 开箱即用:简化了 Single-SPA 的复杂配置,提供了更易用的 API。

  • 技术栈独立:支持多种技术栈应用,无论是 Vue、React 还是 Angular,都可以无缝集成。

  • 状态共享与样式隔离:内置了沙箱机制,解决了微前端中常见的样式冲突和状态共享问题。

缺点:
  • 性能瓶颈:虽然有较好的性能优化,但多个子应用同时加载时,依然可能出现性能问题。

  • 依赖冲突:不同子应用使用不同版本的依赖库时,可能会导致冲突。

  • 特定场景局限性:在某些复杂的业务场景下,可能无法完全满足定制化需求。

适用场景:
  • 特别适合中大型企业级项目,尤其是 Vue 和 React 技术栈的场景。

官方网址:
  • Qiankun


6. Garfish

Garfish 是字节跳动推出的一款微前端框架,专注于轻量级和高性能的微前端解决方案。

优点:
  • 零配置:无需复杂的配置即可使用,适合快速开发。

  • 轻量高效:性能优越,适合对速度有要求的项目。

  • 技术栈无关:支持多种前端框架,灵活性高。

缺点:
  • 社区支持有限:相对于其他成熟的微前端方案,Garfish 的社区支持和文档相对较少。

  • 定制化能力有限:在一些复杂场景下可能需要额外的开发工作。

适用场景:
  • 适合需要快速开发和集成的中小型项目,尤其是对性能要求高的场景。

官方网址:
  • Garfish


7. EMP (Esm Module Federation)

EMP 是基于 Webpack 5 Module Federation 特性进行二次封装,特别优化了对 ESM(ECMAScript Modules)的支持,进一步提升了微前端应用的性能和灵活性。

优点:
  • ESM 模块支持:完全支持 ESM 模块系统,减少模块解析开销,提高加载效率。

  • 简化配置:相比 Webpack 5 原生的 Module Federation,EMP 对其进行了封装,使配置更加简便。

  • 按需加载:可以动态按需加载模块,提升性能。

缺点:
  • 学习曲线:虽然配置简化,但依然需要掌握 Module Federation 的核心概念。

  • 技术栈限制:需要使用 Webpack 5,且子应用需支持 ESM 模块。

  • 社区支持较少:与其他微前端方案相比,EMP 的社区支持较为有限。

适用场景:
  • 当项目需要大量模块共享和资源复用,且对性能优化要求较高时。

官方网址:
  • EMP 官方文档


8. 无界

无界是腾讯提出的一种微前端解决方案,专注于解决跨团队协作和独立开发问题。无界提供了独立子应用开发、部署和集成的方式,允许多个团队并行开发。

优点:
  • 技术栈无关:不同子应用可以使用任意前端技术栈,灵活性高。

  • 团队独立开发:每个团队可以独立开发和部署自己的子应用,减少团队间耦合。

  • 隔离机制

:提供了样式和状态的隔离机制,避免了不同子应用间的相互影响。

缺点:
  • 学习曲线:对于新加入的团队成员,可能需要一定的学习时间来熟悉框架。

  • 性能管理:在性能管理上可能需要额外的优化。

适用场景:
  • 适合大型项目,尤其是需要多个团队并行开发的情况。

官方网址:
  • 无界


微前端解决方案总结表格

方案优点缺点适用场景官方网址
iframe- 简单易用
- 技术栈无关
- 隔离性强
- 用户体验差
- 跨域通信复杂
- SEO 不友好
- 子应用之间完全独立且不需频繁交互的场景HTML Iframe Documentation
基于路由的微前端- 用户体验良好
- 技术栈灵活
- 资源按需加载
- 依赖管理困难
- 样式冲突
- 状态共享困难
- 需要子应用间保持一定交互和状态同步的项目Vue Router
React Router
Webpack 5 Module Federation- 模块共享
- 独立构建与部署
- 灵活的动态加载
- 配置复杂
- 技术栈要求
- 样式冲突
- 适用于多个子应用间存在大量共享模块和依赖的大型项目Webpack Module Federation
Single-SPA- 技术栈独立
- 共享依赖
- 生态完善
- 学习曲线陡峭
- 性能问题
- 开发复杂度高
- 多团队协作,且项目中需要多技术栈共存的复杂微前端场景Single-SPA
Qiankun- 开箱即用
- 技术栈独立
- 状态共享与样式隔离
- 性能瓶颈
- 依赖冲突
- 特定场景局限性
- 特别适合中大型企业级项目,尤其是 Vue 和 React 技术栈的场景Qiankun
Garfish- 零配置
- 轻量高效
- 技术栈无关
- 社区支持有限
- 定制化能力有限
- 适合需要快速开发和集成的中小型项目,尤其是对性能要求高的场景Garfish
EMP (Esm Module Federation)- ESM 模块支持
- 简化配置
- 按需加载
- 学习曲线
- 技术栈限制
- 社区支持较少
- 需要大量模块共享和资源复用,且对性能优化要求较高时EMP 官方文档
无界- 技术栈无关
- 团队独立开发
- 完整生态
- 学习曲线
- 性能管理
- 适合大型项目,尤其是需要多个团队并行开发的情况无界

总结

微前端架构为现代前端开发带来了新的可能性,帮助团队更高效地应对复杂的开发挑战。在实际应用中,合理选择和灵活运用各种解决方案,将是推动项目成功的关键。通过这个表格,团队可以更清晰地对比不同的微前端解决方案,选择最适合自身需求的架构方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2219651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qml-Item的Id生效范围

Qml-Item的Id生效范围 前置声明 本实例在Qt6.5版本中做的验证同一个qml文件中,id是唯一的,即不同有两个相同id 的Item;当前qml文件中声明的id在当前文件中有效(即如果其它组件中传入的id,与当前qml文件中id 相同,当前…

基于curl和wget命令编写的多文件或大文件批量上传下载

最近需要在windows和服务器linux系统之间传递大量的文件,部分文件非常大(TB以上),并且文件夹中包含文件或文件夹,需要先进行上传再进行组织,因此就想办法结合curl和wget命令编写了命令或脚本工具&#xff0…

三菱PLC伺服-停止位置不正确故障排查

停止位置不正确时,请确认以下项目。 1)请确认伺服放大器(驱动单元)的电子齿轮的设定是否正确。 2)请确认原点位置是否偏移。 1、设计近点信号(DOG)时,请考虑有足够为0N的时间能充分减速到爬行速度。该指令在DOG的前端开始减速到爬行速度&…

【云从】六、云存储

文章目录 1、应用架构2、存储设备3、存储方案3.1 直连式存储DAS3.2 网络连接存储NAS3.3 存储区域网络SAN3.4 分布式存储ServerSAN3.5 软件定义存储SDS 4、云存储4.1 云硬盘CBS4.2 文件存储CFS4.3 对象存储COS 1、应用架构 2、存储设备 硬盘性能对比: 硬盘接口对比&…

C语言(函数)—函数栈帧的创建和销毁

目录 前言 补充知识 一、函数线帧是什么? 二、函数线帧的实现(举例说明) 两数之和代码 ​编辑两数之和 汇编代码分析 执行第一条语句 执行第二条语句 执行第三条语句 执行第四、五、六条语句 执行第七条语句 执行第八、九、十条语句 执行第十…

Scroll 生态首个 meme 项目 $Baggor,我们可以有哪些期待?

在最近几个月里,加密市场整体表现平稳,无论是比特币还是山寨币板块,都处于震荡状态,并未显示出突破前高的迹象。然而,在这样的市场背景下,meme币却持续扛起了大旗,令这个看似不太熊的熊市不断引…

递归算法笔记

根据b站视频整理的 **视频地址:**https://www.bilibili.com/video/BV1S24y1p7iH/?spm_id_from333.788.videopod.sections&vd_source6335ddc7b30e1f4510569db5f2506f20 最常见的一个递归例子: 斐波那契数列:1,2,3…

Linux 使用xtrabackup备份MySQL数据

目录 一:xtrabackup 介绍二:实现数据备份1. 实现全备份2. 实现增量备份3. 实现差异备份4. 全备份时压缩数据5. 全备份时排除指定表不备份6. 全备份时排除指定库不备份 三:实现数据还原1. 全备份数据恢复流程2. 全备份压缩后的数据恢复流程3. …

神仙公司名单(长沙)

神仙公司(长沙) 小周末,继续 神仙公司系列。 长沙,湖南省的省会城市,不仅以其深厚的历史文化底蕴著称,同时也是一个充满活力的现代都市。 长沙的经济活力、教育资源、医疗资源、就业机会、居住环境、生活成…

python中堆的用法

Python 堆(Headp) Python中堆是一种基于二叉树存储的数据结构。 主要应用场景: 对一个序列数据的操作基于排序的操作场景,例如序列数据基于最大值最小值进行的操作。 堆的数据结构: Python 中堆是一颗平衡二叉树&am…

15分钟学Go 第2天:安装Go环境

第2天:安装Go环境 1. 引言 在学习Go语言之前,首先需要配置好本地开发环境。本节将详细介绍如何在Windows 11上安装和配置Go语言环境,包括安装步骤、环境变量设置、VS Code配置与测试、以及常见问题解决方案。完成这些步骤后,你将…

Excel:vba实现筛选出有批注的单元格

实现的效果:代码: Sub test() Dim cell As RangeRange("F3:I10000").ClearlastRow Cells(Rows.Count, "f").End(xlUp).Row MsgBox lastrow For Each cell In Range("a1:a21")If Not cell.Comment Is Nothing ThenMsgBox…

【AIGC】2024-arXiv-InstantStyle:文本到图像生成中保持风格的免费午餐

2024-arXiv-InstantStyle: Free Lunch towards Style-Preserving in Text-to-Image Generation InstantStyle:文本到图像生成中保持风格的免费午餐摘要1. 引言2. 相关工作2.1 文本到图像的传播模型2.2 风格化图像生成2.3 扩散模型中的注意力控制 3. 方法3.1 动机3.2…

keil中编译遇到错误“error #94-D the size of an array must be greater than zero”解决方法

这一期,我们来看一个在keil中编译时候遇到定义数组元素个数为0时候遇到的一个错误。 错误: 先看错误:编译提示错误“error: #94-D: the size of an array must be greater than zero” ,意思是这个数组内元素个数不能定义为0个&…

【AIGC】解锁高效GPTs:ChatGPT-Builder中系统提示词Prompt的设计与应用

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯系统提示词系统提示词的作用与重要性系统提示词在构建GPTs中的作用结论 💯ChatGPT-Builder系统提示词的详细解读OpenAI为Builder编写的系统提示词系统提示词对…

R语言详解predict函数

R语言中predict函数在建立模型&#xff0c;研究关系时常用。但是不同type得到的结果常常被混为一谈&#xff0c;接下来&#xff0c;探讨predict得到的不同结果。 #数据 set.seed(123) n<-1000 age<-rnorm(n,mean50,sd10) gender<-rbinom(n,1,0.5) disease<-rbinom…

OpenCV高级图形用户界面(12)用于更改指定窗口的大小函数resizeWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::resizeWindow() 函数用于更改指定窗口的大小。这使得你可以根据需要调整窗口的宽度和高度。 注释 指定的窗口大小是指图像区域的大小。工具栏…

Maxwell 底层原理 详解

Maxwell 是一个 MySQL 数据库的增量数据捕获&#xff08;CDC, Change Data Capture&#xff09;工具&#xff0c;它通过读取 MySQL 的 binlog&#xff08;Binary Log&#xff09;来捕获数据变化&#xff0c;并将这些变化实时地发送到如 Kafka、Kinesis、RabbitMQ 或其他输出端。…

字节跳动青训营——入营考核解答(持续更新中~~~)

考核内容&#xff1a; 在指定的题库中自主选择不少于 15 道算法题并完成解题&#xff0c;其中题目难度分配如下&#xff1a; 简单题不少于 10 道中等题不少于 4 道困难题不少于 1 道 解答代码 20. 百分位数&#xff08;中等&#xff09; 代码实现&#xff1a; import jav…

Uiautomator2与weditor配置一直报错咋办

作者在配置这两个的时候绞尽脑汁了&#xff0c;u2的init总是报错并且无法自动在手机上安装atx&#xff0c;weditor可以打开但是只要对元素操作或者任意操作就会让你去重新init&#xff0c;搞得作者焦头烂额&#xff0c;而且网上各种各样的报错信息眼花缭乱&#xff0c;作者几乎…