微前端初识

news2024/11/27 0:31:01

文章目录

  • 微前端的发展历史
  • 微前端的定义
  • 微前端的特点
  • 使用微前端面临的挑战
  • 微前端常用技术方案及优缺点
    • 路由分发式微前端
    • iframe
    • single-spa
    • qiankun
    • webpack5: module federation
    • Web Component

微前端的发展历史

微前端在2016年首次出现在TWTR(ThoughtWorks Technology Radar)上,把后端微服务的概念扩展到了前端世界。

微前端的定义

维基百科上对微服务的定义:**一种软件开发技术,面向服务的体系结构架构样式的一种变体,将应用程序构造为一组松散耦合的服务,并通过轻量级的通信协议组合起来。**具体来说,就是将一个单体应用按照一定的规则拆分为一组服务。这些服务,各自拥有自己的仓库,可以独立开发、独立部署,有独立的边界,可以由不同的团队进行管理,甚至可以使用不同的编程语言来编写。但对前端来说,仍然是一个完整的服务。

面对越来越重的前端应用,可将微服务的思想照搬到前端,就有了微前端的概念。像微服务一样,一个前端应用,也可以按照一定的规则,拆分为不同的子应用,独立开发,独立部署,然后聚合成一个完整的应用面对客户。
微前端的结构一般如下:
在这里插入图片描述

微前端的特点

  • 简单、分离、松耦合的代码仓库。
    对比应用“一大坨”的代码仓库,微前端架构下的代码仓库更加简单、轻量。各个仓库的代码可以基于业务、权限、变更的频率、组织结构、后端微服务等原则拆分,界限明确,降低耦合,便于开发人员在开发过程重快速定位源代码,降低维护成本。
  • 独立开发、独立部署
    代码库拆分后,我们可以基于各个代码仓库独立开发。由于代码体积的缩小,项目构建时间变短,极大提升开发效率。
    各个项目都有自己的交付流水线(构建、测试、上线),并且能够独立部署,不需要考虑其他项目的情况。
  • 技术栈无关
    在实际的开发中,各个项目会因为各种各样的原因导致使用的技术栈不一样。比如,开发框架有react、vue、angluar等,构建工具有webpack、rollup、parcel 等,而且版本还可能不一样。使用微前端架构,可以将使用不同的技术栈(不同版本)的子应用聚合起来。
  • 遗留系统迁移
    在公司中,多多少少会有一些应用使用的是老的技术栈开发的,比如Backbone、Vue1.0、JQuery、Angluar2等。这些应用已经在线上稳定运行,而且也没有新的功能。对于这样的应用,我们没有理由去浪费时间和额外的经历,可以通过微前端方案直接整合到新的应用中。
    当然,使用微前端很大一部分原因就是为了解决遗留系统的迁移问题
  • 技术栈升级
    除了遗留系统迁移,微前端在技术栈版本升级方面也能提供帮助。
    除了遗留系统迁移,微前端在技术栈升级方面也能提供帮助,ant-design已经更新到了5,但是项目因为一直在迭代,还是使用antd2。如果直接重构,肯定是不现实的,不仅费事费力,而且风险也比较大。
    对于这种情况,我们可以重起一个应用,使用antd4 循序渐进的重构应用,然后使用微前端方案将新旧应用聚合起来。
  • 团队技术成长
    和微前端技术栈无关的优点,可以让团队获得更多的机会在项目中尝试新的技术(Vue3、Webpack5 等),有助于整个团队的成长。

使用微前端面临的挑战

微前端方案给我们带来巨大便利的同时,也给我们带来了一些挑战。在实现微前端的同时,我们必须要考虑的问题:

  • 子应用切换
  • 应用相互隔离,互不干扰
  • 子应用之间通信
  • 多个子应用并存
  • 用户状态的存储 - 免登

微前端常用技术方案及优缺点

目前主流的微前端实现方案主要有:

  • 路由分发式微前端
  • iframe
  • single-spa
  • qiankun
  • webpack5:module federation
  • Web Component

路由分发式微前端

路由分发式微前端,就是通过路由将不同的业务分发到不同的独立前端应用上。最常用的方案是通过 http服务的反向代理来实现。

🌰栗子<( ̄▽ ̄)/(一个基于路由分发的Nginx配置):

