首页 > 其他分享 >微前端方案

微前端方案

时间:2024-05-20 18:44:24浏览次数:19  
标签:方案 应用 前端 webcomponent js iframe 沙箱 路由

https://www.yinaor.com/docs/front/micro/micro-solution

 

微前端方案

iframe

使用 iframe 其实就可以做到多个子应用放到一个主应用的效果,但是有优点也有缺点:

✔️优点
  • 非常简单,使用没有任何心智负担
  • web应用隔离的非常完美,无论是js、css、dom都完全隔离开来
❌缺点
  • 路由状态丢失,刷新一下,iframe的url状态就丢失了
  • dom割裂严重,弹窗只能在iframe内部展示,无法覆盖全局
  • web应用之间通信非常困难
  • 每次打开白屏时间太长,对于SPA 应用来说无法接受

qiankun

single-spa是一个目前主流的微前端技术方案,其主要实现思路:

  • 预先注册子应用(激活路由、子应用资源、生命周期函数)
  • 监听路由的变化,匹配到了激活的路由则加载子应用资源,顺序调用生命周期函数(bootstrap、mount、unmount,分别对应初始化、渲染和卸载)并最终渲染到容器

乾坤微前端架构则进一步对 single-spa 方案进行完善,主要的完善点:

  • 子应用资源由 js 列表修改进为一个 url,大大减轻注册子应用的复杂度
  • 实现应用隔离,完成 js 隔离方案 (window 工厂、proxy、with(window){}) 和 css 隔离方案 (shadowDom、类 vue 的 scoped)
  • 增加资源预加载能力,预先子应用 html、js、css 资源缓存下来,加快子应用的打开速度
✔️优点
  • 监听路由自动的加载、卸载当前路由对应的子应用
  • 完备的沙箱方案,js沙箱做了SnapshotSandbox、LegacySandbox、ProxySandbox三套渐进增强方案,css沙箱做了两套strictStyleIsolation、experimentalStyleIsolation两套适用不同场景的方案
  • 路由保持,浏览器刷新、前进、后退,都可以作用到子应用
  • 应用间通信简单,全局注入
❌缺点
  • 基于路由匹配,无法同时激活多个子应用,也不支持子应用保活
  • 改造成本较大,从 webpack、代码、路由等等都要做一系列的适配
  • css 沙箱无法绝对的隔离,js 沙箱在某些场景下执行性能下降严重
  • 无法支持 vite 等 ESM 脚本运行

micro-app

micro-app 是基于 webcomponent + qiankun sandbox 的微前端方案,号称是目前市面上接入微前端成本最低的方案。

micro-app 并没有沿袭 single-spa 的思路,而是借鉴了 WebComponent 的思想,通过 CustomElement 结合自定义的 ShadowDom,将微前端封装成一个类 WebComponent 组件,从而实现微前端的组件化渲染。

并且由于自定义 ShadowDom 的隔离特性,micro-app 不需要像 single-spa 和 qiankun 一样要求子应用修改渲染逻辑并暴露出方法,也不需要修改 webpack 配置。

✔️优点
  • 使用 webcomponet 加载子应用相比 single-spa 这种注册监听方案更加优雅
  • 复用经过大量项目验证过 qiankun 的沙箱机制也使得框架更加可靠
  • 组件式的 api 更加符合使用习惯,支持子应用保活
  • 降低子应用改造的成本,提供静态资源预加载能力
❌缺点
  • css 沙箱依然无法绝对的隔离
  • 支持 vite 运行,但必须使用 plugin 改造子应用,且 js 代码没办法做沙箱隔离
  • 对于不支持 webcompnent 的浏览器没有做降级处理

无界

官网列出了无界方案的详细介绍:

应用加载机制和 js 沙箱机制

将子应用的 js 注入主应用同域的 iframe 中运行,iframe 是一个原生的 window 沙箱,内部有完整的 history 和 location 接口,子应用实例 instance 运行在 iframe 中,路由也彻底和主应用解耦,可以直接在业务组件里面启动应用。

