Skip to content

Commit

Permalink
chore(example): add basic module federation example (#1444)
Browse files Browse the repository at this point in the history
  • Loading branch information
chenjiahan committed Jan 26, 2024
1 parent 6f0a881 commit ecff2aa
Show file tree
Hide file tree
Showing 14 changed files with 213 additions and 0 deletions.
19 changes: 19 additions & 0 deletions examples/module-federation/host/module-federation.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const { dependencies } = require('./package.json');

module.exports = {
name: 'host',
remotes: {
remote: 'remote@http://localhost:3002/remoteEntry.js',
},
shared: {
...dependencies,
react: {
singleton: true,
requiredVersion: dependencies.react,
},
'react-dom': {
singleton: true,
requiredVersion: dependencies['react-dom'],
},
},
};
16 changes: 16 additions & 0 deletions examples/module-federation/host/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "@examples/module-federation-host",
"private": true,
"scripts": {
"dev": "rsbuild dev",
"build": "rsbuild build"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@rsbuild/core": "workspace:*",
"@rsbuild/plugin-react": "workspace:*"
}
}
29 changes: 29 additions & 0 deletions examples/module-federation/host/rsbuild.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { defineConfig } from '@rsbuild/core';
import { pluginReact } from '@rsbuild/plugin-react';
import mfConfig from './module-federation.config';

export default defineConfig({
plugins: [pluginReact()],
server: {
port: 3000,
},
performance: {
chunkSplit: {
strategy: 'split-by-experience',
override: {
chunks: 'async',
minSize: 30000,
},
},
},
tools: {
rspack(config, { rspack, mergeConfig }) {
return mergeConfig(config, {
output: {
publicPath: 'auto',
},
plugins: [new rspack.container.ModuleFederationPlugin(mfConfig)],
});
},
},
});
15 changes: 15 additions & 0 deletions examples/module-federation/host/src/App.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';

const RemoteButton = React.lazy(() => import('remote/Button'));

const App = () => (
<div>
<h1>Basic Host-Remote</h1>
<h2>Host</h2>
<React.Suspense fallback="Loading Button">
<RemoteButton />
</React.Suspense>
</div>
);

export default App;
11 changes: 11 additions & 0 deletions examples/module-federation/host/src/bootstrap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react';
import ReactDOM from 'react-dom';

import App from './App';

ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root'),
);
1 change: 1 addition & 0 deletions examples/module-federation/host/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import('./bootstrap');
20 changes: 20 additions & 0 deletions examples/module-federation/remote/module-federation.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const { dependencies } = require('./package.json');

module.exports = {
name: 'remote',
exposes: {
'./Button': './src/Button',
},
filename: 'remoteEntry.js',
shared: {
...dependencies,
react: {
singleton: true,
requiredVersion: dependencies.react,
},
'react-dom': {
singleton: true,
requiredVersion: dependencies['react-dom'],
},
},
};
16 changes: 16 additions & 0 deletions examples/module-federation/remote/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "@examples/module-federation-remote",
"private": true,
"scripts": {
"dev": "rsbuild dev",
"build": "rsbuild build"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@rsbuild/core": "workspace:*",
"@rsbuild/plugin-react": "workspace:*"
}
}
29 changes: 29 additions & 0 deletions examples/module-federation/remote/rsbuild.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { defineConfig } from '@rsbuild/core';
import { pluginReact } from '@rsbuild/plugin-react';
import mfConfig from './module-federation.config';

export default defineConfig({
plugins: [pluginReact()],
server: {
port: 3002,
},
performance: {
chunkSplit: {
strategy: 'split-by-experience',
override: {
chunks: 'async',
minSize: 30000,
},
},
},
tools: {
rspack(config, { rspack, mergeConfig }) {
return mergeConfig(config, {
output: {
publicPath: 'auto',
},
plugins: [new rspack.container.ModuleFederationPlugin(mfConfig)],
});
},
},
});
11 changes: 11 additions & 0 deletions examples/module-federation/remote/src/App.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import LocalButton from './Button';

const App = () => (
<div>
<h1>Basic Host-Remote</h1>
<h2>Remote</h2>
<LocalButton />
</div>
);

export default App;
2 changes: 2 additions & 0 deletions examples/module-federation/remote/src/Button.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
const Button = () => <button type="button">Hello from remote</button>;
export default Button;
11 changes: 11 additions & 0 deletions examples/module-federation/remote/src/bootstrap.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import React from 'react';
import ReactDOM from 'react-dom';

import App from './App';

ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root'),
);
1 change: 1 addition & 0 deletions examples/module-federation/remote/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import('./bootstrap');
32 changes: 32 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit ecff2aa

Please sign in to comment.