微前端之桥接方案, 打破技术栈次元壁-实现无缝对接

news/2025/2/21 6:29:08/文章来源:https://www.cnblogs.com/hanyaxxx/p/18723848

简介

1. 微前端桥接方案是什么?

是一种新的微前端解决方案,使用了一种巧妙的方法去实现了微前端架构, 只需通过调用高阶函数即可实现不同技术栈之间的互通

2.何谓无缝?

微应用接入与原生技术栈应用毫无差异,不需要任何额外的信息

3. 为什么需要,是否重复造轮子?

在项目实践落地过程中,调研过和尝过不同的落地方案要么是兼容性问题,要么就是项目改造有点重, css 样式隔离也是一个头疼的问题. 于是 bridge 方案就此诞生了.

现在有很多微前端方案, 为什么要用bridge方案? 先来总结和梳理一下目前主流的几种方法:

1. 基于 Webpack 5 的 Module Federation

  • 优点:可实现第三方依赖共享,减少不必要的代码引入;微应用可动态更新,无需重新打包发布整合应用;去中心化,每个微应用间可直接通信。

  • 缺点:对 webpack5 的依赖度较高,项目若不使用 webpack5 则难以接入。

2. 基于 iframe

  • 优点:实现简单,无需对现有应用进行大量改造;能提供浏览器原生的硬隔离,JS、CSS、DOM 都完全隔离开,互不影响;可通过 postMessage API 进行消息传递。

  • 缺点:无法保持路由状态,刷新后路由丢失,浏览器前进后退功能受限;应用间上下文难以共享,交互困难;弹窗只能在 iframe 内部展示;全量资源加载,性能较差;不利于 SEO。

3. 基于 Web Components + 沙箱

  • 优点:CSS 和 JavaScript 天然隔离,避免样式冲突和脚本污染;原生浏览器支持,不依赖特定框架或库;多个子应用可并存,支持并行开发和独立部署。

  • 缺点:浏览器兼容性存在问题,部分浏览器不完全支持;开发成本较高,可能需要重写现有应用;组件间通信需要额外设计。

4. sigle-spa + 沙箱

  • 优点:技术栈无关,任意技术栈的应用均可接入;采用 HTML entry 接入方式,接入成本低;提供了样式隔离、JS 沙箱、资源预加载等功能。

  • 缺点:样式隔离问题不完善,打包工具有一定限制等,组件通信问题等...

基本上不是样式隔离出了问题,就是兼容性出了问题....

bridge方案和其他微前端方案的区别是什么?

  • 1.使用更简单,使用更自然,无额外知识,通过高阶函数创建桥接组件并直接使用

  • 2.无 iframe 和 shadow dom 的依赖, 兼容性更好

  • 3.组件通信更自然(通过原生 props 属性可进行父子组件通信)

  • 4.可组件化导入子应用/子组件

  • 5.样式隔离问题处理更优(采用css-module 或者 scoped 隔离方案取决于项目自身打包工具的配置)

那如何证明上述结论呢? 废话不多说直接上代码.

代码演示

以react 18 为主应用作为举例, 如果要接入vue2

1. 第一步创建桥接应用

//假设子应用路径为 .children-app/accesstor/Button
import vue from 'vue'
import { createVueBridge } from 'micro-frontend-bridge/for-react'
import Button from './Button.vue'//假设子应用是一个vue2的项目
//为vue2创建一个桥接访问器
const accesstor = createVueBridge(vue)
//访问器是一个高阶函数,用来链接vue button按钮
export default accesstor(Button)

第二步输出桥接组件

通过打包工具将button打包成 lib 输入到主应用里

第三步主应用使用桥接组件

//假设主应用有一个main.jsx文件和bridge文件夹存在桥接组件
//主应用是一个React 18 项目
import React from 'react'
import Button from 'bridge/Button'//在react18中使用vue2的按钮 推荐使用大写组件名称区别桥接组件
const BUTTON = Button(React)const App = () => {return (<div><BUTTON color="grey" /></div>)
}

没错这个时候react 18和 vue2 已经无缝连接了, 那么如何进行组件通信呢?

组件通信也是非常自然的, 直接基于props传递属性即可, 代码中的color属性会传递给vue2的button, 通过回调函数也可以进行父子组件通信与原生通信模式无差异. (末尾有在线地址可以直接实践).

总结一下就是 :

  1. 创建桥接组件
  2. 输出组件
  3. 使用桥接组件

在这里其实第二步打包组件输出lib的过程根据项目架构的特点是可以省去的, 可以把桥接组件放在主应用内,对主应用添加子应用的打包支持,如果你的主应用用的是webpack,那么对子应用添加vue打包支持即可,就可以省略配置打包lib这一步了

示范如下,调整桥接组件目录到主应用

//假设桥接组件应用路径为 bridge/Button
import vue from './children-app/node_modules/vue'
import { createVueBridge } from 'micro-frontend-bridge/for-react'
//这里路径引入做了调整
import Button from '../children-app/Button.vue'//假设子应用是一个vue2的项目
//为vue2创建一个桥接访问器
const accesstor = createVueBridge(vue)
//访问器是一个高阶函数,用来链接vue button按钮
export default accesstor(Button)

调整webpack打包支持

 {test: /\.vue$/,include: [path.resolve(__dirname, 'children-app')],use: {loader: './children-app/node_modules/vue-loader/lib',options: {compiler: Vue2TemplateCompiler}}},

使用组件

