Skip to content

Nx provides two types of Webpack plugins:

  1. Basic plugins that work in a standard webpack configuration file.
  2. Nx-enhanced plugins that work with the @nx/webpack:webpack executor.

The basic plugins are used in Nx 18 to provide seamless integration with the Webpack CLI. Prior to Nx 18, apps are generated with Nx-enhanced plugins and require @nx/webpack:webpack executor to be used.

This guide contains information on the plugins provided by Nx. For more information on webpack configuration and the difference between basic and Nx-enhanced configuration, refer to the Nx Webpack configuration guide.

The basic plugins work with a standard webpack configuration file by adding them to the plugins option.

The NxAppWebpackPlugin plugin provides common configuration for the build, including TypeScript support and linking workspace libraries (via tsconfig paths).

Type: string

The tsconfig file for the project. e.g. tsconfig.json.

Type: string

The entry point for the bundle. e.g. src/main.ts.

Type: Array<{ entryName: string; entryPath: string; }>

Secondary entry points for the bundle.

Type: string[]

Assets to be copied over to the output path.

Type: string

Babel configuration file if compiler is babel.

Type: boolean If true, Babel will look for a babel.config.json up the directory tree.

Type: string

Set <base href> for the resulting index.html.

Type: boolean

Build the libraries from source. Default is true.

Type: 'babel' | 'swc' | 'tsc'

The compiler to use. Default is babel and requires a .babelrc file.

Type: 'none' | 'anonymous' | 'use-credentials'

Set crossorigin attribute on the script and link tags.

Type: boolean

Delete the output path before building.

Deprecated

Use output.clean instead.

Type: string

The deploy path for the application. e.g. /my-app/

Type: 'all' | 'none' | string[]

Define external packages that will not be bundled. Use all to exclude all 3rd party packages, and none to bundle all packages. Use an array to exclude specific packages from the bundle. Default is none.

Type: boolean

Extract CSS as an external file. Default is true.

Type: boolean Extract licenses from 3rd party modules and add them to the output.

Type: FileReplacement[]

Replace files at build time. e.g. [{ "replace": "src/a.dev.ts", "with": "src/a.prod.ts" }]

Type: boolean

Generate an index.html file if index.html is passed. Default is true

Type: boolean

Generate a package.json file for the bundle. Useful for Node applications.

Type: string

Path to the index.html.

Type: number

Set the memory limit for the type-checking process. Default is 2048.

Type: boolean

Use the source file name in output chunks. Useful for development or for Node.

Type: boolean

Optimize the bundle using Terser.

Type: string

Specify the output filename for the bundle. Useful for Node applications that use @nx/js:node to serve.

Type: 'none' | 'all'

Use file hashes in the output filenames. Recommended for production web applications.

Type: string

Override output.path in webpack configuration. This setting is not recommended and exists for backwards compatibility.

Type: number

Override watchOptions.poll in webpack configuration. This setting is not recommended and exists for backwards compatibility.

Type: string

The polyfill file to use. Useful for supporting legacy browsers. e.g. src/polyfills.ts

Type: string Manually set the PostCSS configuration file. By default, PostCSS will look for postcss.config.js in the directory.

Type: boolean

Display build progress in the terminal.

Type: boolean

Add an additional chunk for the Webpack runtime. Defaults to true when target === 'web'.

Type: string[]

External scripts that will be included before the main application entry.

Type: boolean

Do not add a overrides and resolutions entries to the generated package.json file. Only works in conjunction with generatePackageJson option.

Type: boolean

Do not add a packageManager entry to the generated package.json file. Only works in conjunction with generatePackageJson option.

Type: boolean

Skip type checking. Default is false.

Type: boolean | 'hidden'

Generate source maps.

Type: boolean

When true, process.env.NODE_ENV will be excluded from the bundle. Useful for building a web application to run in a Node environment.

Type: boolean

Generate a stats.json file which can be analyzed using tools such as webpack-bundle-analyzer.

Type: object

Options for the style preprocessor. e.g. { "includePaths": [] } for SASS.

Type: string[]

External stylesheets that will be included with the application.

Type: boolean

Enables the use of subresource integrity validation.

Type: string | string[]

Override the target option in webpack configuration. This setting is not recommended and exists for backwards compatibility.

Type: TransformerEntry[]

List of TypeScript Compiler Transformers Plugins.

Type: boolean

Generate a separate vendor chunk for 3rd party packages.

Type: boolean

Log additional information for debugging purposes.

Type: boolean

Watch for file changes.

Type: boolean

Watch for buildable dependencies and rebuild when they change. Default is true.

const { NxAppWebpackPlugin } = require('@nx/webpack/app-plugin');
const { join } = require('path');
module.exports = {
output: {
path: join(__dirname, '../../dist/apps/demo'),
},
devServer: {
port: 4200,
},
plugins: [
new NxAppWebpackPlugin({
main: './src/main.ts',
tsConfig: './tsconfig.app.json',
index: './src/index.html',
styles: ['./src/styles.css'],
outputHashing: process.env['NODE_ENV'] === 'production' ? 'all' : 'none',
optimization: process.env['NODE_ENV'] === 'production',
}),
],
};

Type: boolean

Enables or disables React SVGR. Default is true.

