qiankun微前端框架处理

https://blog.csdn.net/qq_41694291/article/details/113842872

答题分为以下几点
  • 什么是微前端,为什么要用(解决什么问题)
  • 优势
  • 常见的微前端方案有哪些
  • 我们用的是哪个微前端方案
  • qiankun与single-spa相比好在什么地方
什么是微前端,为什么要用(解决什么问题)

概念:微前端的概念借鉴于后端的微服务,一般以业务功能为拆分单元
解决问题:大型项目的变更、扩展、维护困难的问题

优势
  • 技术兼容性好、子应用可以基于不同的技术框架
  • 拆分后体积变小,代码内聚性更强,每个子应用只是一个业务模块
  • 能够独立开发、编译、部署
  • 耦合性低,可独自开发,互不干扰
  • 可维护和扩展性好,可专门升级某一个功能
缺点

总体积变大,插件可上传cdn,但公共函数资源不便于共享

常见的微前端方案有哪些

iframe:隔离性和兼容性好,性能和使用感差(性能差因为不会有缓存,每次重新加载)
基座模式:基于路由分发,由基座监听路由变化,加载不同的应用,实现应用解耦,single-spa、qiankun
组合式集成:组件单独打包发布,类似于npm包
EMP:主要基于Webpack5 Module Federation
web components:micro-app(京东的)

Web Components

微前端(Micro Frontends)是一种前端架构风格,通过将大型单体应用程序分解为一组小型、自治的功能块,来提高应用程序的可维护性、可扩展性和可重用性。

Web Components 是一组浏览器标准和 API,允许开发者创建可重用的自定义 HTML 元素和组件。它由三个主要技术组成:Custom Elements、Shadow DOM 和 HTML Templates。Web Components 提供了一种用于封装和复用 HTML、CSS 和 JavaScript 的机制,类似于 React 和 Vue 等现代前端框架提供的组件化机制。

微前端和 Web Components 的结合,即为微前端 WebComponents。在微前端 WebComponents 架构中,每个小型功能块都被打包为一个 Web Component,这些 Web Components 可以独立开发、测试和部署。在运行时,这些 Web Components 被加载到一个主应用程序中,以组成一个完整的应用程序。这种架构风格使得应用程序更易于扩展、升级和维护,同时也可以提高开发效率和团队协作能力。

微前端 WebComponents 架构中的主应用程序负责加载和管理所有子应用程序,同时还提供了一些公共的基础设施,例如路由、状态管理和通信机制等。每个子应用程序都是一个自治的 Web Component,它们可以使用任何前端框架或库来实现功能,甚至可以使用不同的技术栈来开发。在运行时,这些子应用程序可以被独立部署和升级,不会影响到整个应用程序的稳定性和可用性。

micro-app

https://juejin.cn/post/7210747150815936569#heading-35
micro-app并没有沿袭single-spa的思路,而是借鉴了 WebComponents 的思想,通过 CustomElement 结合自定义的 ShadowDom,将微前端封装成一个类 WebComponents 组件,从而实现微前端的组件化渲染。并且由于自定义 ShadowDom 的隔离特性,micro-app不需要像single-spa和qiankun一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改 webpack 配置,是目前市面上接入微前端成本最低的方案。

为什么不用iframe

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

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

我们采用的是qiankun,主要思路是将一个大应用,拆分为更小的、可独立开发、测试、部署的子应用。

传统的大型项目:所有模块都在一个应用里,由应用本身负责路由管理,属于应用分发路由方式
拆分微应用的项目:属于基座模式下的系统架构,各应用互相独立,单独运行在不同的服务上,基座(基座一般是用户最终访问的应用)根据路由去加载不同的应用到页面上,即路由分发应用方式

qiankun与single-spa对比

微前端主要需要解决的问题有两个

  • 应用加载与切换
  • 应用隔离与通信


    image.png

qiankun和single-spa对比

image.png

activePath与当前的hash对比一致

shadow dom 怎么处理antd 的modal样式问题的

https://cloud.tencent.com/developer/beta/article/2212257

一些组件可能会越过 Shadow Boundary 到外部 Document Tree 插入节点,而这部分节点的样式就会丢失;比如 antd 的 Modal 就会渲染节点至 ducument.body ,引发样式丢失
针对刚才的 antd 场景你可以通过他们提供的 ConfigProvider.getPopupContainer API 来指定在 Shadow Tree 内部的节点为挂载节点,但另外一些其他的组件库,或者你的一些代码也会遇到同样的问题,需要你额外留心。
此外 Shadow DOM 场景下还会有一些额外的事件处理、边界处理等问题

qiankun是怎么做到技术栈无关的

1、通信协议的制定和实现
  • 基于浏览器提供的“postMessage”接口实现通用的通信协议,通过该协议,不同的字应用之间可以进行数据传输和通信,实现了子应用的解耦,
  • 该协议定义了一些标准的消息格式和字段,从而保证了不同技术栈之间的兼容性和通用性。
  • 同时,qiankun 还提供了一些 API,可以方便地进行消息的发送和接收。
