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

Posted

技术标签:

【中文标题】模块联合如何选择使用哪个依赖版本?【英文标题】:How does module federation choose which dependency version to use? 【发布时间】:2021-04-14 11:16:31 【问题描述】:

我一直在玩this module federation example,其中的设置相对简单——主机正在使用来自远程的具有共享反应依赖的模块。在本地运行时,我注意到尽管主机和远程具有相同的 react/react-dom 版本,但远程的版本始终是下载的版本。

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

【问题讨论】:

【参考方案1】:

基本上,当您的主机启动时,它会将其拥有的所有版本注册到共享范围中。每次您从远程加载 remoteEntry.js 时,远程也会将其版本添加到同一范围内,但前提是该确切版本不存在。

例如,如果主机在version 1.0.0 上共享module-a。当主机加载时,它会将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,那么它将使用首先将其注册到范围内的遥控器。

【讨论】:

【参考方案2】:

这篇文章很好的解释了这个机制。 https://www.angulararchitects.io/en/aktuelles/getting-out-of-version-mismatch-hell-with-module-federation/

【讨论】:

这是一个很棒的资源!不过,我认为它并不能具体解释我的问题。举个例子,host和remote有相同版本的依赖,为什么选择使用remote版本而不是host版本?

以上是关于模块联合如何选择使用哪个依赖版本?的主要内容,如果未能解决你的问题,请参考以下文章

maven打包时的三方包的选择顺序

如何选择Spring Boot最稳定的版本,以及相应的Spring Cloud版本

如何找到具有特定依赖关系的 NPM 模块版本 - 例如,哪个版本的 webpack-cli 与 webpack@4.46.0 一起使用?

php版本选择问题.VC6和VC9的区别,TS和NTS如何选择

如何选择使用哪个 JDBC 驱动程序? [关闭]

Pip 选择要求版本