微前端--qiankun原理概述

news2024/11/17 10:54:30

demo放最后了。。。

一、微前端

一》微前端概述

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

二》微前端架构核心

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

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

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

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

三》主流的微前端方案

1、iframe

        iframe 最大的特性就是提供了浏览器原生的硬隔离方案,不论是样式隔离、js 隔离这类问题统统都能被完美解决。

        但他的最大问题也在于他的隔离性无法被突破,导致应用间上下文无法被共享(主要是本地存储、全局变量和公共插件),两个项目不同源(跨域)情况下数据传输需要依赖 postMessage,随之带来的开发体验、产品体验的问题。

2、single-spa 方案

        Single-spa 是一个将多个单页面应用聚合为一个整体应用的 JavaScript 微前端框架(GitHub 主页)。简单来说就是将子项目的内容(包括容器、js)插入到主项目,从而呈现出子项目的内容。

        相对于 iframe,single-spa 让父子项目属于同一个 document,这样做既有好处,也有坏处。好处就是数据/文件都可以共享,公共插件共享,子项目加载就更快了,缺点是带来了 js/css 污染。

        single-spa 上手并不简单,也不能开箱即用,开发部署更是需要修改大量的 webpack 配置,对子项目的改造也非常多。

二、qiankun

一》qiankun是什么

         qiankun 是一个基于 single-spa 的微前端实现库,它在 single-spa 的基础上,实现了开箱即用,除一些必要的修改外,子项目只需要做很少的改动,就能很容易的接入。

二》qiankun主要特性

1、基于 single-spa 封装,提供了更加开箱即用的 API。

2、技术栈无关,任意技术栈的应用均可 使用/接入,不论是 React/Vue/Angular/JQuery 还是其他等框架。

3、HTML Entry 接入方式,让我们接入微应用像使用 iframe 一样简单

4、样式隔离,确保微应用之间样式互相不干扰。

5、JS 沙箱,确保微应用之间 全局变量/事件 不冲突。

6、资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度。

7、umi 插件,提供了 @umijs/plugin-qiankun 供 umi 应用一键切换成微前端架构系统。

三》single-spa和qiankun的关系

微前端需要解决的问题分为两大类:

1、应用的加载与切换

        应用的加载与切换要解决的问题包括: 路由问题、应用入口、应用加载

2、应用的隔离与通信

        应用的隔离与通信需要解决的问题包括:js隔离、css样式隔离、应用间通信

 四》原理概述

1、路由

【1】single-spa是通过监听hashChange和popState这两个原生事件来检测路由变化的

【2】当路由变化时,single-spa会监听到,并触发urlReroute

【3】接着它会调用reroute,该函数正确设置各个应用的状态后调用getAppChanges获取 待清除、待卸载、待加载、待挂载4种不通状态下应用的数据。

【4】对不同的数组执行不同的生命周期方法。

流程图如下:

 

2、应用入口

        只要你的应用实现了 bootstrap 、mount 和 unmount 三个生命周期钩子,有这三个函数导出,我们的框架应用就可以知道如何加载这个子应用。这三个钩子也正好是子应用的生命周期钩子。当子应用第一次挂载的时候,我们会执行 bootstrap 做一些初始化,然后执行 mount 将它挂载。当你应用切换走的时候,我们会执行 unmount 把应用卸载掉。

 3、应用加载

qiankun采用的应用加载是在运行是通过加载子应用的HTML。

【1】检查是否有缓存,如果有,直接从缓存中返回

【2】如果没有则通过fetch函数去下载配置的html入口、并返回字符串

【3】通过process函数处理字符串、返回模版、外联脚本、外联样式、和应用入口脚本。

【4】调用getEmbedHTML把外联的样式下载下来,并替换到模板内,使其变成内部样式

【5】返回一个对象,该对象包含处理后的模板,以及getExternalScripts、getExternalStyleSheets、execScripts等几个核心方法。