http {
  server {
    listen 80;
    server_name  xxx.xxx.com;
    location /api/ {
      proxy_pass http://localhost:3001/api;
    }
    location /web/admin {
      proxy_pass http://localhost:3002/api;
    }
    location / {
      proxy_pass /;
    }
  }
}

通过上述配置,不同页面的请求就可以分发到不同的服务器上。
优点:

  • 实现简单
  • 不需要对现有应用进行改造
  • 完全技术栈无关
    缺点:
  • 用户体验不好,每次切换应用时,浏览器都需要重新加载页面
  • 多个字应用无法并存
  • 局限性较大
  • 子应用之间的通信比较困难
  • 子应用切换时需要重新登录

iframe

iframe作为一项非常古老的技术,也可以用于实现微前端、通过iframe,我们可以很方便的将一个应用嵌入到另一个应用中,而且两个应用之间的 css 和 js 是相互隔离的,不会互相干扰。
优点:

  • 用户体验不好,每次切换应用时,浏览器需要重新加载页面。
  • UI不同步,DOM结构不共享;
  • 全局上下文完全隔离,内存变量不共享,子应用之间通信、数据同步过程较复杂。
  • 对SEO不友好
  • 子应用切换时可能需要重新登录,体验不好。

single-spa

路由转发模式、iframe模式尽管可以实现微前端,但是体验不好。每次切换已经访问过的子应用时,都需要重新加载子应用,对性能有很大影响。

现在前端应用开发的主流模式为基于vue、react、angluar 的单页面应用开发模式。在这种模式下,我们需要维护一个路由注册表,每个路由对应各自的页面组件url。切换路由时,如果是一个新的页面,需要动态获取路由对应的js脚本,然后执行脚本并渲染出对应的页面;如果是一个已经访问过的页面,那么直接从缓存中获取已缓存的页面方法,执行并渲染出对应的页面。

微前端也有类似的实现方案,来获得和单页应用一样的用户体验。

在single-spa方案中,应用被分为两类:基座应用子应用。其中,子应用就是需要聚合的子应用;而基座应用,是另外一个单独的应用,用于聚合子应用。

和单页应用的实现原理类似,single-spa 会在基座应用中维护一个路由注册表,每个路由对应一个子应用。基座应用启动后,当我们切换路由时,如果是一个新的子应用,会动态获取子应用的js脚本,然后执行脚本并渲染出相应的页面;如果是一个访问过的子应用,那么就会从缓存中获取已经缓存的子应用,激活子应用并渲染出对应的页面。

优点:

  • 切换应用时,浏览器不用重载页面,提供和单页应用一样的用户体验
  • 完全技术栈无关
  • 多个子应用可并存
  • 生态丰富
    缺点:
  • 需要对原有应用进行改造,应用要兼容接入single-spa 和独立使用
  • 有额外的学习成本
  • 使用复杂,关于子应用加载、应用隔离、子应用通信等问题,需要框架使用者自己实现。
  • 子应用间相同资源重复加载
  • 启动应用时,要先启动基座应用

qiankun

和 single-spa 一样,qiankun 也能提供类似单页应用的用户体验。qiankun 是在 single-spa的基础上,做了二次开发,在框架层面解决了使用single-spa 时需要开发人员自己编写子应用加载、通信、隔离等逻辑的问题,是一种比 single-spa 更优秀的微前端方案。

优点:

  • 切换应用时,浏览器不用重载页面,提供和单页面一样的用户体验
  • 相比single-spa,解决了子应用加载、应用隔离、子应用通信等问题,使用起来相对简单。
  • 完全和技术栈无关
  • 多个子应用可并存
    缺点:
  • 需要对原有应用进行改造,应用要兼容接入qiankun和独立使用;
  • 有额外的学习成本
  • 相同资源重复加载
  • 启动应用时,要先启动基座应用

webpack5: module federation

webpack5 提供一个新特性 module fedaration 。基于这个特性,我们可以在一个 js 应用中动态加载并运行另一个js 应用的代码,并实现应用之间的依赖共享。

通过module federation,我们可以在一个应用里动态渲染另一个应用的页面,这样也就实现了多个子应用的聚合。

