微前端知识点汇总

news2024/9/23 7:27:04

1、微前端的实现方案

基于 qiankun 的微前端实践

微前端(Micro-Frontends)是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。

微前端目标直指巨石应用业务难题,旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用 (Frontend Monolith) 后,随之而来的应用不可维护的问题

 isMicroApp 的变量可以控制启动微前端渲染还是独立 APP 渲染,这个实际是 qiankun 客户端启动后,会在 window 上挂在 __POWERED_BY_QIANKUN__ 变量标识运行时环境。

qiankun 的渲染过程:微应用的 JS CSS 文件请求是属于 Ftech/XHR 类型,说明 js 文件的请求是 qiankun 客户端自行构造的。至于为何要这么做?我的理解是为了实现微前端的沙箱功能。

这里必然要涉及前端的跨域问题,尤其是当主应用和微应用的域名不一致时,qiankun 客户端如何能够在跨域的限制之下获取到微应用的页面资源?

在 qiankun 的框架下,一个页面集成到另外一个页面系统中,最关键的核心点就是将微应用封装成具有生命周期的页面组件,使得 qiankun 可以调用 React 或者 Vue 的 render 能力,将页面渲染到对应的 DOM 节点。

qiankun 的核心概念

第一步则是注册路由,确定微前端启动的时机和启动渲染的内容(when 和 where)。

主流的沙箱模式是通过创建一个独立的作用域隔离作用域链,同时克隆全局变量来实现的,但是这种隔离 + 克隆方案并不完美,在复杂运行场景中,无论性能还是安全性都是难以保证的,特别是 CSS 的隔离。

无界微前端


模块联邦在微前端架构中的实践

为什么是Webpack模块联邦?

当我们研究了所有的替代方案后,出于以下原因,选择Webpack模块联邦更有意义。

  • 没有维护成本(如果你自己建立一个架构,会有维护成本)

  • 没有团队特定的学习成本(如果你自己建立一个架构,会有学习成本)

  • 向模块联邦过渡的成本很小

  • 不需要对每个项目进行重新架构

  • 所有的需求都在构建时得到满足

  • 在运行时不需要额外的工作

  • 分享依赖的成本低

  • 库/框架独立

  • 你不需要处理所有的压缩和缓存问题

  • 你不需要处理路由问题

  • Shell和Micro Apps不是紧耦合的,而是松耦合的

模块联邦的两个伟大的功能了 :)

expose:它允许你从任何应用程序到另一个应用程序共享一个组件、一个页面或整个应用程序。你所暴露的一切都被创建为一个单独的构建,从而创造了一个自然的tree shaking每个构建都以文件的MD5哈希值命名,所以你不必担心缓存的问题。

remote: 它决定了你将从哪些应用程序接收一个组件、一个页面或应用程序本身。 每个应用程序都可以同时暴露和定义一个远程,并多次进行。


介绍 - qiankun

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

  • 💪 HTML Entry 接入方式,让你接入微应用像使用 iframe 一样简单。
  • 🛡​ 样式隔离,确保微应用之间样式互相不干扰。
  • 🧳 JS 沙箱,确保微应用之间 全局变量/事件 不冲突。
  • ⚡️ 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度。

微前端架构具备以下几个核心价值:

  • 技术栈无关
    主框架不限制接入应用的技术栈,微应用具备完全自主权

  • 独立开发、独立部署
    微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新

  • 增量升级

    在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略

  • 独立运行时
    每个微应用之间状态隔离,运行时状态不共享

qiankun 的诸多设计均是秉持这一原则,如 HTML entry、沙箱、应用间通信等。这样才能确保微应用真正具备 独立开发、独立运行 的能力。

qiankun 会在跑子应用之前在 window 沙箱设置 POWERED_BY_QIANKUN 的变量,如果有这个变量就不要直接渲染,在 mount 生命周期里做渲染,否则就直接渲染。

还要指定静态资源的加载地址,通过 webpack_public_path 的全局变量。

Why Not Iframe

为什么不用 iframe,这几乎是所有微前端方案第一个会被 challenge 的问题。但是大部分微前端方案又不约而同放弃了 iframe 方案,自然是有原因的,并不是为了 "炫技" 或者刻意追求 "特立独行"。