路由同步机制

在 iframe 内部进行 history.pushState,浏览器会自动的在 joint session history 中添加 iframe 的 session-history,浏览器的前进、后退在不做任何处理的情况就可以直接作用于子应用

劫持 iframe 的 history.pushState 和 history.replaceState,就可以将子应用的 url 同步到主应用的 query 参数上,当刷新浏览器初始化 iframe 时,读回子应用的 url 并使用 iframe 的 history.replaceState 进行同步

iframe 连接机制和 css 沙箱机制

无界采用 webcomponent 来实现页面的样式隔离,无界会创建一个 wujie 自定义元素,然后将子应用的完整结构渲染在内部

子应用的实例 instance 在 iframe 内运行,dom 在主应用容器下的 webcomponent 内,通过代理 iframe 的 document 到 webcomponent,可以实现两者的互联。

将 document 的查询类接口:getElementsByTagName、getElementsByClassName、getElementsByName、getElementById、querySelector、querySelectorAll、head、body 全部代理到 webcomponent,这样 instance 和 webcomponent 就精准的链接起来。

当子应用发生切换,iframe 保留下来,子应用的容器可能销毁,但 webcomponent 依然可以选择保留,这样等应用切换回来将 webcomponent 再挂载回容器上,子应用可以获得类似 vue 的 keep-alive 的能力.

通信机制

承载子应用的 iframe 和主应用是同域的,所以主、子应用天然就可以很好的进行通信,在无界我们提供三种通信方式

  1. props 注入机制 子应用通过 $wujie.props 可以轻松拿到主应用注入的数据
  2. window.parent 通信机制 子应用 iframe 沙箱和主应用同源,子应用可以直接通过 window.parent 和主应用通信
  3. 去中心化的通信机制 无界提供了 EventBus 实例,注入到主应用和子应用,所有的应用可以去中心化的进行通信
✔️优点
  • 多应用同时激活在线 框架具备同时激活多应用,并保持这些应用路由同步的能力
  • 组件式的使用方式 无需注册,更无需路由适配,在组件内使用,跟随组件装载、卸载
  • 应用级别的 keep-alive 子应用开启保活模式后,应用发生切换时整个子应用的状态可以保存下来不丢失,结合预执行模式可以获得类似 ssr 的打开体验
  • 纯净无污染
    • 无界利用 iframe 和 webcomponent 来搭建天然的 js 隔离沙箱和 css 隔离沙箱
    • 利用 iframe 的 history 和主应用的 history 在同一个 top-level browsing context 来搭建天然的路由同步机制
    • 副作用局限在沙箱内部,子应用切换无需任何清理工作,没有额外的切换成本
  • 性能和体积兼具
    • 子应用执行性能和原生一致,子应用实例 instance 运行在 iframe 的 window 上下文中,避免 with(proxyWindow){code} 这样指定代码执行上下文导致的性能下降,但是多了实例化 iframe 的一次性的开销,可以通过 preload 提前实例化
    • 体积比较轻量,借助 iframe 和 webcomponent 来实现沙箱,有效的减小了代码量
  • 开箱即用 不管是样式的兼容、路由的处理、弹窗的处理、热更新的加载,子应用完成接入即可开箱即用无需额外处理,应用接入成本也极低

标签:方案,应用,前端,webcomponent,js,iframe,沙箱,路由
From: https://www.cnblogs.com/chinasoft/p/18202591

