模块联邦实践

news2024/11/19 17:39:19

在聊模块联邦之前,我们先了解下在多个项目下,前端模块如何复用的

跨项目模块复用方案

1、npm 包
包管理工具对于前端应用来说不可或缺,我们可以将模块上传到 npm 包,在需要的项目中引入,以此来复用一些公用模块。

2、monorepo
monorepo 是一种将多个项目代码存放在一个仓库里的软件开发模式,monorepo 中所有的项目相互独立,但不同项目之间可以相互引用

3、git submodule
git 提供了子模块做代码复用,任何一个git repo 都可以通过引用其它 repo(子模块)来做模块复用,在主项目中通过git commitid 来管理子项目的版本。这就带来一个问题,多人协作中子项目版本容易造成冲突,每次都需要手动更新子模块引用,子模块版本管理很难做

4、复制粘贴
CV大法 或许是实现复用成本最低的一种方案,github有过一项统计,其托管的项目代码有一半是重复的。虽然复制粘贴能够快速实现代码复用,但是对于未来的长期维护却是灾难性的,代码维护成本会越来越高

5、 UMD
UMD 是 (Universal Module Definition) 通用模块定义的缩写,UMD 将 commonjs、amd 规范集于一身,并支持导出全局变量使用。
UMD 方案存在一些缺陷:其导出的全局变量,容易造成冲突,而且多个 UMD 模块如果相互依赖,那么加载顺序就需要手动去维护,tree shaking 也不是很好做

我们刚才提到的跨项目模块复用的方案中,除了UMD方案,其它4种,最大的局限是复用组件、项目升级后,需要所有依赖它的项目进行升级、编译、上线,一两个项目这么做可能没什么问题,但是如果是几十个项目,就显的过于繁琐

有没有一种方案,复用模块版本升级,所有依赖它的项目不再需要单独部署上线,在线上环境就能加载到升级之后的模块?

webpack5 提供了模块联邦,解决了上述问题,让代码直接在项目间利用 CDN 直接共享(远程模块),不再需要本地安装 npm 包、构建在发布了

模块联邦概述

下面是官网的介绍:

多个独立的构建可以形成一个应用程序。这些独立的构建不会相互依赖,可以独立开发、部署,这通常被称为微前端,但并不仅限于此。

模块联邦中有几个重要的概念

Remote

作为模块提供者,对外导出模块,被 Host 引用

Host

作为模块消费者,可以动态加载 Remote 提供的模块

Share

Remote、Host可以共享相同的依赖,避免重复打包,减少包体积

下面这张图可以清晰的看到他们三者之间的关系72eb4700075dc483c9b54d3524536cde.png

如何使用

webpack5 提供了 ModuleFederationPlugin 插件来使用模块联邦,下面是插件的配置项

Remote 配置

new ModuleFederationPlugin({
    name: "component_app",
    filename: "remoteEntry.js",
    exposes: {
      "./Button":"./src/Button.jsx",
    },
    shared: ["react", "react-dom"]
})

name 是模块名称,用来标识模块,以确保其它模块能够正确引用该模块

filename 用于指定输出模块的文件名,其它项目通过其加载导出的模块

exposes 用来指定需要导出的模块

shared 用来指定需要共享的依赖模块,如果两个应用都使用了相同的依赖,则可以使用 shared 来共享依赖,减小打包体积

Host 配置

new ModuleFederationPlugin({
    name: "main_app",
    remotes: {
        "component-app":"remote_url"
    },
    shared: ["react", "react-dom"]
})

关于Host,重点说一下 remotes 配置

它是用来指定需要从哪个应用加载远程模块,其中 component-app 是一个模块别名, remote_url 是 Remote 导出的 filename 文件地址

在项目中引入共享模块 Button(以上面 Remote 导出的模块为例,在 Host 项目中使用),由于是异步模块,所以需要使用 import() 来引用

React.lazy(() => import('component-app/Button'))

