浅谈微前端

news2024/11/26 12:39:59

本文呢是我梳理的一个扫盲文,由于最近团队准备使用微前端对项目进行改造,所以我呢就先浅了解一下:
微前端到底是什么?
为什么要使用微前端?
都有哪些微前端方案?
微前端有什么不好的地方吗?
通过以上几个问题,来浅谈一下:

什么是微前端?

**概念:**微前端是指存在于浏览器中的微服务。

微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为把多个小型前端应用聚合为一体的应用。这就意味着前端应用的拆分,拆分后的应用实现应用自治、单一职责、技术栈无关三大特性,再进行基座模式或自由组合的模式进行聚合,达到微前端的目的。

image.png

自由组组织模式指的就是:系统内部子系统之间能自行按照某种规则形成一定的结构或功能。

微前端的几个基本要素: 技术栈无关、应用隔离、独立开发。

核心:拆,合

微前端的出现背景?

在前端框架、技术、概念层出不穷,且随着前端标准的演进,前端已经具备更好的性能和开发效率,但是随之而来的是应用的复杂度更高、涉及的团队规模更广、更高的性能要求,应用复杂度已经成为阻塞业务发展的重要瓶颈。

微前端就是诞生在这日益复杂化的场景中。

为什么用微前端?

为了解决团队平台系统多且相互独立,系统体量大且页面多,开发效率低、接入成本高。

当前应用痛点:

image.png

  • 项目中的组件和功能模块会越来越多,导致整个项目的打包速度变慢;
  • 因为文件夹的数量会随着功能模块的增多而增多,查找代码会变得越来越慢;
  • 如果只改动其中一个模块的情况,需要把整个项目重新打包上线;
  • 目录层级和模块层级过深而且文件又多,定位文件会越来越慢;
  • 所有的项目都只能使用同一技术框架如:react、vue等;

微前端优势:

  • 简单、松耦合的代码库

    • 微前端架构倾向于编写和维护更小、更简单、更容易开发的项目。
    • 技术栈无关,各项目可以使用不同的技术栈。
  • 增量升级

    • 支持渐进式重构,先让新旧代码和谐共存,再逐步转化旧代码,直到整个重构完成。
  • 独立部署

    • 每一个子应用都具备独立开发,持续部署,独立运行的能力。
  • 团队自治

    • 各子项目之间不存在依赖关系,保持隔离。
    • 单一职责,每个子项目只做和自己相关的业务工作。

目前前端界的微前端技术方案

1.路由分发式

通过 http 服务器的反向代理功能,来将请求路由到对应的应用上。

从A到B的时候,需要刷新页面。

适用场景:

  • 不同技术栈之间差异比较大,难以兼容、迁移、改造
  • 项目不想花费大量的时间在这个系统的改造上
  • 现有的系统在未来会被取代
  • 系统功能已经很完善,基本不会有新需求

2.iframe

iframe 最大的特性就是提供了浏览器原生的硬隔离方案,不论是样式隔离、js 隔离这类问题统统都能被完美解决。但他的最大问题也在于他的隔离性无法被突破,导致应用间上下文无法被共享,随之带来的开发体验、产品体验的问题。

  • 使用iframe 会大幅增加内存和计算资源,因为 iframe 内所承载的页面需要一个全新并且完整的文档环境,iframe 与上层应用并非同一个文档上下文导致

  • 事件无法冒泡顶层,针对整个应用统一处理时效事件冒泡不穿透到主文档树上,焦点在子应用时,事件无法传递上一个文档流

  • 跳转路径无法与上层文档同步,刷新丢失路由状态

  • iframe 内元素会被限制在文档树中,视窗宽高限制问题

  • iframe 登录态无法共享,子应用需要重新登录

  • iframe 应用加载失败,内容发生错误主应用无法感知

  • 难以计算出 iframe 作为页面一部分时的性能情况

  • 无法预加载缓存 iframe 内容

  • 事件通信繁琐且限制多

3.single-spa

类比我们的自由组织模式,Single-spa基座模式把路由管控部分从nginx搬到了我们前端,通过网页地址首先我们加载到的是基座, 子应用在基座上进行注册,每个子应用都应该有一套用来描述自己的标签,基座通过路由去匹配对应的子应用,并对子应用们进行统一管理,最后将正确的子应用内容挂在到页面上。

img

4.飞冰

飞冰是一个面向大型系统的微前端解决方案,它可以保证一个系统的操作体验基础上,实现各个微应用的独立开发和发版,通过 icestark 管理微应用的注册和渲染,正整个系统彻底解耦。(这是我们的候选之一)

https://ice.work/docs/icestark/about

5.qiankun

qiankun 是一个 single-spa 的微前端实现库,增加了 css 和 js 隔离(沙箱),预加载等特性。qiankun 的设计理念一个是简单,另一个就是解耦/技术栈无关。