module federation,我们可以在一个应用里动态渲染另一个应用的页面,这样也就实现了多个子应用的聚合。

优点:

  • 不需要对原有应用进行改造,只需改造打包脚本
  • 切换应用时,浏览器不用重载页面,提供和单页应用一样的用户体验。
  • 多个子应用可并存
  • 相同资源不需要重复加载
  • 开发技术栈无关
  • 应用启动后,无需加载与自己无关的资源
  • 免登友好
    缺点:
  • 构建工具只能使用 webpack5
  • 有额外的学习成本
  • 对有项目不友好,需要对webpack 进行改造

Web Component

基于Web Component 的 Shadow Dom 能力,我们也可以实现微前端,将多个子应用聚合起来。

Shadow Dom 的应用如下:

const shadow = document.querySelector('#hostElement').attachShadow({mode: "open"});
// fetch 为应用的地址,基于fetch,可以获取应用html模版,添加到指定节点下
fetch(url).then(res => {
    shadow.innerHTML = res;
});

优点:

  • 实现简单
  • css和js天然隔离,互不干扰
  • 完全技术栈无关
  • 多个子应用可以并存
  • 不需要对现有应用进行改造
    缺点:
  • 主要是浏览器兼容性问题
  • 开发成本较高

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

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

相关文章

准确预测极端降水,哥伦比亚大学推出升级版神经网络 Org-NN

内容一览&#xff1a;随着环境变化加剧&#xff0c;近年来全球极端天气现象频频出现&#xff0c;准确预测降水强度对人类以及自然环境都十分重要。传统模型预测降水的方差较小&#xff0c;偏向小雨&#xff0c;对极端降水预测不足。 关键词&#xff1a;极端天气 内隐学习 神经网…

ABAQUS启动GPU加速计算

文章目录 系统说明CUDA安装安装cuDNNABAQUS设置Lamb波压电仿真 系统说明 基于笔记本电脑&#xff0c;RTX4060&#xff0c;win11系统。 ABAQUS的有限元求解器是基于CPU的&#xff0c;但是它也支持使用GPU进行加速计算。仅支持隐式求解器standard。显示求解器explicit不能用。 …

opencv基础46-图像金字塔02-拉普拉斯金字塔

前面我们介绍了高斯金字塔&#xff0c;高斯金字塔是通过对一幅图像一系列的向下采样所产生的。有时&#xff0c;我们希望通过对金字塔中的小图像进行向上采样以获取完整的大尺寸高分辨率图像&#xff0c;这时就需要用到拉普拉斯金字塔 前面我们已经介绍过&#xff0c;一幅图像在…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

算法通关村第五关——HashMap和队列问题分析

1.HashMap 1.1Hash的概念和基本特征 哈希(Hash)&#xff1a;也称为散列。就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;这个输出值就是散列值。 假设数组array存放的是1到15这些数&#xff0c;现在要存在一个大小是7的Hash表中…

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库

Asynq[1]是一个Go实现的分布式任务队列和异步处理库&#xff0c;基于redis&#xff0c;类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5]&#xff0c;可以源码形式安装或使用Docker image, 还可以和Prometheus…

【数据结构与算法——TypeScript】哈希表

【数据结构与算法——TypeScript】 哈希表(HashTable) 哈希表介绍和特性 哈希表是一种非常重要的数据结构&#xff0c;但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中&#xff0c;我门就一点点来实现一个自己的哈希表。通过实现来理解哈希表背后的原理…

oracle容灾备份怎么样Oracle容灾备份

随着科学技术的发展和业务的增长&#xff0c;数据安全问题越来越突出。为了保证数据的完整性、易用性和保密性&#xff0c;公司需要采取一系列措施来防止内容丢失的风险。  Oracle是一个关系数据库管理系统(RDBMS),OracleCorporation是由美国软件公司开发和维护的。该系统功能…

构建Docker容器监控系统(cadvisor+influxDB+grafana)

目录 一、部署 1、安装docker-cd 2、阿里云镜像加速 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、创建granafa容器 一、部署 1、安装docker-cd [rootlocalhost ~]# iptables -F [rootlocalhost ~]# setenforce 0 setenforce: SELi…

22款奔驰GLC260加装原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶&#xff0c;可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出&#xff0c;并且在关闭后能够立刻散去。车内气味不会永久改变&#xff0c;香氛…