如果不考虑体验问题,iframe 几乎是最完美的微前端解决方案了。

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

1url 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
2UI 不同步,DOM 结构不共享。想象一下屏幕右下角 1/4 的 iframe 里来一个带遮罩层的弹框,同时我们要求这个弹框要浏览器居中显示,还要浏览器 resize 时自动居中..
3全局上下文完全隔离,内存变量不共享。iframe 内外系统的通信、数据同步等需求,主应用的 cookie 要透传到根域名都不同的子应用中实现免登效果。
4慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程。

其中有的问题比较好解决(问题1),有的问题我们可以睁一只眼闭一只眼(问题4),但有的问题我们则很难解决(问题3)甚至无法解决(问题2),而这些无法解决的问题恰恰又会给产品带来非常严重的体验问题, 最终导致我们舍弃了 iframe 方案。

主应用不限技术栈,只需要提供一个容器 DOM,然后注册微应用并 start 即可。

Shadow DOM 接口是关键所在,它可以将一个隐藏的、独立的 DOM 附加到一个元素上。

在单实例模式下,你可以使用 excludeAssetFilter 参数来放行这部分资源请求,但是注意,被该选项放行的资源会逃逸出沙箱,由此带来的副作用需要你自行处理。

如何解决拉取微应用 entry 时 cookie 未携带的问题

fetch() - Web API 接口参考 | MDN

1: mode: 'cors' 开启跨域资源共享

2:credentials: 'include', 在当前域名内自动发送 cookie

 

SanpshotSandbox和LegacySandbox沙箱,都是 单例模式 下使用的沙箱。也即一个页面中只能同时展示一个微应用,而且无论是 set 还是 get 依然是直接操作 window 对象。

在这样单例模式下,当微应用修改全局变量时依然会在原来的 window 上做修改,因此如果在同一个路由页面下展示多个微应用时,依然会有环境变量污染的问题。

import-html-enry

qiankun 框架配套开发支持 html 作为入口(entry) 的资源加载器(loader)。

工作环境:

  • qiankun 框架为了解决 JS Entry 的问题,采用更方便的 HTML Entry 方式,目的让微应用接入像 iframe 一样只需配置页面 html 的 url 地址

2、项目中采用的方案

3、微前端中主子应用数据管理和通信的实现

4、沙箱隔离,沙箱的实现原理JS沙箱和样式沙箱

5、表单生成器的实现和其他方案对比?

6、其他印象比较深的项目和重难点,以及收获

7、

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

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

相关文章

【Kubernetes】【十一】Pod详解 Pod的生命周期

Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建过程 运行初始化容器(init container)过程 运行主容器(main container) 容器启动后钩子&#…

陆拾伍- 如何通过数据影响决策

零、为何能影响 客观的表达其实不一定是客观,只要一被展示,就有可能被主观的意愿所影响。 如何通过客观的数据去展示以及放大主观的意愿,主要有以下几种方法: 一、图表内容顺序 原始数据展示 这种展示,对于 A、B店来…

基于微信小程序的青少年生理健康知识小助手

基于微信小程序的青少年生理健康知识小助手 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目…

Python生日系统

#免费源码见文末公众号# 录入生日 def write():keyvar1.get()valuevar2.get()with open(d:\\生日系统.pickle,rb) as file:dictspickle.load(file)dicts[key]valuewith open(d:\\生日系统.pickle,wb) as file:pickle.dump(dicts,file)file.close() 查询生日 def read():namev…

DDR4介绍01

DDR4(第四代双倍数据率同步动态随机存储器SDRAM) 关于内存方面知识,大部分人、包括我自己也不是很懂,希望此篇文章能起到点作用,做硬件的就得把相关专业知识学牢了,尤其是专业术语。 下面是DDR4知识做一次…

软考高级之信息系统案例分析七重奏-《7》

本文主要介绍信息系统管理师案例分析 项目立项管理 可行性研究内容一般应包括以下内容。 (1)投资必要性 (2)技术的可行性 (3)财务可行性 (4)组织可行性 (5) 经济可行性 (6) 社会可行性 (7) 风险因素及对策。 项目整体管理 1、项目章程应当包括以下内容 (1)项目目的或…

英伟达GPU中的Tnesor Cores数量多寡与显卡性能有什么关联?

