const HtmlWebpackPlugin = require('html-webpack-plugin');
const { ModuleFederationPlugin } = require('webpack').container;
const path = require('path');
const deps = require('./package.json').dependencies;
module.exports = {
entry: './src/index',
mode: 'development',
devServer: {
static: {
directory: path.join(__dirname, 'dist'),
},
port: 3001,
},
output: {
publicPath: 'auto',
},
module: {
rules: [
{
test: /\.m?js$/,
type: 'javascript/auto',
resolve: {
fullySpecified: false,
},
},
{
test: /\.jsx?$/,
loader: 'babel-loader',
exclude: /node_modules/,
options: {
presets: ['@babel/preset-react'],
},
},
],
},
plugins: [
new ModuleFederationPlugin({
name: 'app1',
library: { type: 'var', name: 'app1' },
remotes: {
app2: 'app2',
},
shared: {
...deps,
'react-dom': {
import: 'react-dom', // the "react" package will be used a provided and fallback module
shareKey: 'react-dom', // under this name the shared module will be placed in the share scope
shareScope: 'legacy', // share scope with this name will be used
singleton: true, // only a single version of the shared module is allowed
},
// oldReact: {
// import: "react", // the "react" package will be used a provided and fallback module
// shareKey: "oldReact", // under this name the shared module will be placed in the share scope
// shareScope: "legacy", // share scope with this name will be used
// singleton: true, // only a single version of the shared module is allowed
// }
},
}),
new HtmlWebpackPlugin({
template: './public/index.html',
app2RemoteEntry: getRemoteEntryUrl(3002),
}),
],
};
function getRemoteEntryUrl(port) {
const { CODESANDBOX_SSE, HOSTNAME = '' } = process.env;
// Check if the example is running on codesandbox
// https://codesandbox.io/docs/environment
if (!CODESANDBOX_SSE) {
return `//localhost:${port}/remoteEntry.js`;
}
const parts = HOSTNAME.split('-');
const codesandboxId = parts[parts.length - 1];
return `//${codesandboxId}-${port}.sse.codesandbox.io/remoteEntry.js`;
}