8.3.13 • Published 2 days ago

@module-federation/nextjs-mf v8.3.13

Weekly downloads
278
License
MIT
Repository
github
Last release
2 days ago

Module Federation For Next.js

This plugin enables Module Federation on Next.js

This is a workaround to hard limitations caused by Next.js being synchronous.

I am working on an update to Webpack Core which will circumvent projects with older architecture (like Next.js).

This is a stable and viable workaround to leverage Module Federation until this issue is resolved.

Supports

  • next ^9.5.6
  • SSG
  • SSR

Once I PR webpack, this workaround will no longer be required.

Check out our book

We will be actively updating this book over the next year as we learn more about best practices and what issues people are running into with Module Federation, as well as with every release of Webpack as it moves towards a release candidate and release. So with your one purchase you are buying a whole year of updates.

Demo

You can see it in action here: https://github.com/module-federation/module-federation-examples/tree/master/nextjs

How to use it

  1. Install Next ^9.5.6 (currently in canary)
  2. Use withModuleFederation in your next.config.js
// next.config.js
const {
  withModuleFederation,
} = require("@module-federation/nextjs-mf");
const path = require("path");

module.exports = {
  webpack: (config, options) => {
    const { buildId, dev, isServer, defaultLoaders, webpack } = options;
    const mfConf = {
      name: "next2",
      library: { type: config.output.libraryTarget, name: "next2" },
      filename: "static/runtime/remoteEntry.js",
      remotes: {
        // For SSR, resolve to disk path (or you can use code streaming if you have access)
        next1: isServer
          ? path.resolve(
              __dirname,
              "../next1/.next/server/static/runtime/remoteEntry.js"
            )
          : "next1", // for client, treat it as a global
      },
      exposes: {
        "./nav": "./components/nav",
      },
      shared: ["lodash"],
    };
    // Configures ModuleFederation and other Webpack properties
    withModuleFederation(config, options, mfConf);

    if (!isServer) {
      config.output.publicPath = "http://localhost:3001/_next/";
    }

    return config;
  },
};
  1. Add the patchSharing to _document.js. This will solve the react sharing issue.
