- feat(module-federation): consolidate module federation utils into module-federation package - chore(module-federation): fix tests and linting <!-- Please make sure you have read the submission guidelines before posting an PR --> <!-- https://github.com/nrwl/nx/blob/master/CONTRIBUTING.md#-submitting-a-pr --> <!-- Please make sure that your commit message follows our format --> <!-- Example: `fix(nx): must begin with lowercase` --> <!-- If this is a particularly complex change or feature addition, you can request a dedicated Nx release for this pull request branch. Mention someone from the Nx team or the `@nrwl/nx-pipelines-reviewers` and they will confirm if the PR warrants its own release for testing purposes, and generate it for you if appropriate. --> ## Current Behavior <!-- This is the behavior we have today --> Our current support for Module Federation relies on utilities that are spread and duplicated across the `@nx/webpack` package and the `@nx/rspack` package. ## Expected Behavior <!-- This is the behavior we should expect with the changes in this PR --> Now that we have a `@nx/module-federation` package, dedupe the utils and consolidate them into a single package ## Todo - [x] Migrations for React + Angular to install `@nx/module-federation` and point `ModuleFederationConfig` export to that package from webpack.config and rspack.config files
74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
import {
|
|
ModuleFederationConfig,
|
|
NxModuleFederationConfigOverride,
|
|
} from '@nx/module-federation';
|
|
import { getModuleFederationConfig } from './utils';
|
|
import type { NormalModuleReplacementPlugin } from 'webpack';
|
|
|
|
export async function withModuleFederationForSSR(
|
|
options: ModuleFederationConfig,
|
|
configOverride?: NxModuleFederationConfigOverride
|
|
) {
|
|
if (global.NX_GRAPH_CREATION) {
|
|
return (config) => config;
|
|
}
|
|
|
|
const { sharedLibraries, sharedDependencies, mappedRemotes } =
|
|
await getModuleFederationConfig(options, {
|
|
isServer: true,
|
|
});
|
|
|
|
return (config) => {
|
|
config.target = 'async-node';
|
|
config.output.uniqueName = options.name;
|
|
config.optimization = {
|
|
...(config.optimization ?? {}),
|
|
runtimeChunk: false,
|
|
};
|
|
|
|
config.plugins.push(
|
|
new (require('@module-federation/enhanced').ModuleFederationPlugin)(
|
|
{
|
|
name: options.name.replace(/-/g, '_'),
|
|
filename: 'remoteEntry.js',
|
|
exposes: options.exposes,
|
|
remotes: mappedRemotes,
|
|
shared: {
|
|
...sharedDependencies,
|
|
},
|
|
/**
|
|
* Apply user-defined config overrides
|
|
*/
|
|
...(configOverride ? configOverride : {}),
|
|
runtimePlugins:
|
|
process.env.NX_MF_DEV_REMOTES &&
|
|
!options.disableNxRuntimeLibraryControlPlugin
|
|
? [
|
|
...(configOverride?.runtimePlugins ?? []),
|
|
require.resolve(
|
|
'@nx/module-federation/src/utils/plugins/runtime-library-control.plugin.js'
|
|
),
|
|
]
|
|
: [
|
|
...(configOverride?.runtimePlugins ?? []),
|
|
require.resolve('@module-federation/node/runtimePlugin'),
|
|
],
|
|
virtualRuntimeEntry: true,
|
|
},
|
|
{}
|
|
),
|
|
sharedLibraries.getReplacementPlugin() as NormalModuleReplacementPlugin
|
|
);
|
|
|
|
// The env var is only set from the module-federation-dev-server
|
|
// Attach the runtime plugin
|
|
config.plugins.push(
|
|
new (require('webpack').DefinePlugin)({
|
|
'process.env.NX_MF_DEV_REMOTES': process.env.NX_MF_DEV_REMOTES,
|
|
})
|
|
);
|
|
|
|
return config;
|
|
};
|
|
}
|