Skip to content

Commit 8fdc63b

Browse files
author
Morten N.O. Henriksen
committed
Add experimental support for module federation
1 parent 8976811 commit 8fdc63b

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

docusaurus/docs/module-federation.md

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
id: module-federation
3+
title: Module Federation
4+
---
5+
6+
**EXPERIMENTAL!** This is feature is subject to change as we evaluate and gather feedback
7+
8+
Module federation enables an application to expose a module to be consumed by itself or other applications.
9+
10+
To enable module federation in a create react app add either a *.modulefederationrc.json* or *.modulefederationrc.js* in the root folder - depending on how dynamic the config needs to be.
11+
12+
The configuration is simply passed to the `ModuleFederationPlugin` [Read more about the configuration](https://webpack.js.org/concepts/module-federation/#modulefederationplugin-high-level) or [Find examples on module-federation](https://github.com/module-federation/module-federation-examples#module-federation-examples)
13+
14+
Examples:
15+
16+
App 1
17+
```json
18+
// .modulefederationrc.json
19+
{
20+
"name": "app1",
21+
"remotes": {
22+
"app2": "app2@http://localhost:3002/remoteEntry.js"
23+
},
24+
"shared": ["react", "react-dom"]
25+
}
26+
```
27+
28+
App 2
29+
```js
30+
// .modulefederationrc.js
31+
module.exports = {
32+
name: "app2",
33+
filename: "remoteEntry.js",
34+
exposes: {
35+
"./Button": "./src/Button"
36+
},
37+
shared: ["react", "react-dom"],
38+
};
39+
```
40+
41+
Note:
42+
Currently there is not a template for creating an app with federated modules, but rename eg. the `index.js` to `bootstrap.js` and add a new `index.js` with the following code:
43+
```js
44+
import("./bootstrap");
45+
```

docusaurus/website/sidebars.json

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"can-i-use-decorators",
5353
"pre-rendering-into-static-html-files",
5454
"advanced-configuration",
55+
"module-federation",
5556
"alternatives-to-ejecting"
5657
],
5758
"Support": ["troubleshooting"]

packages/react-scripts/config/paths.js

+15
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ const moduleFileExtensions = [
4545
'jsx',
4646
];
4747

48+
const moduleFederationConfigFiles = ['.modulefederationrc.json', '.modulefederationrc.js'];
49+
4850
// Resolve file paths in the same order as webpack
4951
const resolveModule = (resolveFn, filePath) => {
5052
const extension = moduleFileExtensions.find(extension =>
@@ -76,6 +78,10 @@ module.exports = {
7678
appNodeModules: resolveApp('node_modules'),
7779
appWebpackCache: resolveApp('node_modules/.cache'),
7880
appTsBuildInfoFile: resolveApp('node_modules/.cache/tsconfig.tsbuildinfo'),
81+
appMFConfigFile: moduleFederationConfigFiles
82+
.map(resolveApp)
83+
.filter(fs.existsSync)
84+
.shift(),
7985
swSrc: resolveModule(resolveApp, 'src/service-worker'),
8086
publicUrlOrPath,
8187
};
@@ -101,6 +107,10 @@ module.exports = {
101107
appNodeModules: resolveApp('node_modules'),
102108
appWebpackCache: resolveApp('node_modules/.cache'),
103109
appTsBuildInfoFile: resolveApp('node_modules/.cache/tsconfig.tsbuildinfo'),
110+
appMFConfigFile: moduleFederationConfigFiles
111+
.map(resolveApp)
112+
.filter(fs.existsSync)
113+
.shift(),
104114
swSrc: resolveModule(resolveApp, 'src/service-worker'),
105115
publicUrlOrPath,
106116
// These properties only exist before ejecting:
@@ -139,6 +149,11 @@ if (
139149
appNodeModules: resolveOwn('node_modules'),
140150
appWebpackCache: resolveOwn('node_modules/.cache'),
141151
appTsBuildInfoFile: resolveOwn('node_modules/.cache/tsconfig.tsbuildinfo'),
152+
appMFConfigFile: moduleFederationConfigFiles
153+
.map(p => `${templatePath}/${p}`)
154+
.map(resolveOwn)
155+
.filter(fs.existsSync)
156+
.shift(),
142157
swSrc: resolveModule(resolveOwn, `${templatePath}/src/service-worker`),
143158
publicUrlOrPath,
144159
// These properties only exist before ejecting:

packages/react-scripts/config/webpack.config.js

+4
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,10 @@ module.exports = function (webpackEnv) {
795795
},
796796
},
797797
}),
798+
paths.appMFConfigFile &&
799+
new webpack.container.ModuleFederationPlugin(
800+
require(paths.appMFConfigFile)
801+
),
798802
].filter(Boolean),
799803
// Turn off performance processing because we utilize
800804
// our own hints via the FileSizeReporter

0 commit comments

Comments
 (0)