0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

微前端父子应用及兄弟应用间组件或方法共享方案

京东云 来源:jf_75140285 作者:jf_75140285 2024-07-24 14:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景

我们的很多web应用在持续迭代中功能越来越复杂,参与的人员、团队不断增多,导致项目出现难以维护的问题,这种情况PC端尤其常见,微前端为我们提供了一种高效管理复杂应用的方案。但是在使用微前端的过程中,通常会有一些公共方法或公共组件,本文将对如何实现父子应用以及兄弟应用之间进行方法及组件共享提出几种解决方案以及其各自优缺点及适用场景

模块联邦(Module Federation)

webpack5引入了模块联邦,可以让不同的应用共享模块。具体步骤如下:

Remote(提供者模块)

    // webpack.config.js
    module.exports = {
        // 其他配置...
        plugins: [
            new ModuleFederationPlugin({
            name: 'component_app',
            filename: 'remoteEntry.js',
            exposes: {
                './Button': './src/Button.jsx',
                './Dialog': './src/Dialog.jsx',
                './Logo': './src/Logo.jsx',
                './ToolTip': './src/ToolTip.jsx',
            },
            shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
            }),
        ],
    };

作为提供方,component 将自己的 Button、Dialog等组件暴露出去,同时将 react 和 react-dom 这两个依赖共享出去。

host(使用者模块)

    // webpack.config.js
    module.exports = {
        entry: './index.js',
        // ...
        plugins: [
            new ModuleFederationPlugin({
            name: 'main_app',
            //远程访问地址入口 
            remotes: {
                'component-app': 'component_app@https://www.elecfans.com/images/chaijie_default.png/remoteEntry.js',
            },
            shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
            })
        ],
    };

作为消费者的 main 应用需要定义需要消费的应用的名称以及地址,同时 main 应用也将自己的 react 和 react-dom 这两个依赖共享出去。

通过以上方式可以实现不同应用之间共享公共方法和组件,虽然vite本身不支持模块联邦,但是我们可以使用vite-plugin-federation这个插件。
优点

代码共享:不同的微应用可以共享相同的依赖库,减少重复下载和加载,提高性能。

独立部署:各个微应用可以独立开发、测试和部署,减少了团队之间的耦合,提高了开发效率。

动态加载:可以在运行时动态加载模块,按需加载,减少初始加载时间。

版本控制:支持不同版本的模块共存,解决了版本冲突的问题。

团队协作:各个团队可以独立开发自己的模块,减少了对中央仓库的依赖,提高了协作效率。

缺点

对于webpack5以下的应用不支持

复杂性增加:配置和管理模块联邦需要一定的学习成本和经验,增加了项目的复杂性。

调试困难:由于模块是动态加载的,调试和追踪问题可能会变得更加困难。

性能开销:虽然减少了初始加载时间,但动态加载模块可能会在运行时引入额外的性能开销。

依赖管理:需要仔细管理共享依赖的版本,避免潜在的兼容性问题。

安全性:动态加载外部模块可能会引入安全风险,需要额外的安全措施来防止恶意代码注入。

NPM包

将共享组件打包成一个 NPM 包,然后在父子应用中分别安装和使用。

创建共享组件/方法库

import React from 'react';
const SharedComponent = () => 

Shared Component

; export default SharedComponent;

发布到NPM

npm publish

在父应用和子应用中安装

npm install shared-component-library

在应用中使用

 import SharedComponent from 'shared-component-library';

 function App() {
 return ;
 }

 export default App;

优点
1. 模块化管理:通过npm包管理公共组件,可以实现模块化开发,便于维护和更新。
2. 版本控制:npm包自带版本控制功能,可以方便地进行版本管理,确保不同微应用使用兼容的组件版本。
3. 依赖管理:npm包可以自动管理依赖关系,减少手动处理依赖的复杂性。
4. 复用性高:公共组件封装成npm包后,可以在多个微应用中复用,减少重复开发,提高开发效率。
5. 社区支持:npm生态系统庞大,很多问题可以通过社区资源解决,减少开发难度。

缺点
1. 发布和更新成本:每次更新公共组件都需要重新发布npm包,并在各个微应用中更新依赖,增加了一定的工作量。
2. 版本兼容性问题:不同微应用可能对同一组件有不同的版本需求,处理版本兼容性问题可能会比较复杂。
3. 性能开销:由于npm包需要通过网络下载和安装,可能会增加构建时间和初始加载时间。
4. 调试复杂性:npm包作为独立模块,调试时可能需要额外的配置和步骤,增加了调试的复杂性。
5. 安全性问题:使用第三方npm包时,需要注意其安全性,防止引入潜在的安全漏洞。

使用 CDN

