技术实践—微前端技术应用

news2024/12/23 16:37:59

微前端是一种新兴的前端架构模式,是一种类似于微服务的架构,将微服务的理念应用于浏览器端。其核心理念是将一个大而单一的前端应用拆分为多个小型独立的微应用。这些微应用各自独立,可以由不同团队开发维护,部署,组合这些微应用,行成一个聚合应用。

微前端不是一门具体的技术,而是整合了技术、策略和方法,可能会以脚手架、辅助插件和规范约束这种生态圈形式展示出来,是一种宏观上的架构。

微前端技术方案

微前端主要分两种架构模式

  1. 基座模式

通过一个主应用,来管理其它应用。设计难度小,方便实践,但是通用度低。

  1. 自组织模式

应用之间是平等的,不存在相互管理的模式。设计难度大,不方便实施,但是通用度高

微前端技术方案对比:

方案

开发成本

维护成本

实现难度

缺点

路由分发

配置较多,性能较差

iframe

1、无法保持路由状态,刷新后路由状态就丢失

2、完全的隔离导致与子应用的交互变得极其困难

3、iframe 中的弹窗无法突破其本身,无法应用到整个大应用中,只能在对应的窗口内展示

4、由于可能应用间不是在相同的域内,主应用的 cookie 要透传到根域名都不同的子应用中才能实现免登录效果。

5、每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程,占用大量资源的同时也在极大的消耗资源,有严重的性能问题

single-spa

共享及隔离粒度不统一

web-components

需要一定的学习成本和使用成本,对兼容性有要求的项目无法使用

Module-Federation

多个项目组合,需要考虑组合情况

微前端技术框架对比:

技术框架

优点

缺点

qiankun(基座模式)(阿里)

1、HTML Entry接入方式

2、资源预加载

3、沙箱隔离

4、技术栈无关

5、业界应用较多的方案,导入导出有手动加载的实践,其他产品线也有应用

1、子应用和子应用的数据共享需要主应用做转发

2、共用组件方法困难

3、css隔离方案并不完美,子应用会影响主应用的样式

EMP(去中心模式)

1、去中心化,基站应用只用来共享组件,业务应用可以随意组合,可跨技术栈调用

2、应用间直接通信

3、可直接暴露需要共享的模块

4、按需加载,不用加载完整项目

5、资源复用,减少编译体积

1、业界应用没有qiankun广,技术较新

2、无法适配旧框架

3、单页微前端应用解决方案

4、没有使用过,有更多的学习成本

micro-app(基座模式)(京东)

1、支持静态资源地址补全

2、支持元素隔离

3、支持插件系统

4、轻量化,侵入性低,改造简单

1、业界应用没有qiankun广,技术较新

2、子应用和子应用的数据共享需要主应用做转发

3、共用组件方法困难

背景及问题分析

OceanMind海睿思数据中台产品采用松耦合架构,基于海睿思数据计算基础平台(PaaS)提供数据集成、数据处理分析、数据治理、元数据管理、数据管理等多个产品功能模块,支持用户根据自身需求组合搭配、逐步演进。

然而,随着产品不断的迭代开发,页面数量越来越多,形成了一个上百个页面的巨型单体应用,因此带来以下问题:

  1. 文件和依赖过多,造成本地开发和打包部署的性能问题;
  2. 应用数量多、耦合性强,造成维护成本高,往往出现改一处而动全身的问题;
  3. 当部分内容功能在面临技术升级和重构诉求时,面临改一处而动全身的问题。

为了解决这些问题,需要对项目进行拆分、渐进式的重构、同时兼容老项目。此时微前端架构符合我们的诉求。

改造方案

OceanMind分为元数据管理,数据集成,数据处理分析,站内信,运维管理等多个模块,这些模块最初都是在一个项目工程下,技术栈统一,交互十分相似。在要求复用已经开发好的组件的前提下,我们基于Module-Federation核心技术,采用emp框架,依托于导航页进行页面模块划分,逐步完成微前端改造计划。