https://qiankun.umijs.org/zh

区别:

飞冰:

  • git:星星数 943;
  • js 隔离:沙箱;
  • 样式隔离:使用 CSS Modules 方案管理样式;(正常尝试使用 Shadow Dom 的方案)
  • 打包相关:强制依赖 ice.js,及应用只能使用 react,打包也要使用ice.js 框架打包;
  • 更新周期:1周 ~ 一个月;

Qiankun:

  • git:星星数 7.8k;
  • js 隔离:沙箱;
  • 样式隔离:Shadow Dom;
  • 打包相关:依赖于 qiankun,官方推荐使用 parcel 打包,但是可以使用 webpack;
  • 更新周期:1天 ~ 一周;

single-spa和qiankun相较于iframe,具有更快的速度、没有JS隔离、刷新时能保持url状态和能使用浏览器的前进后退按钮的优势,体验上更好。而qiankun相较于single-spa,有易集成、css隔离、js沙箱隔离、预加载等优势,而且由蚂蚁金服的团队维护,文档可读性、维护积极性和框架可靠性都有保障。

微前端的原理

image.png

路由劫持Proxy解决的问题:

  • 应用间跳转: pushState/popState/replaceState/hashChange
  • 应用内跳转: history

加载渲染:除了挂载之外,还要关心卸载逻辑。以避免应用污染

如果我们要做只需要在主系统构造一个足够轻量的基座,然后让各子应用按照共同的协议去实现即可。这个协议可以包括,主应用应该如何加载子应用,以及子应用如何被主应用感知、调度,应用之间如何通信等。这个协议不应该包括,子应用要如何确保隔离性、安全性,也就是子应用除了实现一些较为简单的协议之外,跟开发一个正常的 spa 应用应该没有任何差别,包括不应该有 开发、构建、发布 等流程上的侵入。只要子应用实现了这几个协议,其他的东西怎么玩,我们都不需要关心或干预。

微前端存在的问题:

拆分粒度越小,便意味着架构变得复杂、维护成本高。

技术栈一旦多样话,便意味着技术栈混乱

开发体验不是很友好,开发时可能需要同时启多个项目。

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

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

相关文章

48 最佳实践-性能最佳实践-Guest-Idle-Haltpoll

文章目录 48 最佳实践-性能最佳实践-Guest-Idle-Haltpoll48.1 概述48.2 操作指导 48 最佳实践-性能最佳实践-Guest-Idle-Haltpoll 48.1 概述 为了保证公平性及降低功耗,当虚拟机vCPU空闲时,虚拟机将执行WFx/HLT指令退出到宿主机中,并触发上…

计算机视觉 - 基于黄金模板比较技术的缺陷检测

一、黄金模板比较概述 基于黄金模板比对的检测是一种常见的视觉应用。当进行缺陷检查而其他缺陷检测方法是不可行的时候,使用金模板比较。另外当物体的表面或物体的形状非常复杂时,此技术特别有用。 虽然说黄金模板比较的技术的思路很简单,但是真正落地实施确不是一件十分容…

广告数仓:数仓搭建(二)

系列文章目录 广告数仓:采集通道创建 广告数仓:数仓搭建 广告数仓:数仓搭建(二) 文章目录 系列文章目录前言DWD层创建1.建表广告事件事实表 2.数据装载初步解析日志解析IP和UA标注无效流量编写脚本 总结 前言 这次我们完成数仓剩下的内容 D…

Web服务器群集:Web基础与HTTP协议