将共享组件打包并上传到 CDN,然后在父子应用中通过 URL 引入。

打包共享组件:

npm run build

上传到 CDN。

在应用中引入:

< script src="https://www.elecfans.com/images/chaijie_default.png" >< /script >
// 假设共享组件暴露为全局变量 SharedComponent
function App() {
  return < SharedComponent / >;
}
export default App;

优点

性能提升:

快速加载:CDN 服务器分布在全球各地,用户可以从最近的服务器获取资源,从而减少加载时间。

缓存机制:CDN 提供了强大的缓存机制,可以减少服务器的负载,提高响应速度。

带宽优化:

减轻服务器压力:通过将静态资源托管在 CDN 上,可以减轻原始服务器的带宽压力。

分布式传输:CDN 可以将流量分散到多个节点,避免单点瓶颈。

高可用性:

冗余备份:CDN 通常有多个备份节点,即使某个节点出现故障,其他节点也能继续提供服务。

自动故障切换:CDN 能够自动检测并切换到可用的节点,确保服务的连续性。

版本管理:

统一管理:通过 CDN 可以统一管理公共组件的版本,确保所有微应用使用相同的组件版本,减少兼容性问题。

缺点

安全性问题:依赖第三方:使用第三方 CDN 服务可能会带来安全隐患,特别是如果 CDN 提供商遭到攻击或出现故障。

缓存一致性:

缓存更新延迟:CDN 的缓存机制可能导致更新的资源不能及时传播到所有节点,造成版本不一致的问题。

缓存失效:需要手动管理缓存失效策略,否则可能会导致旧版本资源被长期缓存。

依赖性:

网络依赖:如果用户的网络环境较差,可能会影响到通过 CDN 获取资源的速度和稳定性。

服务依赖:过度依赖 CDN 可能会导致在 CDN 服务出现问题时,整个应用的可用性受到影响。

使用 iframe

如果组件之间的交互较少,可以考虑使用 iframe 嵌入子应用。
在父应用中嵌入 iframe:

< iframe src="https://www.elecfans.com/images/chaijie_default.png" width="100%" height="500px" >< /iframe >

优点

隔离性强:iframe 提供了一个独立的浏览上下文,能够有效隔离不同微应用之间的样式和脚本,避免相互干扰。

安全性高:由于 iframe 的隔离特性,能够防止跨站脚本攻击(XSS)和其他安全问题。

兼容性好:iframe 是浏览器原生支持的技术,兼容性较好,能够在大多数现代浏览器中正常工作。

独立部署:各个微应用可以独立部署和更新,不需要担心对其他应用的影响。

缺点

性能问题:iframe 会增加页面的加载时间和内存消耗,尤其是在嵌套多个 iframe 的情况下。

通信复杂:iframe 与父页面之间的通信需要通过 postMessage 等机制实现,增加了开发的复杂性。

SEO 不友好:搜索引擎对 iframe 内容的抓取和索引支持较差,可能影响 SEO 效果。

样式和布局问题:iframe 的内容与父页面的样式和布局是独立的,可能需要额外的工作来确保一致性。

调试困难:iframe 内部的调试相对复杂,尤其是在跨域的情况下,调试工具的使用会受到限制。

总结

