微前端总结

news2024/12/26 22:48:29

微前端概述

微前端概念是从微服务概念扩展而来的,摒弃大型单体方式,将前端整体分解为小而简单的块,这些块可以独立开发、测试和部署,同时仍然聚合为一个产品出现在客户面前。可以理解微前端是一种将多个可独立交付的小型前端应用聚合为一个整体的架构风格。

微前端不是一门具体的技术,而是整合了技术、策略和方法,可能会以脚手架、辅助插件和规范约束这种生态圈形式展示出来,是一种宏观上的架构。这种架构目前有多种方案,都有利弊之处,但只要适用当前业务场景的就是好方案。

常用微前端方案:

  1. iframe
  2. single-spa
  3. qiankun 基于 single-spa 方案实现, 更强大更易上手
  4. webpack5 ModuleFederationPlugin(EMP)
  5. microApp
  6. wujie-micro

single-spa太过于基础,对原有项目的改造过多,成本太高; iframe在所有微前端方案中是最稳定的、上手难度最低的,但它有一些无法解决的问题,例如性能低、通信复杂、双滚动条、弹窗无法全局覆盖,它的成长性不高,只适合简单的页面渲染。剩下的只有qiankun、microApp和wujie-micro了。

 

qiankun

乾坤微前端架构则进一步对single-spa方案进行完善,主要的完善点:

  • 子应用资源由 js 列表修改进为一个url,大大减轻注册子应用的复杂度
  • 实现应用隔离,完成js隔离方案 (window工厂) 和css隔离方案 (类vue的scoped)
  • 增加资源预加载能力,预先子应用html、js、css资源缓存下来,加快子应用的打开速度

总结一下方案的优缺点:

优点

  • 监听路由自动的加载、卸载当前路由对应的子应用
  • 完备的沙箱方案,js沙箱做了SnapshotSandbox、LegacySandbox、ProxySandbox三套渐进增强方案,css沙箱做了两套strictStyleIsolation、experimentalStyleIsolation两套适用不同场景的方案
  • 路由保持,浏览器刷新、前进、后退,都可以作用到子应用
  • 应用间通信简单,全局注入

缺点

  • 基于路由匹配,无法同时激活多个子应用,也不支持子应用保活
  • 改造成本较大,从 webpack、代码、路由等等都要做一系列的适配
  • css 沙箱无法绝对的隔离,js 沙箱在某些场景下执行性能下降严重
  • 无法支持 vite 等 ESM 脚本运行

成本上:

  • 接入成本:子应用需要接入生命周期代码;主应用需要接入注册微应用代码;
  • 改造成本:需要自己考虑微前端工程化问题,以及微前端平台运维。

风险上:

  • 社区活跃度:github star 数量 13.4k (统计时间2022-10-09)
  • 文档齐全,demo多

micro-app

京东1年前出品,官网地址:https://micro-zoe.github.io/micro-app/

功能上:

  • 抛弃了路由劫持的思路,选用类web component的方案
  • 基于CustomElement和样式隔离、js隔离来实现微应用的加载,所以子应用无需改动就可以接入
  • 支持应用隔离
  • 通过劫持底层接口实现了元素隔离
  • 提供了插件系统
  • 支持预加载
  • 没有考虑工程化问题:如公用依赖,组件复用
  • 没有考虑到微前端平台运维
  • 不支持vite3

成本:

  • 接入成本:子应用无需改动,主应用需要接入微应用代码
  • 改造成本:需要自己考虑微前端工程化问题,以及微前端平台运维。

风险:

  • 这个框架基于CustomElement和Proxy api,前者针对低版本有polyfill,但后者没有,且目前官方文档说没有做兼容的计划
  • 社区活跃度 star 3.5k(统计时间2022-10-09)
  • 文档齐全

wujie

腾讯今年7月份出品,官网地址:https://wujie-micro.github.io/doc/guide/start.html。

功能上:

  • 支持vite
  • 多应用同时激活在线
  • 框架具备同时激活多应用,并保持这些应用路由同步的能力
  • 组件式的使用方式
  • 无需注册,更无需路由适配,在组件内使用,跟随组件装载、卸载
  • 应用级别的 keep-alive
  • 子应用开启保活模式后,应用发生切换时整个子应用的状态可以保存下来不丢失,结合预执行模式可以获得类似ssr的打开体验
  • 纯净无污染
  • 无界利用iframe和webcomponent来搭建天然的js隔离沙箱和css隔离沙箱
  • 利用iframe的history和主应用的history在同一个top-level browsing context来搭建天然的路由同步机制
  • 副作用局限在沙箱内部,子应用切换无需任何清理工作,没有额外的切换成本
  • 性能和体积兼具
  • 子应用执行性能和原生一致,子应用实例instance运行在iframe的window上下文中,避免with(proxyWindow){code}这样指定代码执行上下文导致的性能下降,但是多了实例化iframe的一次性的开销,可以通过 proload 提前实例化
  • 体积比较轻量,借助iframe和webcomponent来实现沙箱,有效的减小了代码量