每个具体的子应用都包含公共侧边栏,公共头部,统一的拦截逻辑,和请求逻辑。

首先拆分出公共组件项目,用来开发公共功能,如统一拦截,统一方法,必备依赖,公共通用的交互组件,公共样式,权限管理等,通过empShare配置导出,引用项目时,正确引用remotes配置,按照正常组件方式引用,也可通过在路由配置地址,当做页面使用。

按照不同的业务模块,进行业务微前端项目拆分,模块仅保留原业务相关逻辑,用户信息等通用能力移交给公共项目组件去实现,业务微前端项目无需考虑。对于状态存储,每个业务模块将自己的store注册到公共项目的store中,做为一个模块。这样整个OceanMind只有一个唯一顶层store,方便业务模块使用公用信息。

为方便本地开发,将所有微前端项目放在同一目录,在同级增加node脚本,便于一键启动多个微前端项目及本地打包构建。

改造中遇到的问题及解决方案:

  1. 原OceanMind为vue-cli创建,改为emp后,webpack版本变更为5,部分依赖需要进行升级兼容,部分代码写法要进行改变。
  2. 业务应用在store中使用持久化插件时需要注意,需要自定义名称,否则会造成持久化信息被覆盖问题。
  3. 启动项目有些警告信息,是由于新版babel增加提示造成的,无需考虑。
  4. 样式污染问题,通过规范样式,增加scoped解决。

价值

在微前端改造过程中,团队成员对整体代码更加熟悉,业务代码更专注于业务层面的开发,无需再考虑通用性能力;

需求增加或修改时,对代码的侵入程度更小了,提高了迭代稳定性和开发效率,可实现按需按模块发布;

加速构建速度,拆分后只需专注影响模块,不需要考虑其他模块,打包和本地开发速度大幅提升

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

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

相关文章

docker发布镜像到自己远程私有仓库

1、登录docker hub创建自己的仓库地址:https://hub.docker.com/repository/create 输入仓库名称 2.构建镜像 略过。。。。请自己查找别的资料,此篇文章只讲述镜像推送到远程 3.推送 假设你已经构建了一个镜像 web/online-editor:latest,现…

【React学习打卡第二天】

受控表单绑定、React获取Dom\组件通信、useEffect、自定义hook函数和ReactHooks使用规则 一、受控表单绑定1.准备React状态值2.通过value属性绑定状态,通过onChange属性绑定状态同步的函数 二、React中获取DOM1. 使用useRef创建 ref 对象,并与 JSX 绑定2…

使用图数据库Nebula Graph快速上手史上最大规模的中文知识图谱ownthink_v2教程(没写完,明天再写)

一、前言 本教程主要参考官方教程:使用图数据库 Nebula Graph 数据导入快速体验知识图谱 OwnThink (nebula-graph.com.cn) 来带着大家一步一步复现实验内容。 本教程主要使用到的数据集: ownthink/KnowledgeGraphData: 史上最大规模1.4亿中文知识图谱…

MySQL 存储

关系型数据库是基于关系模型的数据库, 而关系模型是通过二维表来保存的,所以关系型数据库中的数据的村方式就是行列组成的表,每一列代表一个字段,每一行代表一条记录。表可以看作某个实体的集合,实体之间存在的联系需要…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十三章 设备树下的platform驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

基于开源大模型的问答系统本地部署实战教程

1. 现有大模型产品使用感受 在开始教你搭建属于自己的本地大模型之前,先说下自己日常使用大模型的感受。常用的比较好的国外大模型工具,经常会遇到网络卡或者token数量、使用次数限制的问题。而国内的大模型工具虽然不存在网络的问题,但…

简单几步,教你使用scikit-learn做分类和回归预测

经常听到初学python的小伙伴在抱怨,python安装第三方库太慢,很容易失败报错,如果安装pandas、tensorflow这种体积大的库,简直龟速。 为什么pip会很慢? 先来了解下pip,pip是一个非常流行的python包管理工具…

