微前端初识

文章目录

  • 微前端的发展历史
  • 微前端的定义
  • 微前端的特点
  • 使用微前端面临的挑战
  • 微前端常用技术方案及优缺点
    • 路由分发式微前端
    • 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.mzph.cn/news/29312.shtml

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

相关文章

MySQL之深入InnoDB存储引擎——Undo页

文章目录 一、UNDO日志格式1、INSERT操作对应的UNDO日志2、DELETE操作对应的undo日志3、UPDATE操作对应的undo日志1&#xff09;不更新主键2&#xff09;更新主键的操作 3、增删改操作对二级索引的影响 二、UNDO页三、UNDO页面链表四、undo日志具体写入过程五、回滚段1、回滚段…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建 bbcbbc

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

算法通关村第五关——n数之和问题解析

1. 两数之和问题 力扣第1题就是两数之和问题&#xff0c;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

Ishikawa

Ishikawa 石川、鱼骨头、因果 其实我压根不知道 Ishikawa 这个日文就是石川&#xff0c;^_^&#xff0c;视乎也没啥影响

计算机网络基础

文章目录 网络协议初识协议分层OSI七层模型TCP/IP五层协议 网络传输基本流程网络传输流程数据包装和分用封装过程分用过程 网络中的地址管理IP地址MAC地址 网络协议初识 协议是一种约定。 协议分层 分层之后&#xff0c;每一层只关注自己同层的功能&#xff0c;只使用下层的接…

卷积神经网络实现MNIST手写数字识别 - P1

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营-第P1周&#xff1a;实现mnist手写数字识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同…

【Hystrix技术指南】(1)基本使用和配置说明

这世间许多事物皆因相信而存在&#xff0c;所以人们亲手捏出了泥菩萨&#xff0c;却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被…

一个好的人力资源管理系统包括哪些部分

阅读本文&#xff0c;您将具体详细了解&#xff1a;一个好的人力资源管理系统应该包括哪些部分。 人事部门是一家公司重要的职能部门之一&#xff0c;为公司的持续性、健康性发展提供人力保障。 然而&#xff0c;目前传统的人事管理方式在应对一些问题时存在着一些挑战。 例…

Shell脚本学习-循环的控制命令

break continue exit对比&#xff1a; 示例1&#xff1a;break命令跳出整个循环。 [rootabc scripts]# cat break1.sh #!/bin/bashfor((i0;i<5;i)) doif [ $i -eq 3 ]thenbreakfiecho $i done echo "ok"[rootabc scripts]# sh break1.sh 0 1 2 ok可以看到i等于3及…

jupyter lab环境配置

1.jupyterlab 使用虚拟环境 conda install ipykernelpython -m ipykernel install --user --name tf --display-name "tf" #例&#xff1a;环境名称tf2. jupyter lab kernel管理 show kernel list jupyter kernelspec listremove kernel jupyter kernelspec re…

微信小程序--原生

1&#xff1a;数据绑定 1&#xff1a;数据绑定的基本原则 2&#xff1a;在data中定义页面的数据 3&#xff1a;Mustache语法 4&#xff1a;Mustache的应用场景 1&#xff1a;常见的几种场景 2&#xff1a;动态绑定内容 3&#xff1a;动态绑定属性 4&#xff1a;三元运算 4&am…

C语言:打开调用堆栈

第一步&#xff1a;打断点 第二步&#xff1a;FnF5 第三步&#xff1a;按如图找到调用堆栈

C 语言高级3--函数指针回调函数,预处理,动态库的封装

目录 1.函数指针和回调函数 1.1 函数指针 1.1.1 函数类型 1.1.2 函数指针(指向函数的指针) 1.1.3 函数指针数组 1.1.4 函数指针做函数参数(回调函数) 2.预处理 2.1 预处理的基本概念 2.2 文件包含指令(#include) 2.2.1 文件包含处理 2.2.2 #incude<>和#include&q…

C++ 线性群体的概念

线性群体中的元素次序与其位置关系是对应的。 在线性群体中&#xff0c;可以按照访问元素的不同方法分为直接访问、顺序访问和索引访问。 &#xff08;1&#xff09;直接访问 对可直接访问的线性群体&#xff0c;我们可以直接访问群体中的任何一个元素&#xff0c;而不必首先访…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

Python中enumerate用法详解

目录 1.简介 2.语法 3.参数 4.返回值 5.详解 6.实例 7.补充 1.简介 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列&#xff0c;同时列出数据和数据下标&#xff0c;一般用在 for 循环当中。 2.语法 以下是 enumerate() 方法的语…

Linux 匿名页的生命周期

目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时&#xff09;来分配内存&#xff0c;在内核空间发生…

【小梦C嘎嘎——启航篇】类和对象(中篇)

【小梦C嘎嘎——启航篇】类和对象&#xff08;中篇&#xff09;&#x1f60e; 前言&#x1f64c;类的6个默认成员函数构造函数析构函数拷贝构造函数拷贝构造函数的特性有哪些&#xff1f;既然编译器可以自动生成一个拷贝构造函数&#xff0c;为什么我们还要自己设计实现呢&…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建SpringSecurity权限框架

1.Cloud Studio&#xff08;云端 IDE&#xff09;简介 Cloud Studio 是基于浏览器的集成式开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器就能在线编程。 Clou…