当前位置: 首页 > article >正文

模块联邦:更快的微前端方式!

什么是模块联邦

在前端项目中,不同团队之间的业务模块可能有耦合,比如A团队的页面里有一个富文本模块(组件),而B团队 的页面恰好也需要使用这个富文本模块。

传统模式下,B团队只能去抄A团队的代码,把这个组件放到自己的项目了。

为了解决不同服务之间组件共享的问题,Webpack 的模块联邦功能应用而生。借助模块联邦,可以在B服务运行时,动态加载A服务暴露的模块。

Vite通过vite-plugin-federation 插件也可以实现

模块联邦的核心优势

结合模块联邦的原理与功能,它具有以下显著优势:

  • 独立部署:各个应用可独立开发、构建和部署,互不依赖。
  • 运行时共享:模块在运行时动态加载,无需在构建阶段打包进主应用。
  • 版本控制:支持为共享模块指定版本,便于多项目之间的依赖管理。
  • 减少重复代码:多个应用可共享功能模块,避免重复实现。

相比 qiankun 等微前端方案,模块联邦在灵活性上更具优势。qiankun 侧重于加载整个子应用,而模块联邦支持按需加载特定模块,粒度更细,使用更灵活。

如何实现

以Vite+Vue为例。

假设我们有 Vite 应用:

  • **ui-library**:组件提供者,暴露一个按钮组件 SharedButton.vue
  • **main-app**:主应用,运行时动态加载 ui-library 中的按钮组件来使用。
shixiaoshi-demo/
│
├── ui-library/     # 远程模块:暴露组件
│   ├── src/SharedButton.vue
│   ├── vite.config.js
│
└── main-app/       # 主项目:加载远程组件├── src/App.vue├── vite.config.js

1、安装模块联邦插件

我们需要使用 vite-plugin-federation 插件。

npm install vite-plugin-federation --save-dev

2、暴露组件

  • ui-library/src/SharedButton.vue
<template><button class="shared-btn">我是共享按钮</button></template><script setup></script><style scoped>.shared-btn {padding: 10px;background-color: teal;color: white;border: none;border-radius: 5px;
}
</style>
  • ui-library/vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import federation from '@originjs/vite-plugin-federation';export default defineConfig({plugins: [vue(),federation({name: 'ui_library',filename: 'remoteEntry.js',exposes: {'./SharedButton': './src/SharedButton.vue',},shared: ['vue'],}),],build: {target: 'esnext',minify: false,cssCodeSplit: false,},
});

启动服务

npm run dev -- --port=5001

暴露地址:http://localhost:5001/assets/remoteEntry.js

3、加载远程组件

  • main-app/vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import federation from '@originjs/vite-plugin-federation';export default defineConfig({plugins: [vue(),federation({name: 'main_app',remotes: {ui_library: 'http://localhost:5001/assets/remoteEntry.js',},shared: ['vue'],}),],
});
  • main-app/src/App.vue
<template><div><h1>主应用</h1><RemoteButton /></div></template><script setup>import { defineAsyncComponent } from 'vue';// 从 ui-library 中动态加载共享组件
const RemoteButton = defineAsyncComponent(() => import('ui_library/SharedButton'));
</script>
  • 启动主应用
npm run dev

访问 http://localhost:5173,你会看到来自 ui-library 的按钮组件成功渲染!

主应用与子组件关系图

main-app (主应用)|| -- 在运行时访问 -->|    http://localhost:5001/assets/remoteEntry.js|| -- 加载 -->|    ui-library 中暴露的 SharedButton.vue|| -- 使用 -->|    作为主应用的本地组件一样渲染

缺陷

在实际使用中,模块联邦也存在一些问题。

以我们项目开发中遇到的问题为例,当应用 A 加载应用 B 中的某个组件时,B 的代码执行环境会落在 A 的作用域下。这会带来一些潜在影响:

  • 依赖冲突问题:如果 B 服务依赖特定版本的 Vue,而 A 服务的 Vue 版本不同,实际运行时组件会使用 A 的 Vue 实例,可能导致行为异常,特别是在响应式系统、生命周期等细节方面。
  • 状态失效问题:如果 B 中的组件依赖 Vuex 或 Pinia 等状态管理工具,运行时由于上下文切换,可能无法正确获取或响应状态,导致 store 在远程加载后失效。
  • 构建配置差异问题:例如,B 使用了自动引入插件(如 unplugin-auto-import),可以在代码中直接使用 refcomputed 等 Vue API 而无需显式导入;但若 A 没有启用相同插件,加载 B 的组件时会因缺少这些 API 导致运行错误,除非显式引入相关函数。

