模块联合如何选择使用哪个依赖版本?
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版本?以上是关于模块联合如何选择使用哪个依赖版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何选择Spring Boot最稳定的版本,以及相应的Spring Cloud版本
如何找到具有特定依赖关系的 NPM 模块版本 - 例如,哪个版本的 webpack-cli 与 webpack@4.46.0 一起使用?