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

Nik*_*vas 11 webpack webpack-5 webpack-module-federation

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

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

dta*_*enc 8

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

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

  • 因此,Niko 说:“我对主机和远程使用相同的版本,但使用远程”。Daniel 说:“当主机和远程都使用相同版本时,远程将被使用,因为它首先被加载。”。所以,丹尼尔说尼科所说的事情不会发生。对于我的团队来说,他们看到了与 Niko 相同的行为,这个答案没有帮助。 (3认同)
  • 今天有一些额外的时间来研究这个 - 看起来这个答案的一部分是不正确的 - 如果你看[这里](https://github.com/webpack/webpack/blob/0c3df8ea25087effbf03e21a13363acac82c7b96/lib/sharing/ShareRuntimeModule.js #L90),而不是“第一个注册者获胜”,实际上是“通过字符串比较得出的最伟大的应用程序名称”获胜。如果将“app1”的名称更改为“app3”,则将确定性地使用其版本,因为““app3”>“app2””,但如果在示例中保持原样,则将使用“app2”因为`“app2”>“app1”` (2认同)