目录 一、理论 1.Web基础 2.HTTP协议 二、实验 1.浏览本地HTML页面 三、总结 一、理论 1.Web基础 (1)域名和DNS ① 域名 网络是基于TCP/IP 协议进行通信和连接的,每一台主机都有一个唯一的标识(固定的IP地 址&#xff0…

【Java面试】什么是SpringMVC?它的工作流程是什么样子的?

文章目录 什么是MVC?MVC组件组件前端控制器DispatcherServlet处理器映射器HandlerMapping处理器适配器HandlAdapter视图解析器ViewResolver处理器Handler视图View 工作原理具体执行流程 什么是MVC? M:model,模型层,包…

搅拌机打蒜机不转维修

打蒜机不转维修:打蒜机用的18650电池,霍尔传感器,Dp0206场效应管。故障为按一下开关显示红灯:电池电压低!按下启动按钮电机动一下就再不动了。如果给电池两边加一个5伏电源,打蒜机电机运行正常。那么我把充…

【028】C++ 类和对象的 构造函数、析构函数、拷贝构造、初始化列表 详解(最全讲解)

C类和对象的构造函数、析构函数、拷贝构造、初始化列表详解 引言一、构造函数1.1、数据初始化和清理1.2、构造函数概述1.3、构造函数的定义1.4、提供构造函数的影响 二、析构函数三、拷贝构造函数3.1、拷贝构造的定义3.2、拷贝构造、无参构造、有参构造 三者的关系3.3、拷贝构造…

【群智能算法改进】一种改进的浣熊优化算法 改进长鼻浣熊优化算法 改进后的ICOA[1]算法【Matlab代码#41】

文章目录 【获取资源请见文章第5节:资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 改进后的ICOA算法2.1 Circle映射种群初始化2.2 Levy飞行策略2.3 透镜成像折射反向学习策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1…

05-DataFrame的数据清洗

数据清洗 import pandas as pd df pd.read_excel("学生成绩.xlsx") df删除重复列 df.drop_duplicates(inplaceTrue) df删除数学成绩 df.drop([数学成绩],axis1, inplaceTrue) df重命名列名字 df.rename(columns{"生活":"自然"},inplaceTrue…

什么是Redis的BigKey,如何处理BigKey?

一、什么是BigKey BigKey通常以Key的大小和Key中成员的数量来综合判定,例如: Key本身的数据量过大:一个String类型的Key,它的值为5 MB。Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个。Ke…

Linux之多线程(下)——线程控制

文章目录 前言一、POSIX线程库1.概念2.pthread线程库是应用层的原生线程库3.错误的检查 二、线程控制1.创建线程——pthread_createpthread_create函数例子创建一个新线程主线程创建一批新线程 2.获取线程ID——pthread_self3.线程等待——pthread_join4.线程终止——return、p…

SSH服务器详解

文章目录 文字接口连接服务器:SSH服务器连接加密技术简介启动SSH服务SSH客户端连接程序SSH:直接登录远程主机的指令使用案例 服务器公钥记录文件:~/.ssh/known_hosts报错解决 模拟FTP的文件传输方式:SFTP使用案例 文件异地直接复制…

Python主要应用的10大领域你是否感兴趣

原文: Python主要应用的10大领域你是否感兴趣 Python 是一门快速发展的编程语言,其在各个领域的应用也在不断增加。根据 TIOBE 编程语言排行榜,Python 在 2021 年排名第 3,仅次于 Java 和 C。根据 Stack Overflow 的开发者调查报…

圆的基本性质

如何确定一个圆? 两个点: 无法确定一个圆,因为只要到这两个点距离相等的点都可以作为圆心(在两个点连线的垂直平分线上),因此可以确定无数个圆 三个点(且这三个点不能在同一个直线上&#xf…

【MySQL数据库】事务

事务 一、事务1.1事务的概念 二 、事务的ACID特点2.1原子性2.2一致性(Consistency)2.3隔离性2.4持久性 三、脏读、不可重复读、幻读、丢失更新3.1脏读3.2不可重复读3.3幻读3.4丢失更新 四、事务的隔离级别 一、事务 1.1事务的概念 事务是一种机制、一个…

二叉堆(大顶堆、小顶堆)学习(使用java手写)

二叉堆 我们现在有一个需求,用来存放整数,要求需要提供三个接口 添加元素获取最大值删除最大值 我们可以用我们熟悉的数据结构去解决这些问题 获取最大值删除最大值添加元素描述动态数组/双向链表O(n)O(n)O(1)O(n) 复杂度太高了(有序&#x…

redis -- 持久化存储方案

前言 一般情况下,我们存储到redis的数据,是存储到内存中,再存储到硬盘中(这是基于reb方案来实现)因此一旦强制关机,就直接over了。 硬存和内存的区别和联系: 我们用文本编辑器,里面写入一段话,未保存&am…

检测PPG信号的心跳

基于大佬的代码。 PPG信号靠心率 (HR) 进行估计,主要取决于收缩压峰值检测的准确性。与 ECG 不同,PPG 信号形式简单和特定点 少。低振幅 PPG 信号更容易受到噪声污染和其他不良影响的影响,例如baseline drift和wandering。这是由于信号强度与…

从零开始理解Linux中断架构(3)--Armv8体系架构

首先让我们带着问题进入到armv8架构的学习中。linux中断代码分为两部分entry.S @arch\arm64\kernel\entry.S汇编部分和C代码后续处理。汇编代码中处理最为低级的部分,设置硬件中断向量表,保持当前上下文,切换中断堆栈等任务,这是就如我们嵌入式系统看到那样。 @arch\arm64…

Vue3中div自由拖拽宽度和高度。

Vue3中我们会遇到自由拖拽宽度和高度的页面需求,查看很多方法都无法满足当前需求。下面是我们Vue3版本的代码,非常简单主要构想说粗发拖拽方法,把所需要的div的高宽进行拖拽位置进行监听来加减自身div的px值。直接复制粘贴就可以实现效果。根…