模块联合如何选择使用哪个依赖版本?

问题描述 投票:0回答:3

我一直在玩弄这个模块联合示例,其中设置相对简单 - 主机正在使用具有共享反应依赖项的远程模块。在本地运行时,我注意到尽管主机和远程都有相同的react/react-dom版本,但远程的版本始终是下载的版本。

根据我的研究,模块联合似乎会选择共享依赖项的“最佳”版本,但令我惊讶的是,在两者具有相同版本的情况下,将选择远程版本。这个决定是如何做出的?在这种情况下有没有办法强制使用主机的版本?

webpack webpack-5 webpack-module-federation
3个回答
9
投票

基本上,当您的主机启动时,它会将其所有版本注册到共享范围中。每次您从远程加载

remoteEntry.js
时,远程也会将其版本添加到同一范围,但前提是该确切版本尚不存在。

例如,如果主持人在

module-a
共享
version 1.0.0
。当主机加载时,它将把
module-a:1.0.0
放入共享上下文中。如果遥控器也共享
module-a:1.0.0
,它不会将其放入上下文中,因为它已经在那里了。如果主机正在共享
module-a:1.0.1
,那么上下文现在将有两个版本:来自主机的
module-a:1.0.0
和来自远程的
module-a:1.0.1

此时我们只是在谈论注册...我们还没有选择使用哪个版本,但我们正在注册从所有遥控器和主机共享的所有唯一版本。基本上第一个注册的人获胜。

现在,当版本解析算法运行时......它将根据所有要求确定要使用哪个版本。如果算法选择模块的版本

1.0.0
,那么它将进入范围并使用分配给版本
1.0.0
的任何模块,在这种情况下,这将是来自主机的模块,因为主机首先运行并且能够首先注册它。如果算法选择
1.0.1
,它将使用远程模块。如果提供了多个遥控器
1.0.1
那么它将使用第一个将其注册到范围中的遥控器中的遥控器。



0
投票

根据我对 webpack 代码生成的分析,需要注意的几点是

  1. 主机未急切加载的依赖项可以使用 eager:true 替换为任何其他远程 mfe
  2. 如果远程的唯一名称大于主机的唯一名称,则主机未急切加载的依赖项可以用 eager:false 替换为任何其他远程 mfe
  3. 由主机急切加载的依赖项如果尚未被消耗,仍然可以用 eager:true 替换为任何其他远程 mfe。

最后,在所有情况下,重要的是要知道谁注册并不重要,重要的是在需要时提供依赖项以避免任何急切的消费错误

因此,在这种情况下,您是对的,最长的唯一应用程序名称获胜

© www.soinside.com 2019 - 2024. All rights reserved.