2、模块加载器设计和实现
  • qiankun 内部使用了一个独立的模块加载器来加载和执行不同的子应用。该加载器可以根据不同的子应用需求,选择合适的技术栈进行加载和执行。
  • 加载器还支持动态加载和卸载子应用,从而实现了应用的动态扩展和升级。
  • 在加载子应用时,加载器会对子应用的代码进行适当的转换和处理,从而保证了不同技术栈之间的兼容性和互相隔离性。
3、沙箱设计与实现(single spa没有)
  • 使用了一个沙箱来隔离不同子应用之间的代码和数据。
  • 该沙箱可以在不同技术栈之间进行隔离,并且支持在子应用中使用全局变量和函数。
  • 沙箱的实现依赖于一些浏览器提供的安全特性,如 iframe 和 Content Security Policy(CSP),从而保证了应用的安全性。

模块加载器

微前端框架 qiankun 内部使用了一个独立的模块加载器来加载和执行不同的子应用,该加载器实现技术栈无关的特性。具体来说,模块加载器的设计和实现主要包括以下几个方面:

  • 加载子应用的配置:在加载子应用时,模块加载器需要通过一些配置信息来了解子应用的相关信息。这些信息包括子应用的名称、入口 URL、运行时参数等。模块加载器会根据这些配置信息来选择合适的技术栈进行加载和执行。

  • 加载子应用的代码:模块加载器会通过浏览器提供的动态创建 script 标签的方式,加载子应用的代码。在加载代码时,模块加载器会对代码进行适当的转换和处理,以保证不同技术栈之间的兼容性和互相隔离性。例如,在加载 React 应用时,模块加载器会通过 Babel 转译 ES6 代码和 JSX 语法,以保证在不支持这些语法的浏览器中也能够正常运行。

  • 执行子应用的代码:加载器在加载子应用代码后,需要执行该代码来启动子应用。在执行代码时,模块加载器会创建一个独立的运行环境,用来隔离不同子应用之间的代码和数据。该运行环境基于浏览器提供的 iframe 技术,从而实现了代码和数据的互相隔离。同时,该运行环境还支持在子应用中使用全局变量和函数,从而实现了一定的共享性。

  • 动态加载和卸载子应用:模块加载器还支持在运行时动态加载和卸载子应用。在加载子应用时,模块加载器会创建一个独立的 iframe,用来隔离该子应用的代码和数据。在卸载子应用时,模块加载器会销毁该 iframe,并清除该子应用的代码和数据,从而释放内存和资源。

沙箱

在微前端框架 qiankun 中,沙箱是实现子应用之间隔离的核心组件之一,它能够在不同技术栈之间进行隔离,从而确保每个子应用的运行环境都是独立的。沙箱的设计和实现主要包括以下几个方面:

  • 运行环境的隔离:沙箱首先需要在运行环境层面进行隔离,确保每个子应用运行在自己的沙箱中。为此,沙箱会利用浏览器提供的 iframe 技术创建独立的运行环境,从而实现每个子应用的隔离。

  • 代码隔离:沙箱还需要确保每个子应用的代码之间互相隔离,从而防止代码之间的冲突。为此,沙箱会使用 JavaScript 的沙箱技术,通过运行子应用代码的方式来实现隔离。具体来说,沙箱会创建一个 JavaScript 上下文环境,将子应用的代码加载进去,并运行该代码,从而实现代码的隔离。

  • DOM 隔离:沙箱还需要确保每个子应用之间的 DOM 结构互相隔离,从而防止样式和脚本之间的冲突。为此,沙箱会使用 Shadow DOM 技术,将子应用的 DOM 结构封装在一个 Shadow DOM 中,从而确保 DOM 的隔离。

  • 全局变量隔离:沙箱还需要确保每个子应用之间的全局变量互相隔离,从而防止变量的冲突。为此,沙箱会使用 Proxy 技术,将子应用的全局变量封装在一个 Proxy 中,并拦截该 Proxy 的读写操作,从而实现全局变量的隔离。

通过以上几个方面的设计和实现,沙箱能够在不同技术栈之间进行隔离,从而确保每个子应用的运行环境都是独立的,并且代码、DOM 和全局变量之间不会相互干扰。这为微前端框架 qiankun 的技术栈无关特性提供了坚实的保障。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 一、什么是微前端 微前端就是将不同的功能按照不同的维度拆分成多个子应用。通过主应用来加载这些子应用。微前端的核心在...
    symY_Y阅读 8,231评论 1 5
  • 背景 随着项目的演进,前端的业务架构也会变得更加庞大、复杂,并常常会出现需要模块复用的场景:1、组件复用,例如统一...
    Ygria阅读 5,154评论 1 5
  • 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略. 微前...
    lean_阅读 2,523评论 0 7
  • 一、什么是微前端 Techniques, strategies and recipes for building ...
    梅西爱骑车阅读 3,132评论 0 15
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53