不同的方案有各自的特点,需要根据具体的应用场景和需求进行权衡。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1309

    浏览量

    74946
  • 前端
    +关注

    关注

    1

    文章

    245

    浏览量

    18848
  • 组件
    +关注

    关注

    1

    文章

    600

    浏览量

    19065
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AD7711:低频率测量应用的完整模拟前端解决方案

    AD7711:低频率测量应用的完整模拟前端解决方案 在电子设计领域,对于低频率测量应用,拥有一款性能卓越的模拟前端解决方案至关重要。AD7711作为一款完整的模拟
    的头像 发表于 04-03 10:35 105次阅读

    MAX30001:超低功耗生物电位与生物阻抗模拟前端解决方案

    MAX30001:超低功耗生物电位与生物阻抗模拟前端解决方案 在可穿戴设备和医疗监测领域,对高性能、低功耗的模拟前端(AFE)需求日益增长。MAX30001作为一款单通道集成生物电位和生物阻抗AFE
    的头像 发表于 03-27 17:10 197次阅读

    共享车辆追踪:为什么选LoRa?

    共享车辆频繁丢失、GPS室内失效、传统定位成本高昂—这些行业痛点如何破解?本文深入解析LoRa技术如何通过超低功耗、超远通信、超强隐蔽三大核心优势,为共享车辆打造经济可靠的定位追踪方案。背景随着
    的头像 发表于 03-23 11:34 1102次阅读
    <b class='flag-5'>共享</b>车辆追踪:为什么选LoRa?

    电网暂态稳定分析方法有哪些?

    电网的暂态稳定是指其在遭受短路故障、负荷突变、电源波动等扰动后,能够恢复至正常运行状态过渡到新的稳定运行状态的能力。随着高比例可再生能源、电力电子设备及储能系统的广泛接入,电网的暂态特性愈发
    的头像 发表于 01-27 13:56 1137次阅读
    <b class='flag-5'>微</b>电网暂态稳定分析<b class='flag-5'>方法</b>有哪些?

    实测2778MB/s,AMP核通信“快如闪电”,瑞芯RK3576

    的AMP核通信——共享内存方案,具有“ 零拷贝 ”、“ 高带宽 ”的显著优势,直接解决用户痛点,下面用实测数据说话!   ▍共享内存方案
    的头像 发表于 12-04 14:14 563次阅读
    实测2778MB/s,AMP核<b class='flag-5'>间</b>通信“快如闪电”,瑞芯<b class='flag-5'>微</b>RK3576

    永磁组件种类与性能保障方案

    永磁组件是以永磁材料为核心部件组装而成的装置,主要用于维持稳定磁场实现能量转换功能,广泛应用于工业设备、电机系统等领域。永磁组件主要由永磁材料(如钕铁硼、铁氧体等)与其他材料(不锈钢、铜、塑胶等
    的头像 发表于 10-21 08:49 469次阅读
    永磁<b class='flag-5'>组件</b>种类与性能保障<b class='flag-5'>方案</b>

    射频前端“硬骨头”之战:昂瑞啃下中高端模组市场

    恭喜昂瑞二反挂网,这是射频前端行业的重大事件!笔者曾有幸与昂瑞团队有过接触与交流,今天也来说说对昂瑞和射频前端这个赛道的认识。    
    的头像 发表于 10-13 15:49 1838次阅读

    射频前端的反内卷之路

    近期随着卓胜和唯捷创芯半年报公布,两家头部射频前端公司扣非后净利润都出现不同程度的亏损,一时关于射频前端内卷和关于射频卷到“血流成河”的文章不断爆出,笔者采访了多位未上市或者在上市
    的头像 发表于 08-29 10:39 864次阅读

    不同场景下的文件共享方案-SMB/WebDAV/FTP/ZeroNews

    当下,文件共享已成为企业协作和日常工作中不可或缺的一环。不同的场景对文件共享的需求各异,文件共享方案的选择直接影响企业效率与数据安全。 本文从 技术特性 、 适用场景 、 安全机制 等
    的头像 发表于 08-28 12:04 1161次阅读
    不同场景下的文件<b class='flag-5'>共享</b><b class='flag-5'>方案</b>-SMB/WebDAV/FTP/ZeroNews

    射频前端公司如何抉择?IDMDesign House

    近年来,随着半导体行业受到的关注度和注入的资金不断提升,国内射频前端厂商也发展迅速,催生出如卓胜、唯捷创芯、昂瑞、飞骧、锐石创芯和慧智等优秀厂商。这些企业崛起到一定规模后,资金实
    的头像 发表于 08-05 15:28 1087次阅读
    射频<b class='flag-5'>前端</b>公司如何抉择?IDM<b class='flag-5'>或</b>Design House

    恒讯科技分析:Ubuntu云服务器数据共享高效方案

    在当今云计算时代,企业对于数据共享的需求日益增长,尤其是在使用Ubuntu云服务器的场景下,如何实现高效、安全的数据共享成为关键问题。本文将为您详细介绍几种主流的Ubuntu云服务器数据共享
    的头像 发表于 07-09 21:40 1642次阅读

    如何监听组件再次显示的事件?

    ,从挂载卸载的角度触发,也有别的方法,比如用IF来作条件渲染,即监听Tabs的onChange事件,然后通过IF判断这个index,来显示子组件,效果是能实现的,但是会有一个很明显的闪烁,当然这可
    发表于 06-30 18:02

    多个i.MXRT共享一颗Flash启动的方法与实践(下)

    在 《多个i.MXRT共享一颗Flash启动的方法与实践(上)》 一文里痞子衡给大家从理论上介绍一种多 i.MXRT 共享 Flash 启动的方法,但是理论虽好,如果没有经过实践验证切
    的头像 发表于 06-05 10:04 1279次阅读
    多个i.MXRT<b class='flag-5'>共享</b>一颗Flash启动的<b class='flag-5'>方法</b>与实践(下)

    DataAbility组件概述介绍

    应用存储数据的访问,并提供与其他应用共享数据的方法。DataAbility既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。 数据的存放形式多样,可以是数据库,也可以是
    发表于 05-28 08:19

    UIAbility组件交互(设备内)说明

    UIAbility组件交互(设备内) UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他
    发表于 05-16 06:12