相关文章

  • 【前端】鼠标捕获元素信息
    functiongetElementXPath(element){if(element.id!==''){return'//*[@id="'+element.id+'"]';}if(element===document.body){return'/html/body';......
  • Google Cloud Next ’24 Recap 开启 AI 新篇章,Cloud Ace 独立解决方案助力企业降本增
    北京时间2024年4月26日,CloudAce云一受邀参与GoogleCloudNext’24Recap在深圳的线下活动,并设置展位。本次活动主要聚焦于Next’24(LasVegas)成果展示,给中国客户和开发者深入解读GoogleCloudNext’24大会上Gemini、VertexAI、BigQuery等产品服务的重要更新,展示了......
  • Liunx下通过netcore接口生成前端图片的问题。
    用netcore来生成前端微信Native支付的二维码。1、首先CentOS7.0要安装libgdiplus,命令如下:yuminstalllibgdiplus-devel,然后重启netcore服务。//这个地方要注意,网上有不少例子的下载命令是错的,有的时候安装不上。2、Vs代码使用QRCoder库,代码如下publicstaticMemoryStream......
  • 页面切换保存怎么实现数据不丢失且记忆滚动条位置,常规的方案会闪一下,不如原生性能,怎么
    要实现在页面切换时保存数据状态且记忆滚动条位置,同时避免闪烁现象,可以采用以下几种策略来优化用户体验,这些策略尤其适用于单页面应用(SPA)如Vue或React应用中:1.使用Keep-Alive(Vue中)在Vue中,可以利用<keep-alive>组件来缓存组件实例,这样在切换页面时,组件不会被销毁和重新创建,从而......
  • Dalsa SDK弹窗报错解决方案-Resource In Use
    问题描述使用Dalsa的CameraLink相机时,代码调用Snap函数和Grab函数时,弹窗报错,详细报错信息是”Errorin"CorXferSelectEX"Resourceinuse“。见下图:解决办法:在每次调用snap函数或者grab函数前,先调用abort函数,将上一帧残留数据强制结束。按照上述办法测试,弹窗报错频率明显较......
  • 在数据结构上,后端要求前端在一个对象中添加一个类型字段,并且对该对象的某些属性中都加
    这个需求的合理性取决于具体的应用场景和目的。让我们分析一下:合理性的一面:简化逻辑处理:如果这个类型字段是为了在后端快速区分或过滤不同类型的对象属性,那么在前端就做好标记,可以简化后端处理逻辑,减少在后端进行类型判断的需要。一致性保证:在前端加入类型字段并确保它与对象......
  • TSN和DDS测试解决方案
    时间敏感网络TSN技术是基于统一的网络时间,通过调度机制管理通信数据流,最终实现确定性与可预期的以太网通信系统。时间敏感网络TSN技术旨在提升以太网网络的实时性和可靠性,并提供灵活的网络资源管理。该技术的应用主要来源于传统以太网技术在面对实时性、确定性和低延迟等严苛要求......
  • 比如开发过程中,后端要求前端将一些没有必要的前端不需要的字段原封不动的传递回去,这样
    后端要求前端将一些不必要的字段原封不动地传递回来,这种做法通常并不合理,主要原因如下:增加数据传输负担:每次请求包含额外无用的字段会增加数据传输的体积,特别是在移动设备或网络条件不佳的情况下,这可能导致响应速度变慢,影响用户体验。资源浪费:无论是服务器带宽、内存还是CPU......
  • 多级审批流程设计方案以及开发思路
    工作流程设计说明顺序审核流程:各个审核节点依次逐级进行,每个节点上只能设置一个审核岗位或审核人,任意一个节点审核不通过将导致审核被驳回,不再继续流转到下一个节点。并行会审:审核节点需要多个人参与审核,所有审核人需同时审核通过才能进入下一个节点;任何一个人不同意都会......
  • 性能实战训练营 - 前端性能分析 - 慧测
     通过火狐浏览器,浏览网站,(开启了yslow)(类似的谷歌的工具是pagespeed)得到页面上各项的得分(参考高性能网站建设指南),字母越靠后,分值越低。 点击可查看详情空点击Componects,查看各个资源的压缩情况和请求消耗时间: 查看yslow的完整报告:danatrace工具可以分析js性能......