webpack-plugin icon indicating copy to clipboard operation
webpack-plugin copied to clipboard

[Webpack 5] Module Federation plugin does not work

Open damian131 opened this issue 4 years ago • 13 comments

I'm submitting a bug report

  • Library Version: 5.0.0

Please tell us about your environment:

  • Operating System: Windows 10

  • Node Version: 10.18.1

  • NPM Version: 6.13.4

  • JSPM OR Webpack AND Version webpack 5.42.0

  • Browser: Chrome 91.0.4472.124 (Official Build) (64-bit)

  • Language: TypeScript 4.2.4

Current behavior: Once configuring Webpack Federation Module for two Aurelia projects (one is a host and another one is a remote component), the host is not requesting for remoteEntry.js from the remote component.

Both of the projects have a clean setup built using au new and they are migrated to Webpack 5.

Host's Module Federation plugin config: image

Remote Component's Module Federation plugin config: image

Remote Component's function definition: image

Host using Remote Component's function: image

Build has succeeded, but the issue occurs during runtime. remoteEntry.js is not issued by the host: image

However it has been successfully generated on the remote component side: image

You can find all code in this repo: https://github.com/damian131/aurelia-module-federation

Expected/desired behavior: remoteEntry.js file is requested by the host which eventually ends up with remote component's function being called on the host side.

What is the motivation / use case for changing the behavior? Having ability to use Module Federation plugin within Aurelia apps and taking advantage from micro-frontend architecture.

damian131 avatar Jul 15 '21 11:07 damian131

@damian131 thanks, I'll have a look

bigopon avatar Jul 15 '21 12:07 bigopon

@damian131 I've been able to setup a simple a project with 2 apps connected through module defederation here https://github.com/bigopon/example-au-module-federation

Can you have a try?

m property in the App is a promise of loading the module at app2, so just need to .then(m => m.superFunction() to see some console logging.

bigopon avatar Jul 23 '21 12:07 bigopon

@damian131 forgot to mention that I built the apps independently and run via http-server: app2: port 8080 app1: any port

bigopon avatar Jul 23 '21 12:07 bigopon

Hi @bigopon, thank you so much for taking a look.

Indeed, when trying to import it in this way it is working. What is the reasoning behind that?

Additionally, I've tried to import a remote Aurelia's component to the host and I'm getting: obraz

Any idea how to make it working?

Code: https://github.com/damian131/example-au-module-federation

damian131 avatar Jul 24 '21 20:07 damian131

Hi @bigopon, did you have a chance to look at this?

damian131 avatar Sep 08 '21 08:09 damian131

Oops sorry, I forgot about this. Will do soon @damian131

bigopon avatar Sep 08 '21 09:09 bigopon

Hi @bigopon, sorry for pinging you once again on this - did you have a chance to take a look?

damian131 avatar Oct 01 '21 09:10 damian131

@damian131 I haven't had a chance yet, but have been keeping a note of this in my mind for whole this week since I recently checked on it for a blog. Will do this weekend.

bigopon avatar Oct 01 '21 13:10 bigopon

I've been able to reproduce the issue, a workaround is to export hello from superFunction:

export const hello = () => import('./hello/hello');

then in usage, we can do

p = import ('app2/hello').then(m => m()).then(m => m.Hello)

bigopon avatar Oct 08 '21 00:10 bigopon

The output when doing a prod build looks like this image This probably means the current plugin is trying to preserve module name even in module federation build.

To fix this, we will need to either:

  • find a way to make federation plugin ignore the module name preservation on entry points, or
  • find a way to make the plugin aware of the requester being the entry point of a module federation and do not try to preserve the name. This could have complication with the way view is automatically searched.

bigopon avatar Oct 08 '21 00:10 bigopon

How would we expose an actual component, a view and viewModel, that renders itself? Basically, taking the example app1 and app2, how would we go about exposing app2's App component to app1 and rendering it on the screen?

I have updated app2's webpack.config.js file to this:

new ModuleFederationPlugin({
      name: 'app2',
      filename: 'remoteEntry.js',
      exposes: {
        './superFunction': './src/superFunction',
        './App': './src/app'
      },
      // shared: { react: { singleton: true }, 'react-dom': { singleton: true } }
    }),

And I can now import the component in app1. I'm just not sure how to actually use it...

ItWorksOnMyMachine avatar Mar 14 '22 15:03 ItWorksOnMyMachine

How would we expose an actual component, a view and viewModel, that renders itself? Basically, taking the example app1 and app2, how would we go about exposing app2's App component to app1 and rendering it on the screen?

I have updated app2's webpack.config.js file to this:

new ModuleFederationPlugin({
      name: 'app2',
      filename: 'remoteEntry.js',
      exposes: {
        './superFunction': './src/superFunction',
        './App': './src/app'
      },
      // shared: { react: { singleton: true }, 'react-dom': { singleton: true } }
    }),

And I can now import the component in app1. I'm just not sure how to actually use it...

Hi @ItWorksOnMyMachine , have you found out how to get this to work? We also managed to import the component in app1 but can't seem to find how to get it to render.

KayvandenHeuvel avatar Apr 26 '23 11:04 KayvandenHeuvel

Someone got it to render in Aurelia? Still looking for an answer on this one.

KentuckyMC avatar Aug 09 '23 09:08 KentuckyMC