应用加载及process函数处理流程图:

 4、JS隔离

qiankun的隔离方式有两种:

•基于proxy对全局window生成一个代理对象

 

•通过快照沙箱在沙箱挂载和卸载的时候记录快照,在应用切换的时候依据快照恢复环境。

 5、样式隔离

qiankun内置了两种样式隔离的方法:

•ShadowDOM

•样式隔离 RFC

 6、应用间通信

        基于一个全局的globalState对象。这个对象由基座应用负责创建,内部包含一组用于通信的变量,以及两个分别用于修改变量值和监听变量变化的方法:setGlobalState和onGlobalStateChange。

 三、总结

        虽然阿里说:“可能是你见过最完善的微前端解决方案🧐”。但是qiankun 也有一些事情没有做的。比如没有对 localStorage 进行隔离,如果多个子应用都用到 localStorage 就有可能冲突了,除此之外,还有 cookie, indexedDB 的共享等。

附demo

GitHub - 14130110048/qiankun-demo: 微前端-qiankun框架demo

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

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

相关文章

2023.04.16 学习周报

文章目录摘要文献阅读1.题目2.摘要3.简介4.Dual-Stage Attention-Based RNN4.1 问题定义4.2 模型4.2.1 Encoder with input attention4.2.2 Decoder with temporal attention4.2.3 Training procedure5.实验5.1 数据集5.2 参数设置和评价指标5.3 实验结果6.结论MDS降维算法梯度…

亚马逊listing如何提高?测评要满足什么条件?

为什么有些大卖就可以卖得很好,而有些卖家始终都做不起来?其中的影响因素之一就是listing,listing页面做得好,转化率自然就提高了。而这其中的原理还需要卖家去具体了解亚马逊的算法。 首先来看一下亚马逊最大的流量搜索&#xf…

第十三届蓝桥杯Web组国赛真题 开学礼物大放送

介绍 又是一年开学季,蓝桥为大家准备了开学礼物,想制作一个页面来宣传一下该活动。 本题需要按照要求完成一个以“开学季”为主题的页面布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: ├─…

微服务-微服务为什么要用到 API 网关

什么是微服务 微服务架构(通常简称为微服务)是指开发应用所用的一种架构形式。通过微服务,可将大型应用分解成多个独立的组件,其中每个组件都有各自的责任领域。 在处理一个用户请求时,基于微服务的应用可能会调用许多…

C语言标准CRC-16校验函数

C语言标准CRC-16校验函数 CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。获得的校验码是随数据绑定获得。 CRC校验原理及标准CRC-8校验函数可参考:C语言标准CRC-8校验函数。…

48.现有移动端开源框架及其特点—MDL(mobile-deep-learning)

48.1 功能特点 一键部署,脚本参数就可以切换ios或者android支持iOS gpu运行MobileNet、squeezenet模型已经测试过可以稳定运行MobileNet、GoogLeNet v1、squeezenet、ResNet-50模型体积极小,无任何第三方依赖。纯手工打造。提供量化函数,对32位float转8位uint直接支持,模型…

嵌套列表,与摩尔投票进阶

title: “Python fishC 22” author: “hou wei” date: “2023-04-16” output: html_document knitr::opts_chunk$set(echo TRUE)问答题 0.请问 运算符和 is 运算符有什么区别呢? 在Python中运算符用于比较两个变量的值是否相等,而is运算符用于判断…

2023年MathorCup数模A题赛题详细思路

MathorCup俗称妈杯,是除了美赛国赛外参赛人数首屈一指的比赛,而我们的妈杯今天也如期开赛。今年的妈杯难度,至少在我看来应该是2023年截至目前来讲最难的一场比赛。问题的设置、背景的选取等各个方面都吐露着我要难死你们的想法。难度是恒定的…

MySQL-自带工具介绍

