webpack5:共享模块总是报告容器初始化失败,因为它已经用不同的共享范围进行了初始化

Posted

技术标签:

【中文标题】webpack5:共享模块总是报告容器初始化失败,因为它已经用不同的共享范围进行了初始化【英文标题】:webpack5: shared module always report Container initialization failed as it has already been initialized with a different share scope 【发布时间】:2021-01-28 22:23:23 【问题描述】:

我通过三个项目尝试模块联合:shell、app1 和 app2。 shell 的 webpack 配置是这样的:

 new ModuleFederationPlugin(
        name: ‘she’ll,
        library:  type: 'var', name: ‘she’ll ,
        filename: 'remoteEntry.js',
        exposes: 
          './util': './src/common/utils',
          './Hello': './src/components/test/HelloWorld',
          './MicroApp': './src/shared/MicroApp',
        ,
        shared: ['react', 'react-dom']
      ),

app1 和 app2 的配置如下:

      new ModuleFederationPlugin(
        name: 'app1',
        remotes: 
          Shell: `shell@$sharedModuleAddress/remoteEntry.js`
        ,
        shared: ['react', 'react-dom']
      ),

shell负责根据路由加载app1和app2。打开页面app1(或app2)时,就可以了。但是如果从一个应用程序导航到另一个应用程序,则会引发异常:容器初始化失败,因为它已经使用不同的共享范围进行了初始化。

我发现当打开一个应用页面时,比如app1页面,它会发送一个范围对象包括react和react-dom到share模块的init方法。但是当导航到 app2 时,app2 创建的另一个作用域对象也将被发送到共享模块的 init 方法。共享模块会比较这两个共享范围,如果不一样,会不会异常。

我不确定这是一个错误还是我缺少一些配置。我尝试查找与模块联合相关的文档,但未找到与共享范围相关的有用信息。有没有人知道这件事? 顺便说一句,我也试过了

       shared: 
          react: 
            singleton: true
           ,
           'react-dom': 
             singleton: true
         
         

它也不起作用。

问候

【问题讨论】:

您找到解决方案了吗? 不知道这有帮助,但库定义似乎有语法错误,name: ‘she’ll 【参考方案1】:

在我的例子中,当webpack entry name与ModuleFederationPlugin name相同时,发生错误。

  entry: 
    admin: path.join(__dirname, 'src/index.js'),
  ,
  plugins: [
    new ModuleFederationPlugin(
      name: 'admin', // same with entry name
      ...
    )
  ]

【讨论】:

以上是关于webpack5:共享模块总是报告容器初始化失败,因为它已经用不同的共享范围进行了初始化的主要内容,如果未能解决你的问题,请参考以下文章

webpack5模块联邦

模块解析失败:带有 Storybook 6.1.11、Webpack 5.11.0、React 17.0.1 的意外字符“@”(1:0)

Webpack 模块联合不适用于急切的共享库

Eclipse 报告“加载 JNI 共享库失败”[重复]

Pulseaudio module-combine-sink 总是抛出失败

Angular,Webpack5 模块联合:您提供了一个无效的对象,其中需要流