基于微信小程序+SpringBoot+Vue的资料分享系统(带1w+文档)

基于微信小程序SpringBootVue的资料分享系统(带1w文档) 基于微信小程序SpringBootVue的资料分享系统(带1w文档) 校园资料分享微信小程序可以实现论坛管理,教师管理,公告信息管理,文件信息管理,文件收藏管理等功能。该系统采用了Sp…

初识C++ · AVL树(2)

目录 前言: 1 左右旋 2 右左旋 3 部分细节补充 3.1 单旋和插入 3.2 部分小函数 前言: AVL树作为一种结构,理解树的本身是不大难的,难的在于,树旋转之后的连接问题,写AVL树的代码大部分都是在旋转部分…

在jeesite开源平台上写了一个SQL命令中心的功能

实现目的: 这个SQL命令中心,是因为老项目就有这个页面,主要的功能是根据写出的SQL语句查询数据,并且在查出的数据基础上直接修改更新,还有新增和删除的功能,这么一说跟plsql就一样一样的了;这页面本来是给运维的同事来用,而且他们还会用plsql和Navicat等SQL语言操作工…

[OJ]平均串问题,存在超时问题未解决

众所周知,两个数a和b的平均数计算公式为(ab)/2。 实际上平均数也可以描述为:从较小的数依次遍历到较大的数,将遍历的数放入一个列表中,该列表的中心元素。例如:求 3和7的平均数,列表为{3,4,5,6,7}&#xff…

FPGA与ASIC:深入解析芯片设计的双子星

前言 在半导体世界里,FPGA(Field-Programmable Gate Array,现场可编程门阵列)与ASIC(Application-Specific Integrated Circuit,专用集成电路)是两种截然不同的芯片设计策略,各自在…

短视频矩阵系统,一键智能成片

在信息爆炸的时代,短视频以其短平快的特点迅速崛起,成为人们获取信息、娱乐消遣的重要渠道。然而,如何在这个竞争激烈的领域中脱颖而出,制作出吸引眼球的爆款视频呢?今天,我们就来揭秘一款神奇的短视频矩阵…

76.WEB渗透测试-信息收集- WAF、框架组件识别(16)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:75.WEB渗透测试-信息收集- WAF、框架组件识别(15) Php的Laraverl…

C语言 之 理解指针(4)

文章目录 1. 字符指针变量2. 数组指针变量2.1 对数组指针变量的理解2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用 5. 函数指针数组 1. 字符指针变量 我们在前面使用的主要是整形指针变量,现在要学…

php--高级反序列化

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

21 Python常用内置函数——zip()

zip() 函数用来把多个可迭代对象中的元素压缩到一起,返回一个可迭代的 zip 对象,其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组,最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个。 可以这样理解这个函…

学习笔记(数据结构:队列)4

qt加库 队列: 队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。 允许插入的称谓队尾,允许删除的一端队头。 顺序队列。 循环队列, 常用操作,入队,出队。 先进先出,FIFO 用&#x…

安装nfs和rpcbind设置linux服务器共享磁盘

1、安装nfs和rpcbind 1.1 检查服务器是否安装nfs和rpcbind,执行下命令,检查服务器是否安装过。 rpm -qa|grep nfs rpm -qa|grep rpcbind 说明服务器以安装了,如果没有就需要自己安装 2、安装nfs和rpcbind 将rpm安装包: libtirpc-…

【kubernetes】认识K8S基础理论

目录 1.背景 2.虚拟机、物理机与容器 3.K8S 基本概念 3.1 K8S 的特点 4.Kubernetes 集群架构与组件 4.1 核心组件 4.1.1 Master组件 4.1.2 配置存储中心 4.1.3 Node 组件 5.Kubernetes 核心概念 6.总结 1.背景 服务器经历了三次演变过程:物理机、虚拟机…