Deprecated: Add SVGR support in your Webpack configuration without relying on Nx. This option will be removed in Nx 22. See https://react-svgr.com/docs/webpack/

const { NxReactWebpackPlugin } = require('@nx/react/webpack-plugin');
const { join } = require('path');
module.exports = {
// ...
plugins: [
new NxReactWebpackPlugin({
svgr: false,
}),
],
};

The Nx-enhanced plugins work with @nx/webpack:webpack executor and receive the target options and context from the executor. These are used prior to Nx 18, and are still used when using Module Federation.

The plugins are used in conjunction with composePlugins utility to generate a final Webpack configuration object, once all of the plugins have applied their changes.

webpack.config.js
const { composePlugins } = require('@nx/webpack');
function myCustomPlugin() {
// `options` and `context` are the target options and
// `@nx/webpack:webpack` executor context respectively.
return (webpackConfig, { options, context }) => {
// Do something with the config.
return webpackConfig;
};
}
module.export = composePlugins(withNx(), withReact(), myCustomPlugin());

The withNx plugin provides common configuration for the build, including TypeScript support and linking workspace libraries (via tsconfig paths).

Type: boolean

Disable type checks (useful to speed up builds).

const { composePlugins, withNx } = require('@nx/webpack');
module.exports = composePlugins(withNx(), (config) => {
// Further customize webpack config
return config;
});

The withWeb plugin adds support for CSS/SASS/Less stylesheets, assets (such as images and fonts), and index.html processing.

Type: string

Base URL for the application being built.

Type: 'none' | 'anonymous' | 'use-credentials'

"The crossorigin attribute to use for generated javascript script tags. One of 'none' | 'anonymous' | ' use-credentials'."

Type: string

URL where the application will be deployed.

Type: boolean

Extract CSS into a .css file.

Type: boolean

Generates index.html file to the output path. This can be turned off if using a webpack plugin to generate HTML such as html-webpack-plugin.

Type: string

HTML File which will be contain the application.

Type: string

Set a path (relative to workspace root) to a PostCSS config that applies to the app and all libs. Defaults to undefined, which auto-detects postcss.config.js files in each app.

Type: string[]

Paths to scripts (relative to workspace root) which will be included before the main application entry.

Type: { includePaths: string[] }

Options to pass to style preprocessors. includePaths is a list of paths that are included (e.g. workspace libs with stylesheets).

Type: string[]

Paths to stylesheets (relative to workspace root) which will be included with the application.

Type: boolean

Enables the use of subresource integrity validation.

const { composePlugins, withNx, withWeb } = require('@nx/webpack');
module.exports = composePlugins(
// always pass withNx() first
withNx(),
// add web functionality
withWeb({
styles: ['my-app/src/styles.css'],
}),
(config) => {
// Further customize webpack config
return config;
}
);

The withReact plugin adds support for React JSX, SVGR, and Fast Refresh

The options are the same as withWeb plus the following.

Type: undefined|false

SVGR allows SVG files to be imported as React components. Set this to false to disable this behavior.

const { composePlugins, withNx } = require('@nx/webpack');
const { withReact } = require('@nx/react');
module.exports = composePlugins(
withNx(), // always pass withNx() first
withReact({
styles: ['my-app/src/styles.css'],
svgr: false,
postcssConfig: 'my-app/postcss',
}),
(config) => {
// Further customize webpack config
return config;
}
);

withModuleFederation and withModuleFederationForSSR

Section titled “withModuleFederation and withModuleFederationForSSR”

The withModuleFederation and withModuleFederationForSSR plugins add module federation support to the webpack build. These plugins use ModuleFederationPlugin and provide a simpler API through Nx.

For more information, refer to the Module Federation recipe.

Both withModuleFederation and withModuleFederationForSSR share the same options. The withModuleFederation plugin is for the browser, and the withModuleFederationForSSR plugin is used on the server-side (Node).

Type: string

The name of the host/remote application.

Type: Aray<string[] | [remoteName: string, remoteUrl: string]>

For host to specify all remote applications. If a string is used, Nx will match it with a matching remote in the workspace.

Use [<name>, <url>] to specify the exact URL of the remote, rather than what's in the remote's project.json file.

Type: { type: string; name: string }

Type: Record<string, string>

Entry points that are exposed from a remote application.

e.g.

exposes: {
'./Module': '<app-root>/src/remote-entry.ts',
},

Type: Function

Takes a library name and the current share configuration, and returns one of

  • false - Exclude this library from shared.
  • undefined - Keep Nx sharing defaults.
  • SharedLibraryConfig - Override Nx sharing defaults with custom configuration.

Type: Array<string |{ libraryName: string; sharedConfig: SharedLibraryConfig }>

Shared libraries in addition to the ones that Nx detects automatically. Items match ModuleFederationPlugin's sharing configuration.

const { composePlugins, withNx } = require('@nx/webpack');
const { withReact, withModuleFederation } = require('@nx/react');
// Host config
// e.g. { remotes: ['about', 'dashboard'] }
const moduleFederationConfig = require('./module-federation.config');
module.exports = composePlugins(
withNx(),
withReact(),
withModuleFederation(moduleFederationConfig),
(config) => {
// Further customize webpack config
return config;
}
);