因此,在使用模块联邦时,建议主应用与远程模块在框架版本、构建工具、插件配置等方面尽可能保持一致,或通过适配包装进行隔离,以减少因上下文差异带来的问题。

关于我

一个热爱技术分享的资深前端工程师,技术栈为Vue、React、Threejs,当然对一些前沿的技术也比较感兴趣,如微前端、鸿蒙开发、油猴脚本开发等。
如果你对前端技术也充满热爱或者希望关注一些前沿技术,欢迎加群讨论~

当然,如果你有任何面试、工作上遇到的技术问题也都可以在群里提问,有时间我就会及时回答~

相关文章:

模块联邦:更快的微前端方式!

什么是模块联邦 在前端项目中&#xff0c;不同团队之间的业务模块可能有耦合&#xff0c;比如A团队的页面里有一个富文本模块&#xff08;组件&#xff09;&#xff0c;而B团队 的页面恰好也需要使用这个富文本模块。 传统模式下&#xff0c;B团队只能去抄A团队的代码&#x…...

前端基础学习html+css+js

HTML 区块 div标签&#xff0c;块级标签 span包装小部分文本&#xff0c;行内元素 表单 CSS css选择器 css属性 特性blockinlineinline-block是否换行✅ 换行❌ 不换行❌ 不换行可设置宽高✅ 支持❌ 不支持✅ 支持常见元素div容器 p段落 h标题span文本容器 a超链接img图片…...

手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席

手机打电话时将对方DTMF数字转为RFC2833发给局域网SIP坐席 --局域网SIP坐席呼叫 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音菜单&#xff08;完结&#xff09; 下一篇&#xff1a;安卓App识别手机系统弹授权框包含某段文字-并自动点击确定按钮 一、前言 …...

TCP三次握手/四次握手-TCP/IP四层模型-SSL/TLS-HTTP-HTTPS

重要概念 seq ( Squence Number ) 序列号&#xff0c;用于数据排序、去重&#xff0c;防止数据包乱序 ack ( Acknowledgement Number ) 确认好&#xff0c;表示期望接受的下一个字节序号&#xff0c;用于确认数据包被对方接受 TCP三次握手是建立可靠连接的过程&#xff0c;确…...

SAP Business One:无锡哲讯科技助力中小企业数字化转型的智慧之选

数字化转型&#xff0c;中小企业的必经之路 在当今竞争激烈的商业环境中&#xff0c;数字化转型已不再是大型企业的专利&#xff0c;越来越多的中小企业开始寻求高效、灵活的管理系统来优化业务流程、提升运营效率。作为全球领先的企业管理软件&#xff0c;SAP Business One…...

【Ubuntu远程桌面】

Ubuntu-远程桌面 ubuntu环境rustdesk-1.4.0-aarch64.deb安装rustdesk注意事项&#xff1a;报错&#xff1a;可能会在远程连接时候显示‘No displays’解决方法1. 安装 CUDA&#xff08;如果需要&#xff09;2. 解决 XDG 桌面门户问题3. 检查 RustDesk 客户端日志 总结 kill --t…...

⚡ Linux 系统安装与配置 Vim 编辑器(包括 Vim 插件管理器)

⚡ Linux 系统安装与配置 Vim 编辑器&#xff08;包括 Vim 插件管理器&#xff09; &#x1f4cc; 1. Vim 简介 Vim&#xff08;Vi IMproved&#xff09;是一款高度可定制的文本编辑器&#xff0c;基于早期的 vi 编辑器扩展而来。 它支持语法高亮、插件扩展、多种编程语言&am…...

小型语言模型:为何“小”才是“大”?

当说到人工智能&#xff08;AI&#xff09;的时候&#xff0c;大家通常会想到那些拥有数十亿参数的超大型语言模型&#xff0c;它们能做出一些令人惊叹的事情。 厉害不厉害&#xff1f;绝对厉害&#xff01; 但对于大多数企业和开发者来说&#xff0c;实用吗&#xff1f;可能…...

雪花算法:分布式ID生成的优雅解决方案

