5

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

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

4

2 回答 2

3

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

例如,如果主机module-aversion 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那么它将使用第一个将其注册到范围内的遥控器。

于 2021-02-21T02:01:53.220 回答
2

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

于 2021-01-18T02:30:04.353 回答