成本:

  • 开箱即用
  • 不管是样式的兼容、路由的处理、弹窗的处理、热更新的加载,子应用完成接入即可开箱即用无需额外处理,应用接入成本也极低

风险:

  • 太新了,今年7月份才发布
  • 社区活跃度 star 1.7k(统计时间2022-10-09)
  • 文档不是特别齐全
  • 使用人数相对较少

微前端总结

qiankun 方案对 single-spa 微前端方案做了较大的提升同时也遗留下来了不少问题长时间没有解决; micro-app 方案对 qiankun 方案做了较多提升但基于 qiankun 的沙箱也相应会继承其存在的问题; EMP 方案基于 webpack 5 联邦编译则约束了其使用范围; 目前的微前端方案在用户的核心诉求上都没有很好的满足,有很大的优化提升空间。

正常的一些轻量业务,是没有必要引入微前端的概念,这样只会自找麻烦,只有在业务触及了巨石应用范畴,给开发人员带来困扰的时候,才需要引入,以便解决一下通用问题,并保证具备以下能力:

  1. 自主的团队,维护着各团队解耦的代码库;
  2. 独立部署:各团队可以独立部署;
  3. 同步更新:各团队各业务功能升级后,整体应用能够同步更新;
  4. 增量升级:做到不修改历史包袱的情况下,进行逐步的更新;

适合的业务场景:

  • 前端巨石工程:业务越来越复杂,许多复杂需求堆积在一个工程里,部署、debug、扩展过于困难,单个模块的重构成本大。
  • 前端碎石工程:不同项目之间的依赖维护成本巨大、项目之间的跳转体验糟糕。

具体什么样的情形适合使用微前端?

  1. 技术栈切换又不想重构已有业务的,例如增量升级,就是在保留原来项目部分的基础上,新功能或者模块采用新技术来实现。
  2. 历史包袱项目,比如历史项目内部强耦合,但是又运行稳定的。
  3. 自己造的轮子的库(与业务相关)需要复用在新项目中。
  4. 旧项目的业务页面会在新项目中复用,又迫于项目时间压力的情况。

场景1:老项目使用的jquery,新项目使用的是vue,两个项目都要共存。或者老项目是使用的jquery,突然要在老项目上开发新功能,jquery没有什么人用了,此时使用其他技术,例如vue开发新功能。

场景2:一个项目里面的不同功能模块由不同的前端技术团队在做,两个前端团队采用的是不同的技术栈,且各个团队相对独立,独立仓库、独立部署、独立构建。

当前调度项目采用微前端会面临哪些问题?

  • 第三方依赖重复引用的问题,导致需要加载太多的资源
  • 组件如何复用的问题。每个应用都有自己开发的组件库
  • 构建流水线增加,原先一条,现在要几条,服务器端口增加,之前是一个现在是几个。
  • 代码仓库增加,原先一个,现在N个。
  • 子应用首先需要做支持跨域请求改造,这个是所有微前端框架运行的前提。

 

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

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

相关文章