import Document, { Html, Head, Main, NextScript } from "next/document";
import { patchSharing } from "@module-federation/nextjs-mf";

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const initialProps = await Document.getInitialProps(ctx);
    return { ...initialProps };
  }

  render() {
    return (
      <Html>
        {patchSharing()}
        <script src="http://localhost:3000/_next/static/chunks/webpack.js" />
        <script src="http://localhost:3000/_next/static/runtime/remoteEntry.js" />
        <Head />
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}
  1. Use top-level-await
// some-component.js
const Nav = (await import("../components/nav")).default;
const _ = await import("lodash");

Experimental

Use at your own risk.

Next.js uses runtimeChunk:'single' Which forces us to also add the webpack script itself. Till this is fixed in webpack, heres a plugin that will merge the runtimes back together for MF

const {MergeRuntime} = require("@module-federation/nextjs-mf");
// in your next config.
config.plugins.push(new MergeRuntime());

This allows the following to be done

  - <script src="http://localhost:3000/_next/static/chunks/webpack.js" />
  - <script src="http://localhost:3000/_next/static/runtime/remoteEntry.js" />
  + <script src="http://localhost:3000/_next/static/remoteEntryMerged.js" />
8.3.13

3 days ago

8.3.12

11 days ago

8.3.11

14 days ago

8.3.10

16 days ago

8.3.9

20 days ago

8.3.8

22 days ago

8.3.6

24 days ago

8.3.7

24 days ago

8.3.5

26 days ago

8.3.4

30 days ago

8.3.2

1 month ago

8.3.3

1 month ago

8.2.6

1 month ago

8.3.1

1 month ago

8.3.0

1 month ago

8.2.5

1 month ago

8.2.4

2 months ago

8.2.3

2 months ago

8.2.2

2 months ago

8.2.1

2 months ago

8.2.0

2 months ago

8.1.11

2 months ago

8.1.10

3 months ago

8.1.9

3 months ago

8.1.8

3 months ago

8.1.7

4 months ago

8.1.6

4 months ago

8.1.5

4 months ago

8.1.4

4 months ago

8.1.2

4 months ago

8.1.3

4 months ago

8.1.1

4 months ago

8.1.0

5 months ago

6.6.1

11 months ago

6.6.0

11 months ago

6.6.3

11 months ago

6.6.2

11 months ago

8.1.0-canary.6

6 months ago

8.1.0-canary.7

6 months ago

8.1.0-canary.1

7 months ago

8.1.0-canary.2

6 months ago

8.1.0-canary.3

6 months ago

8.1.0-canary.4

6 months ago

8.1.0-canary.5

6 months ago

6.7.0

10 months ago

6.7.1

10 months ago

7.0.8

9 months ago

7.0.7

9 months ago

7.0.6

10 months ago

7.0.5

10 months ago

7.0.0

10 months ago

7.0.4

10 months ago

7.0.3

10 months ago

7.0.2

10 months ago

7.0.1

10 months ago

8.0.1-2

7 months ago

6.7.2-rc.0

10 months ago

8.0.1-3

7 months ago

8.0.1-0

7 months ago

8.0.1-1

7 months ago

6.7.2-rc.1

10 months ago

8.0.1-4

7 months ago

6.5.2-rc8.1

11 months ago

8.0.0

8 months ago

6.5.2-rc7.0

11 months ago

6.5.2-rc8.0

11 months ago

6.5.0

12 months ago

6.5.2-rc3.1

11 months ago

6.5.2-rc3.0

11 months ago

6.5.2-rc3.2

11 months ago

6.4.1-rc.4

12 months ago

6.4.1-rc.3

12 months ago

6.4.1-rc.0

12 months ago

6.4.1-rc.2

12 months ago

6.4.1-rc.1

12 months ago

6.4.1-rc.5x

12 months ago

6.5.2-rc6.0

11 months ago

6.5.2-beta.0

12 months ago

6.4.1-beta.5

12 months ago

6.4.1-beta.4

12 months ago

6.4.1-beta.7

12 months ago

6.5.2-rc5.0

11 months ago

6.4.1-beta.6

12 months ago

6.4.1-beta.3

1 year ago

6.4.1-beta.8

12 months ago

6.5.2-rc1.0

12 months ago

6.5.2-rc.0

12 months ago

6.5.2-rc4.0

11 months ago

6.5.1

12 months ago

6.3.1-beta.1

1 year ago

6.3.1-beta.0

1 year ago

6.1.4

1 year ago

6.2.1

1 year ago

6.2.0

1 year ago

6.2.3

1 year ago

6.2.2

1 year ago

6.3.0

1 year ago

6.3.1

1 year ago

6.4.1-beta.1

1 year ago

6.4.1-beta.0

1 year ago

6.4.1-beta.2

1 year ago

6.4.0

1 year ago

6.1.0

1 year ago

6.1.2

1 year ago

6.1.1

1 year ago

6.1.3

1 year ago

6.0.7

1 year ago

6.0.6

1 year ago

6.0.8

1 year ago

5.12.11

1 year ago

5.12.12

1 year ago

5.12.13

1 year ago

5.12.10

1 year ago

5.12.9

1 year ago

5.12.8

1 year ago

5.12.7

1 year ago

5.12.6

1 year ago

5.12.5

1 year ago

5.12.4

1 year ago

5.12.3

1 year ago

5.12.2

1 year ago

5.12.1

1 year ago

5.12.0

1 year ago

6.0.1

1 year ago

6.0.0

1 year ago

6.0.3

1 year ago

6.0.2

1 year ago

6.0.5

1 year ago

6.0.4

1 year ago

5.11.4

2 years ago

5.11.3

2 years ago

5.11.2

2 years ago

5.11.1

2 years ago

5.11.0

2 years ago

5.8.5

2 years ago

5.8.4

2 years ago

5.8.3

2 years ago

5.8.0

2 years ago

5.9.9

2 years ago

5.9.2

2 years ago

5.9.1

2 years ago

5.9.0

2 years ago

5.6.3-3

2 years ago

5.6.3-4

2 years ago

5.6.3-5

2 years ago

5.6.3-6

2 years ago

5.6.3-7

2 years ago

5.6.3-8

2 years ago

5.6.3-0

2 years ago

5.6.3-1

2 years ago

5.6.3-2

2 years ago

5.6.4

2 years ago

5.6.3

2 years ago

5.6.2

2 years ago

5.6.1

2 years ago

5.6.0

2 years ago

5.10.5

2 years ago

5.10.4

2 years ago

5.10.3

2 years ago

5.10.2

2 years ago

5.10.1

2 years ago

5.10.0

2 years ago

5.9.10

2 years ago

5.9.11

2 years ago

5.9.12

2 years ago

5.11.5

2 years ago

5.7.8

2 years ago

5.9.17

2 years ago

5.7.7

2 years ago

5.7.6

2 years ago

5.7.5

2 years ago

5.7.4

2 years ago

5.9.13

2 years ago

5.7.3

2 years ago

5.9.14

2 years ago

5.7.2

2 years ago

5.9.15

2 years ago

5.7.1

2 years ago

5.9.16

2 years ago

5.7.0

2 years ago

5.5.1

2 years ago

5.3.3

2 years ago

5.5.0

2 years ago

5.3.2

2 years ago

5.3.1

2 years ago

5.1.3

2 years ago

5.3.0

2 years ago

5.1.2

2 years ago

5.4.1-1

2 years ago

5.4.1

2 years ago

5.4.0

2 years ago

5.2.2

2 years ago

5.2.1

2 years ago

5.2.0

2 years ago

3.0.1

2 years ago

3.0.0

2 years ago

3.1.2

3 years ago

2.3.0

3 years ago

2.3.1

3 years ago

2.2.0

3 years ago

2.1.0

3 years ago

2.0.0

3 years ago

1.1.2

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.0

3 years ago

1.0.0-beta.2

3 years ago

1.0.0-beta.3

3 years ago

1.0.0-beta.4

3 years ago

1.0.0-beta.0

3 years ago

1.0.0-beta.1

3 years ago

0.4.0

3 years ago

0.3.1

3 years ago

0.3.0

3 years ago

0.2.2

3 years ago

0.2.1

3 years ago

0.2.0

3 years ago

0.1.2-beta.0

3 years ago

0.0.3

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago

0.0.2

4 years ago

0.0.1-beta.9

4 years ago

0.0.1-beta.7

4 years ago

0.0.1-beta.8

4 years ago

0.0.1-beta.6

4 years ago

0.0.1-beta.5

4 years ago

0.0.1-beta.3

4 years ago

0.0.1-beta.4

4 years ago

0.0.1-beta.2

4 years ago

0.0.1-beta.1

4 years ago

0.0.1-beta.0

4 years ago

0.0.1-alhpa.3

4 years ago

0.0.1-alpha.1

4 years ago

0.0.1-alpha.2

4 years ago

0.0.1-alpha.0

4 years ago