前言 最近在调研常用显卡的参数,看到Nvidia Tensor Cores常用于其中作为对比,呈现在性能好的显卡比如A100比RTX 3060更多更全面,开始思考Tensor Cores细致的作用是什么? 英伟达GPU显卡的简要发展历程 GTX是英伟达过去显卡的型号…

智慧工地安全着装识别检测算法 python

智慧工地安全着装识别检测算法通过pythonopencv网络模型AI视频分析技术,人员安全着装识别检测算法对现场物体的不安全状态以及人员的不安全行为(不按要求着装)进行自动实时分析。由于Python 较为简单,一般无法进行复杂的后端搭建&…

【C语言】指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 四、数组指针的使用 五、函数指针数组 六、指向函数指针数组的指针 七、回调函数 我们知道了指针的概念: 1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。 2. 指针的大小是…

基于springboot+html汽车维修系统汽车维修系统的设计与实现

基于springboothtml汽车维修系统汽车维修系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式&#x1…

OR青年导师访谈特辑 | 香港理工大学助理教授 马玮:一次拉长的面试 一个交流的平台

OR青年计划 由【运筹OR帷幄】社区主办的【OR青年计划】,旨在帮助对运筹学应用有理想和追求的同学,近距离与学界、业界导师交流课题,深入了解运筹学的细分方向,为后续的深造、就业生涯打下坚实的基础!更多内容请查看链…

springmvc图书馆自习室座位预约管理系统java ssm

红枫图书馆自习室座位预约系统的开发过程中,采用B / S架构,主要使用jsp技术进行开发,中间件服务器是Tomcat服务器,使用Mysql数据库和Eclipse开发环境。该红枫图书馆自习室座位预约系统包括学生、管理员。其主要功能包括个人中心、…

Go基础-Hello world

文章目录1 GoRoot、GoPath2 编写程序3 运行程序1 GoRoot、GoPath GoRoot 就是Go的安装目录中的bin目录 GoPath 用于存放第三方类库和自己编写的封装好的代码块 2 编写程序 go_basic/01_helloworld.go package mainimport "fmt"func main() {fmt.Println("He…

番外篇 | 20+ 种注意力机制及代码 适用于YOLOv5/v7/v8

前言 之前已经在此篇博文更新过YOLO系列算法添加注意力机制的教程,共计实现了 13 13 13 种注意力及代码,本篇博文继续追加 10 10 10 余种。与之前不同的是,此篇博文代码添加方式更加严谨更加鲁棒,使用更简单,针对不同种类注

(考研湖科大教书匠计算机网络)第四章网络层-第七节:IPv4数据报首部格式

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:IP数据报首部格式概述二:各字段作用概述(1)版本(2)首部长度和可选字段(3&am…

WSL(ubuntu2204)xfce4语言支持报错及配置WSL服务自启

语言支持报错 在图形桌面或命令行打开语言支持报错:dbus.exceptions.DBusException: org.freedesktop.DBus.Error.FileNotFound: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory itboonelocalhost:/$ sudo /usr/bin/gnome-…

gRPC 非官方教程

一、 简介 gRPC的定义: 一个高性能、通用的开源RPC框架主要面向移动应用开发: gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。基于HTTP/2协议标准而设计,基于ProtoBuf(Protoc…

Visual Studio 高级调试-代码调试

概述编程圈子里隔三差五的就会有场“谁是最强IDE”之争,重要的是我们需要对使用的IDE有充分的了解,正所谓工欲善其事,必先利其器。本文主要讲述Visual Studio常用的调试技巧,包括多类型断点,数据监视,以及多…

剑指 Offer 59 - I. 滑动窗口的最大值

摘要 剑指 Offer 59 - I. 滑动窗口的最大值 一、大顶堆求解 对于每个滑动窗口,我们可以使用 O(k) 的时间遍历其中的每一个元素,找出其中的最大值。对于长度为n的数组 nums而言,窗口的数量为 n−k1,因此该算法的时间复杂度为 O(…

在线图片转gif怎么操作?试试这一招在线制作gif

静图怎么变成gif动图?想要将手中的静态图片变成gif动图又不想下载软件的时候要怎么操作呢?很简单,通过使用【GIF中文网】的动图在线制作(https://www.gif.cn/)功能,两招就能在线制作gif图片,方便…