使用极限学习机进行股市预测(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 极限学习机(Extreme Learning Machine,ELM)作为前馈神经网络学习中一种全新的训练框架,在行为识别、情…

EPICS -- 使用asynPortDriver类编写示一个示例程序

本示例展示了如何使用asynPortDriver类编写一个EPICS端口驱动程序的示例。 这个驱动程序参数库中一个有5个参数,分别支持5个EPICS记录。 如下是具体步骤: 1) 用makeBaseApp.pl脚本建立这个IOC应用程序的框架: [blctrlmain-mach…

IDEA中如何实现git的cherry-pick可视化操作?

目录 问题现象: 问题分析: 解决方法: 拓展:如何回退提交记录? 问题现象: 今天在学习了git的cherry-pick功能,于是引出了一个问题: IDEA中如何实现git的cherry-pick可视化操作&am…

【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云

在上一篇中,我们使用docker commit 命令,创建了一个带有vim的Ubuntu镜像。那么怎么将这个镜像分享出去呢?本文就来讲解如何将本地的docker镜像发布到阿里云上。 本文主要内容: 1:本地镜像发布到阿里云流程 2&#xf…

Linux网络原理与编程(4)——第十四节 传输层协议

目录 前置知识 再谈端口号 几个函数 netstat telnet UDP报文 UDP协议端格式 UDP首部: UDP的特点 UDP的缓冲区 TCP报文详解 Tcp报头详解 传输层是在应用层的下面一层,我们在讲解传输层协议之前,先来说一说一些前置知识即命令函数等…

看完就会flink基础API

文章目录一、执行环境(Execution Environment)1、创建执行环境2、执行模式(Execution Mode)3、触发程序执行二、源算子(Source)1、数据源类准备2、从集合中读取数据3、从文件中读取数据4、从Socket中读取数据5、从Kafka中读取数据…

ISCSLP 2022 Program|希尔贝壳邀您参加第十三届中文口语语言处理国际会议

第十三届中文口语语言处理国际会议将于2022年12月11-14日(本周日~下周三)正式开启,本次会议中的部分Session将通过语音之家视频号进行线上直播,欢迎大家参加! 官网:www.iscslp2022.org 大会简介 中文口语…

ABAP学习笔记之——第十二章:SALV

一、概要 在Net Weaver 2004 平台上集合了利用函数和 GRID 的功能发布的 SALV 包程序 (SALV也称为 New ALV)。SALV 可以像利用函数生成 ALV 的不用创建屏幕就可以调用的全屏式ALV,还可以利用控制器在屏幕的控制器中显示 ALV。利用GRID 的ALV 虽然不能注册成 Batch …

速卖通知识产权规则介绍,如何才能规避侵权的问题?

最近有商家咨询到我,关于速卖通对商品知识产权是怎么评判的,今天就来给大家科普一下平台关于知识产权的规则介绍 速卖通平台严禁用户未经授权发布、销售涉嫌侵犯第三方知识产权的商品或发布涉嫌侵犯第三方知识产权的信息。 若卖家发布涉嫌侵犯第三方知…

从股票市场选择配对的股票:距离计算方法

我们来看看如何定义距离的计算方法。 回想一下,在共同趋势模型中,协整的必要条件是从共同趋势得到的新息序列必须完全相关。APT中的共同因子回报就理解成是从共同趋势得到的新息序列,因此,新息序列之间的相关系数就是共同因子回报…

网关性能大PK,Spring Cloud Gateway让人大失所望

现在的架构基本都是使用微服务的,而网关作为微服务的统一门户在架构模式中用得越来越多,API网关是所有客户端的单一入口点。 API网关模式是微服务体系结构的一个很好的起点,因为它能够将特定的请求路由到我们从整体上分离的不同服务。事实上…

嘿嘿嘿,10个我经常逛的“小网站”,不骗人

反思一下,为什么你会点进来~ 咳咳,步入正题。 工欲善其事必先利其器,你们的收藏夹里收藏了多少“小网站”?今天和大家分享10个我压箱底的效率工具/平台,现在用不上不要紧,赶紧收藏最关键! 1.G…

【产品设计】APP常见的6种图片浏览模式

六种是指比较常见的图片浏览模式,是在这四种的基础上加上手势来实现另一种读图方式,这里不绝对说就这么几种,那么就谈谈个人对每种图片浏览模式说说自己在实际使用和工作中的一些理解,以及这些模式在实际设计中,哪一种…

智能聊天机器人––ChatGPT初体验

最近几天,由OpenAI公司发布的ChatGPT聊天机器人火了,小杨也怀着对新鲜事物的好奇,亲自体验了一下这个火爆全网,让人沉迷其中无法自拔的ChatGPT聊天机器人,经过体验,我只想用一个字来表达我的感受&#xff0…

【LeetCode每日一题】——142.环形链表 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 链表 二【题目难度】 中等 三【题目编号】 142.环形链表 II 四【题目描述】 …

Java百度地图全套教程(地图找房、轻骑小程序、金运物流等)

课程简介: 本课程基于百度地图技术,将企业项目中地图相关常见应用场景的落地实战,包括有地图找房、轻骑小程序、金运物流等。同时还讲了基于Netty实现高性能的web服务,来处理高并发的问题。 学完本课程能够收获:百度…

支持本地挂载的网盘文件列表工具AList

什么是 Alist? AList 是一个支持多存储的文件列表程序,使用 Gin 框架和 Solidjs 库。可以将常见的 18 种网盘整合在一起,并支持 WebDAV 客户端访问。 之前老苏写过一篇 Alist, 但此 Alist 非彼 Alist,之前的 A 应该是 …

React基础知识(React基本使用、JSX语法、React模块化与组件化)(一)

系列文章目录 文章目录系列文章目录一、React简介1.1 React的特点1.2 React高效的原因二、React基本使用2.1 引入react相关js库2.2 创建虚拟DOM的两种方法2.3 虚拟DOM和真实DOM三、JSX基本使用3.1 jsx使用四、React模块化与组件化4.1 函数式组件4.2 类式组件一、React简介 1.英…

Kafka消费者组消费进度监控

针对Kafka消费者,重要的就是监控消费进度或者是消费的滞后程度,有个专业名词 消费者 Lag 或 Consumer Lag。 滞后程度(Consumer Lag)是指消费者当前落后生产者的程度。比如Kafka 生产者向某主题成功生产了 100 万条消息&#xff0…

一个.NetCore前后端分离、模块化、插件式的通用框架

今天给大家推荐一个基于.NET 6实现的快速开发平台。采用模块化插件式开发,前后端分离,开箱即用。 项目简介 这是一个开箱即用的快速开发平台,前后端分离架构,支持插件式开发,支持工作流、可视化表单功能。系统基础功…