一、雪花算法的核心机制与设计思想 雪花算法&#xff08;Snowflake&#xff09;是由Twitter开源的分布式ID生成算法&#xff0c;它通过巧妙的位运算设计&#xff0c;能够在分布式系统中快速生成全局唯一且趋势递增的ID。 1. 基本结构 雪花算法生成的是一个64位&#xff08;lo…...

针对PostgreSQL中pg_wal目录占用过大的系统性解决方案

​一、问题现象与根本原因​ 当pg_wal目录占用超过预期&#xff08;如数十GB甚至占满磁盘&#xff09;&#xff0c;通常由以下原因导致 ​长事务未提交​&#xff1a;未完成的事务会阻塞WAL日志清理。​复制槽未释放​&#xff1a;逻辑复制或流复制槽未及时清理&#xff0c;导…...

git push Git远端意外挂断

git push Git远端意外挂断 枚举对象中: 99, 完成. 对象计数中: 100% (99/99), 完成. 使用 8 个线程进行压缩 压缩对象中: 100% (78/78), 完成. send-pack: unexpected disconnect while reading sideband packet 写入对象中: 100% (82/82), 2.78 MiB | 5.56 MiB/s, 完成. 总共…...

python学习day34

GPU训练及类的call方法 知识点回归&#xff1a; CPU性能的查看&#xff1a;看架构代际、核心数、线程数GPU性能的查看&#xff1a;看显存、看级别、看架构代际GPU训练的方法&#xff1a;数据和模型移动到GPU device上类的call方法&#xff1a;为什么定义前向传播时可以直接写作…...

秋招Day12 - 计算机网络 - 网络综合

从浏览器地址栏输入URL到显示网页的过程了解吗&#xff1f; 从在浏览器地址栏输入 URL 到显示网页的完整过程&#xff0c;并不是一个单一的数据包从头到尾、一次性地完成七层封装再七层解析的过程。 而是涉及到多次、针对不同目的、与不同服务器进行的、独立的网络通信交互&a…...

QT-JSON

#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>#include <QFile>#include <QDebug>void createJsonFile() {// 创建一个JSON对象 键值对QJsonObject jsonObj;jsonObj["name"] "John Doe";jsonObj[…...

IP 风险画像技术略解

IP 风险画像的技术定义与价值 IP 风险画像通过整合 IP 查询数据与 IP 离线库信息&#xff0c;结合机器学习算法&#xff0c;为每个 IP 地址生成多维度风险评估模型。其核心价值在于将传统的静态 IP 黑名单升级为动态风险评估体系&#xff0c;可实时识别新型网络威胁&#xff0…...

秋招Day12 - 计算机网络 - 基础

说一下计算机网络体系结构 OSI七层模型&#xff0c;TCP/IP四层模型和五层体系结构 说说OSI七层模型&#xff1f; 应用层&#xff1a;最靠近用户的层&#xff0c;用于处理特定应用程序的细节&#xff0c;提供了应用程序和网络服务之间的接口。表示层&#xff1a;确保从一个系…...

【网络安全】——Modbus协议详解:工业通信的“通用语言”

目录 一、初识Modbus&#xff1a;工业通信的基石 1.1 协议全称 1.2 协议简史 二、核心特性解析 2.1 架构设计 2.2 典型应用场景 三、协议族全景图 3.1 协议栈分类 3.2 版本演进对比 四、协议报文深度解析 4.1 Modbus RTU帧结构 4.2 Modbus TCP报文 五、通信机制实…...

MySQL 数据库备份与恢复利器:Percona XtraBackup 详解

一、XtraBackup 简介 1. 什么是 XtraBackup&#xff1f; XtraBackup 是 Percona 公司推出的免费开源工具&#xff0c;专为 InnoDB/XtraDB 引擎设计&#xff0c;支持 在线物理热备&#xff0c;具备以下核心特性&#xff1a; 非阻塞备份&#xff1a;备份过程中数据库仍可读写。…...

【GlobalMapper精品教程】095:如何获取无人机照片的拍摄方位角

文章目录 一、加载无人机照片二、计算方位角三、Globalmapper符号化显示方向四、arcgis符号化显示方向一、加载无人机照片 打开软件,加载无人机照片,在GLobalmapperV26中文版中,默认显示如下的航线信息。 关于航线的起止问题,可以直接从照片名称来确定。 二、计算方位角 …...