//假设主应用有一个main.jsx文件和bridge文件夹存在桥接组件
//主应用是一个React 18 项目
import React from 'react'
import Button from 'bridge/Button'//在react18中使用vue2的按钮 推荐使用大写组件名称区别桥接组件
const BUTTON = Button(React)const App = () => {return (<div><BUTTON color="grey" /></div>)
}

(具体的演示看末尾线连接)

如何优化这个微前端应用?

一般来说微前端接入项目由于不同技术栈的存在, 可能会导致包体积过大的问题, 由于本身bridge方案本身是基于高阶函数实现的,使用动态import和suspense就可以实现按需加载达到优化的目的了.

最后以vue2和vue3做为主应用作为举例子,如果接入react组件

import React from 'react'
import ReactDOM from 'react-dom'
import { h } from 'vue'
import { createReactBridge } from '@micro-frontend-bridge/for-vue'
import { App } from './reactApp.tsx'// create vue3 accessor
const v3reactAccessor = createReactBridge(React, ReactDOM)// create vue2 accessor
const v2reactAccessor = createReactBridge(React, ReactDOM)//bridge react app to vue3
const V3APP = v3reactBridge(h)(App)//bridge react app to vue2
const V2APP = v2reactBridge()(App)

sfc file

<template><V2APP /> 
</template><template><V3APP /> 
</template>

在线演示

点我

仓库地址

hanyaxxx/micro-frontend-bridge

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

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

相关文章

react-native-snap-carousel 轮播图卡在中间的问题

今天在使用react-native-snap-carousel组件的时候,发现一个问题,就是轮播有时候会卡在两个轮播图之间,不左不右的。研究了半天,才发现,开启动量滚动即可 关于enableMomentum的解释 enableMomentum 是 React Native 中 ScrollView 和 FlatList 组件的一个属性,用于控制滚动…

安川机器人维修JZRCR - YPP01 - 1示教器按键故障

在工业生产领域,安川机器人发挥着极为重要的作用。然而,像JZRCR - YPP01 - 1示教器按键出现故障这样的问题会影响机器人的正常运行。一、安川机器人JZRCR - YPP01 - 1示教器按键故障的初步检查外观检查首先,在进行任何深入维修之前,对示教器进行外观检查是必要的。检查按键…

Svelte 最新中文文档教程(13)—— 样式

前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

数据结构选讲-1 总结

数据结构选讲-1 总结 线段树技巧及其应用。 前言 出题特点:树形 \(polylog\) 数据结构为主,尤其线段树。 侧重数据结构维护算法,使用数据结构进行统计。 强调“从具体情境中抽象出合适的数据及目标”的过程。数据结构本质上是要在数据和目标不变的情况下,优化算法复杂度,降…

Jenkins通过私钥连接Node

本文只要提供一种Jenkins通过私钥连接Node的方法。方法不区分Jenkins版本。大体步骤: (1)生成密钥对 (2)Jenkins上使用私钥配置Credentials (3)Node上配置authorized_keys 文件 (4)添加Node实例 下面演示一个实例。 需求:Jenkins通过私钥方式连接Node(app用户)(1)…

基于条件的访问控制——RBAC

网络威胁极为普遍,无论是公共组织还是私营组织,都面临着数据泄露的风险。一个拥有过多权限的账户,就足以让黑客渗透整个组织。为保护组织免受此类事件的影响,可以根据用户的角色和职责来分配权限。基于角色的访问控制(RBAC)便应运而生。 一、什么是基于条件的访问控制(R…

周界入侵智能识别摄像机

周界入侵智能识别摄像机持续捕捉监控区域内的视频流,并将数据实时传输至中央控制系统。目标检测与跟踪:采用深度学习算法,系统能够自动识别画面中的人、动物或其他物体,并对其进行跟踪分析。行为分析:系统通过对目标运动轨迹和行为模式的分析,判断是否存在异常活动。例如…

解锁零食店管理高效密码:精选工具助你制胜市场

零食集合店管理工具的选择对于提高店铺运营效率、优化库存管理、提升客户满意度等方面至关重要。以下是一些关键的零食集合店管理工具及其功能介绍: 一、门店管理软件 ● 板栗看板: 简单易用,适合小型团队使用。 ● Trello: 以看板形式组织任务,适合敏捷开发团队。 ● Asa…

负载均衡下的Webshell连接处理

免责声明 本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。最近打金融项目的时候,webshell遇见了负载均衡,自己之前其实看过相关文章,但是实战操作起来还是遇见了不少坑点的,接下来…

STAR: 利用时空注意力机制和动态频率损失的视频超分辨率增强框架

STAR (Spatial-Temporal Augmentation with Text-to-Video Models) 提出了一种创新的视频超分辨率解决方案,针对现有模型中存在的过度平滑和时间一致性不足等问题进行了系统性改进。该方法基于文本到视频(T2V)扩散模型架构,通过优化时序建模能力,有效处理复杂退化场景下的视…

【GreatSQL优化器-14】直方图应用

【GreatSQL优化器-14】直方图应用 一、直方图介绍 GreatSQL的优化器负责将SQL查询转换为尽可能高效的执行计划,但因为数据环境不断变化有可能导致优化器对查询数据了解不够充足,可能无法生成最优的执行计划进而影响查询效率,因此推出了直方图(histogram)功能来解决该问题。 …

go使用gjson无需转成结构体从json字符中取获字段值

背景:我们一般在go中如果要获取某个json中的值,需要先创建一个结构体,再把json映射为到结构体,再从结构体中取值,不同的json都需要这样操作,太麻烦了。有了gjson后,就可以省去转成结构体的步骤,直接从json中取值,快捷方便,值得推荐! 包地址:https://github.com/tid…