如果是多个项目,每个项目配置Host后,即可方便的使用 Remote 导出的模块 Button,这样如果Button 组件修改,我们只需要单独打包 Button 所在的 Remote 应用,重新导出最新的 Button 模块后发布,其它项目中引用的 Button 模块就是最新发布后的代码了,不再需要单独构建、发布了

优点

1、配置简单灵活
2、支持独立部署,上线
3、运行时加载模块,以及共享依赖,减少应用包体积
4、相比 externals 以及 dll,模块联邦能够更好的做到按需热插拔

缺点

1、必须使用 webpack5
2、模块联邦对runtime 运行时做了大量改造,在运行时要做的事情也因此增加很多,会对我们页面的运行时性能造成一定的负面影响
3、由于是运行时共享,那么远程模块的版本管理也是应该去考虑的问题

参考链接

社区中 webpack4 支持模块联邦的 (https://github.com/module-federation/webpack-4)
脱离 webpack 技术栈,支持模块联邦的也有 (https://github.com/tnfe/hel)

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

65030c7edfe4907641d993a2e5cd67ef.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于CANN的AI推理最佳实践丨多路极致性能目标检测应用设计解密

当前人工智能领域,最热门的无疑是以ChatGPT为代表的各种“新贵”大模型,它们高高在上,让你无法触及。但在人们的日常生活中,实际应用需求最大的还是以Yolo模型为代表的目标检测“豪强”,它们每天都在以各种方式落地、应…

javascript匿名函数之立即调用函数

今天在看youtube的前端代码时发现了一个很奇怪的写法,从来没见过,代码如下: (function(e, c, l, f, g, h, k) {var d window;d.getInitialData function() {var b window;b.ytcsi && b.ytcsi.tick("pr", null, "&…

TensorFlow基础和入门案例

TensorFlow简介 TensorFlow是目前主流深度学习框架之一,其库中几乎包含了所有机器学习和深度学习相关的辅助函数和封装类,官方文档如下图所示。在其框架下做各种神经网络算法的开发可以极大减轻工作量,在入门阶段可以不需要深入理解相关优化…

spring拦截器参数及多拦截器执行顺序讲解

1.拦截器中的参数 2.多拦截器执行顺序 如果全部返回true,则按照流程全部执行 如果3返回false,123的preHandler会执行,123的postHandler都不会执行,但是return为true的2和1的after会执行 如果2返回false 12的preHandler会执行 pos…

sql 模糊查询与查询时间范围 起止时间

上代码 <select id"page" resultType"com.sky.entity.Orders">select * from orders<where><if test"number!null and number!">and number like concat(%,#{number},%)</if><if test"phone!null and phone!&q…

选择排序、归并排序、快速排序

1.选择排序 选择排序算法的实现思路有点类似插入排序&#xff0c;也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素&#xff0c;将其放到已排序区间的末尾。 Java代码实现如下。 ps&#xff1a;选择排序的最好情况时间复杂度、最坏情况和平均情况…

vue子组件监听不到父组件数据变化;子组件获取不到父组件的异步数据

当父子组件嵌套使用时created 和mounted 生命周期的执行顺序是父created -> 子created -> 子mounted -> 父mounted&#xff0c;但是这只是针对同步代码&#xff0c;当生命周期中有异步接口时&#xff0c;那么就会变成父created未执行完 -> 子created -> 子mount…

web安全php基础_魔术常量__FUNCTION__与__METHOD__的区别

PHP 魔术常量 PHP 向它运行的任何脚本提供了大量的预定义常量。 不过很多常量都是由不同的扩展库定义的&#xff0c;只有在加载了这些扩展库时才会出现&#xff0c;或者动态加载后&#xff0c;或者在编译时已经包括进去了。 有八个魔术常量它们的值随着它们在代码中的位置改…

安装Pytorch及配置Pycharm

PyTorch是一个基于Torch的Python开源机器学习库&#xff0c;用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发&#xff0c;不仅能够 实现强大的GPU加速&#xff0c;同时还支持动态神经网络&#xff0c;这一点是现在很多主流框架如TensorFlow都不支持的。 本文…

Service Computing Frontier Technology Experiment

任务说明 实验算法 空间数据索引RTree&#xff08;R树&#xff09;完全解析及Java实现 - 佳佳牛 - 博客园 (cnblogs.com) SFS 打开堆文件 t相当于一个指针 当指针指到不为空的时候 如果窗口未被占用那么 如果窗口是满的话那么代表完成 如果窗口没有满的话 把他加到窗口上&a…

k8s 第一篇 基础知识

一 k8s 1.1 概念 k8s 是一个能让应用部署到容器中&#xff0c;实现自动部署和管理更加高效 自能化的平台。 也就是说通过k8s&#xff0c;能够进行应用的自动化部署和扩容。 1.2 集群的架构流程 1.3 k8s的核心概念 1.4 k8s 集群规划 从第6集开始看

【分立元件】理解电阻

如果强行将某电压加在电子器件上&#xff0c;那么器件上被迫流过的电流是不可控的&#xff0c;电流具体是多少&#xff0c;是由器件本身的性质决定的。 比如同样的电压加载在导体和绝缘体两端&#xff0c;那么一般流过导体的电流会是大于流过绝缘体的。但要是超高电压下绝缘体…

单点登录SSO==MAXKEY

1-下载安装包安装启动 2-打开教程&#xff0c;里面说的很详细了 3- 测试 不想从这点进去也可以直接匿名打开个窗口直接访问 http://oauth.demo.maxkey.top:9521/demo-oauth/oauth20index.jsp 也会跳转到登录页面&#xff0c;输入账号密码后登录成功 乱输密码的话登录不成功还…

【算法设计与分析】素数测试问题——设计一个拉斯维加斯算法,对于给定的正整数,判断其是否为素数。

目录 一、问题描述二、分析三、运行结果四、代码 一、问题描述 试设计一个素数测试的偏真蒙特卡罗算法&#xff0c;对于测试的整数n&#xff0c;所述算法是一个关于logn的多项式时间算法。结合教材中素数测试的偏假蒙特卡罗算法&#xff0c;设计一个素数测试的拉斯维加斯算法。…

盛最多水的容器(力扣)双指针 JAVA

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 输入&…

Tomcat安装配置及其出错的解决方法

文章目录 一、安装二、进行配置三、解决问题四、验证 一、安装 官网链接: https://tomcat.apache.org/ 1.选择 A r c h i v e s \color{red}{Archives} Archives 2.选择 T o m c a t \color{red}{Tomcat} Tomcat版本 3.在对应的版本中选择相对应的小版本 点击 b i n \color…

海盗船DDR5版本号VER命名规则

从华硕、技嘉、微星的内存QVL中可总结出如下规律 海盗船DDR5版本号命名规则 第一位数字 颗粒厂商 第二位数字 对应产品类型 第三位数字 DIE数 3 美光 01 A 4 三星 43 传统内存 02 B 5 海力士 53 非传统内存 03 C 04 D 05 E 8 …

JAVA线程池分析实现

1、定义线程池 /*** 使用给定的初始参数创建新的 ThreadPoolExecutor对象&#xff0c;就创建了一个线程池* param corePoolSize - 要保留在池中的线程数&#xff0c;即使它们处于空闲状态&#xff0c;若果allowCoreThreadTimeOut设置为ture&#xff0c;那么核心线程在keepAliv…

整理——xilinx FPGA 在线升级

一&#xff1a;xilinx FPGA 在线升级方案&#xff1a;&#xff08;系统搭建&#xff1a;MicroBlaze软核处理器&#xff0c;uart控制器&#xff0c;Axi-lite-user用户通信接口&#xff0c;MIG DDR3控制器&#xff0c;中断控制器等&#xff0c;以太网控制器&#xff09; 1.跑一个…

C#开发的OpenRA游戏之建造物品的窗口10

C#开发的OpenRA游戏之建造物品的窗口10 前面已经分析完成建造物品的过程,从物品进入队列,直到物品按时间进行生产完成。那么生产完成之后,又是怎么样放置到游戏的地图里面的呢?本文就来分析这个问题。 前面可以看到,当物品建造完成时,会在右边的面板上显示建造完成: 在…