小提琴图绘制-Graph prism

在 GraphPad Prism 中为小提琴图添加显著性标记(如*P<0.05)的步骤如下: 步骤1:完成统计检验 选择数据表:确保数据已按分组排列(如A列=Group1,B列=Group2)。执行统计检验: 点击工具栏 Analyze → Column analyses → Mann-Whitney test(非参数检验,适用于非正态数…...

写作即是生活

一个问题 “我是什么时候开始写作的呢&#xff1f;”请你先暂停一下&#xff0c;别往下读&#xff0c;先想想这个问题。 什么才是写作&#xff1f; 或许在想上个问题之后&#xff0c;你就会开始想问另外一个问题&#xff0c;什么才算是写作呢&#xff1f; 我的回答是&#x…...

进阶知识:Selenium底层原理深度解析

Selenium底层原理深度解析&#xff1a;网络IO密集型系统揭秘 一、Selenium核心组件解析 1.1 三大核心角色 客户端&#xff08;Client&#xff09; 扮演"指挥官"角色&#xff0c;负责&#xff1a; 编写测试脚本&#xff08;模拟用户点击、输入等操作&#xff09;发送…...

基于 Flickr30k-Entities 数据集 的 Phrase Localization

以下示例基于 Flickr30k-Entities 数据集中的标注&#xff0c;以及近期&#xff08;以 TransVG &#xff08;Li et al. 2021&#xff09;为例&#xff09;在短语定位&#xff08;Phrase Grounding&#xff09;任务上的评测结果&#xff0c;展示了单张图片中若干名词短语的定位情…...

[GHCTF 2025]SQL???

打开题目在线环境&#xff1a; 先尝试注入&#xff1a; id1;show databases; 发现报错&#xff0c;后来看了wp才知道这个题目是SQLite注入。 我看的是这个师傅的wp: https://blog.csdn.net/2401_86190146/article/details/146164505?ops_request_misc%257B%2522request%255Fid…...

【科研绘图系列】R语言绘制GO term 富集分析图(enrichment barplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图code 2code 3系统信息介绍 本文介绍了使用R语言绘制GO富集分析条形图的方法。通过加载ggplot2等R包,对GO term数据进行预处理,包括p值转换…...

JavaScript 性能优化实战指南

JavaScript 性能优化实战指南 一、引言 JavaScript 是一种广泛使用的编程语言,尤其在前端开发中占据重要地位。随着 Web 应用的复杂度不断增加,性能优化成为开发过程中不可或缺的一部分。性能优化不仅可以提升用户体验,还能减少服务器负载,提高应用的响应速度。本文将从多…...

达梦数据库:同1台服务器如何启动不同版本的DMAP服务

需求背景&#xff1a; 用户使用资源比较高的服务器&#xff0c;作为测试环境提供服务器&#xff0c;因为在这台服务器&#xff0c;运行了很多个数据库版本实例的情况&#xff0c;但是当dmap版本和数据库版本不一致时&#xff0c;通过dmap备份会报错。 解决办法&#xff1a; 1…...

Laravel单元测试使用示例

Date: 2025-05-28 17:35:46 author: lijianzhan 在 Laravel 框架中&#xff0c;单元测试是一种常用的测试方法&#xff0c;它是允许你测试应用程序中的最小可测试单元&#xff0c;通常是方法或函数。Laravel 提供了内置的测试工具PHPUnit&#xff0c;实践中进行单元测试是保障代…...

Kotlin委托机制使用方式和原理

目录 类委托属性委托简单的实现属性委托Kotlin标准库中提供的几个委托延迟属性LazyLazy委托参数可观察属性Observable委托vetoable委托属性储存在Map中 实践方式双击back退出Fragment/Activity传参ViewBinding和委托 类委托 类委托有点类似于Java中的代理模式 interface Base…...

鸿蒙OSUniApp集成WebAssembly实现高性能计算:从入门到实践#三方框架 #Uniapp

UniApp集成WebAssembly实现高性能计算&#xff1a;从入门到实践 引言 在移动应用开发领域&#xff0c;性能始终是一个永恒的话题。随着计算需求的不断增加&#xff0c;特别是在图像处理、数据分析等领域&#xff0c;如何在跨平台应用中实现高性能计算成为了一个重要课题。本文…...