IELAB-网络工程师的路由答疑10问(2)

各位小伙伴们&#xff0c;接下来的问题可能有些难度&#xff0c;你们做好准备了吗&#xff1f; 7. 动态路由协议做了啥&#xff1f; 这次咱们先解决第一个比较棘手的问题--路由协议&#xff0c;相信初学的同学对于路由协议的学习总是或多或少有些问题&#xff0c;呐&#xff…

UVA1025 城市里的间谍 A Spy in the Metro

实际上这题就是问Mario最少的总等车时间 这题我的做法是 把一个火车从左到右(或从右到左) 的过程 转化成 途中任何车站到左边(或右边)相邻车站 的过程 相当于把他切成了一段一段 (一段就是两个相邻车站中间的部分) 这样更容易操作 具体请看代码 一些注释在代码里请往下看 #inc…

.netcore下grpc概述

一、什么是grpc 是一种与语言无关的高性能远程过程调用 (RPC) 框架。基于http/2标准设计&#xff0c;提供了头部压缩、tcp连接上的多路复用、流量控制、流式处理&#xff08;客户端流/服务端流/双向流&#xff09;。提供统一使用的.proto文件&#xff0c;它定义 grpc 服务和消…

屏幕录制app分享,总有适合你的一款

在现今的互联网时代&#xff0c;屏幕录制已经成为了一项必备的技能。然而&#xff0c;要想将自己的屏幕录制下来并分享给别人&#xff0c;就需要一款好用的屏幕录制app。市面上有许多不同的屏幕录制app&#xff0c;每个人的需求也各不相同。本篇文章就将为大家推荐几款适合不同…

技术应用:Docker安全性的最佳实验|聊聊工程化Docker

&#x1f525; 技术相关&#xff1a;《技术应用》 ⛺️ I Love you, like a fire! 文章目录 首先&#xff0c;使用Docker Hub控制访问其次&#xff0c;保护密钥写在最后 不可否认&#xff0c;能生存在互联网上的软件都是相互关联的&#xff0c;当我们开发一款应用程序时&#x…

好用的Windows 10磁盘管理工具

​前几天&#xff0c;我给我用的戴尔笔记本电脑装上了全新的SSD&#xff0c;并准备将所有除Windows操作系统以外的数据&#xff0c;特别是游戏&#xff0c;全部转移到SSD上&#xff08;主要是因为这样能加快游戏的加载速度&#xff09;。但在我尝试用Windows 10自带的磁盘管理操…

树莓派4B, Purple Pi, Orange Pi 3B对比

1 参数 树莓派4BPurple Pi OHOrange Pi 3BSOCBroadcom BCM2711RockChip 3566RockChip 3566CPUARM Cortex-A72 四核1.5GHz主频ARM Cortex-A55 四核 2.0GHz主频ARM Cortex-A55 四核 2.0GHz主频GPU支持OpenGL ES 3.0 graphicsMali-G52 1-Core-2EE 支持 OpenGL ES 1.1/2.0/3.2&…

Python操作MySQL将数据库表中的数据导出到excel

Author: liukai 2810248865qq.com Date: 2022-08-18 04:28:52 LastEditors: liukai 2810248865qq.com LastEditTime: 2023-06-29 09:35:25 FilePath: \PythonProject01\Python操作MySQL数据库及excel将数据库表中的数据导出到excel中.py Description: 这是默认设置,请设置custo…

独立站如何进行Facebook广告投放?关于广告投放策略的真相

谷歌广告是独立站卖家推广引流的首选渠道&#xff0c;那么谷歌广告该如何投放&#xff1f;在这个过程中有哪些需要特别注意的吗&#xff1f; 创建Facebook广告账户&#xff1a; 访问Facebook广告管理平台&#xff08;Ads Manager&#xff09;并创建一个广告账户。您需要提供一…

Android 数据库之GreenDAO

GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架&#xff0c;将 Java 对象映射到 SQLite 数据库中&#xff0c;我们操作数据库的时候&#xff0c;不再需要编写复杂的 SQL语句&#xff0c; 在性能方面&#xff0c;greenDAO 针对 Android 进行了高度优化&#xff0c;…