目录 🍁mysql 🍁mysqladmin 🦐博客主页:大虾好吃吗的博客 🦐MySQL专栏:MySQL专栏地址 MySQL数据库不仅提供了数据库的服务器端应用程序,同时还提供了大量的客户端工具程序,如mysql&a…

elasticsearch——自动补全

拼音分词器 当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址: GitHub - medcl/elasticse…

考研数二第十六讲 不定积分-换元积分和分部积分以及有理函数的积分

第一类换元积分法——凑微分法 假设现在我们要对一个复合函数f[g(x)] 求不定积分,但我只有∫f(x)dxF(x)\int f(x)dx F(x)∫f(x)dxF(x) 这一积分公式。这时候就要想,要是中括号里不是g(x) 而是 x该多好啊。 如果我直接令ug(x) ,强行让原式变…

Redis 如何使用 Twemproxy 和 Sentinel 构建高可用集群架构?

文章目录Redis 如何使用 Twemproxy 和 Sentinel 构建高可用集群架构?配置环境构建 RedisSharding1安装 Redis配置 RedisSharding1构建 RedisSharding2安装 Redis配置 RedisSharding2构建 Sentinel Cluster配置 Sentinel启动 Sentinel构建 Twemproxy Cluster安装 Twe…

AI 腾讯云人脸核身之独立H5接入

一、概述 人脸识别,使用官方API:腾讯云人脸核身之独立H5接入。接口官方返回code 0 表示成功,其他code码值均为对应码值信息,详见错误码。 注意: 1.合作方上送身份信息的计算签名参数与启动人脸核身计算签名参数不一致&#xff0…

Python-DQN代码阅读(13)

目录 1.代码 1.1 代码阅读 1.2 代码分解 1.2.1 导入库 1.2.2 data np.loadtxt(performance.txt) 1.2.3 mva np.zeros((data.shape[0]), dtypenp.float) 1.2.4 mva[i] data[i,1],mva[i] alpha * data[i,1] (1.0 - alpha) * mva[i-1] 1.2.5 plt.plot(data…

【C++项目】高并发内存池

前言: 本篇博客大致记录基于tcmalloc实现高并发内存池的思想与实现方案。 使用语言:C,编译器:vs2022,开始时间:2023/4/3,结束时间:2023/4/12。 项目源码地址:Cproject: 我…

第八天并发编程篇

一、简述线程、进程、程序的基本概念? 1.进程: 我们把运行中的程序叫做进程,每个进程都会占用内存与CPU资源,进程与进程之间互相独立. 2.线程: 线程就是进程中的一个执行单元,负责当前进程中程序的执行。一个进程可以包含多个线程…

【电子秤方案】LCD口袋秤芯片方案

LCD高精度口袋电子秤方案,即便携式称重仪,是一种应用于生活中的称重设备。便珠宝秤具有体积小、重量轻、功耗低、结构紧凑等特点。 LCD高精度口袋电子秤方案产品简介 口袋电子秤是一种体积小、重量轻、功耗低,可用于多种场合的电子秤。它通常…

如何检查 Linux 内存使用量是否耗尽?这5个命令堪称绝了!

在 Linux 操作系统中,内存是一个关键资源,用于存储正在运行的程序和操作系统本身的数据。如果系统的内存使用量过高,可能会导致性能下降、应用程序崩溃或者系统崩溃。因此,了解如何检查 Linux 内存使用量是否耗尽是非常重要的。下…

【网络安全】文件上传绕过思路

引言 分享一些文件上传绕过的思路,下文内容多包含实战图片,所以打码会非常严重,可多看文字表达;本文仅用于交流学习, 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人…

什么是划分子网?网络工程师划分子网有啥技巧?

随着互联网的快速发展,越来越多的组织和企业在其内部建立了复杂的网络系统来满足日常的信息传输和资源共享需求。而在这些网络系统中,划分子网(也称为子网划分)作为一种常见的网络管理方法,为组织和企业提供了更加灵活…