Webpack plugins

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.

Basic plugins

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

NxAppWebpackPlugin

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

Options

tsConfig

Type: string

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

main

Type: string

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

additionalEntryPoints

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

Secondary entry points for the bundle.

assets

Type: string[]

Assets to be copied over to the output path.

babelConfig

Type: string

Babel configuration file if compiler is babel.

babelUpwardRootMode

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

baseHref

Type: string

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

buildLibsFromSource

Type: boolean

Build the libraries from source. Default is true.

compiler

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

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

crossOrigin

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

Set crossorigin attribute on the script and link tags.

deleteOutputPath

Type: boolean

Delete the output path before building.

deployUrl

Type: string

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

externalDependencies

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.

extractCss

Type: boolean

Extract CSS as an external file. Default is true.

extractLicenses

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

fileReplacements

Type: FileReplacement[]

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

generateIndexHtml

Type: boolean

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

generatePackageJson

Type: boolean

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

index

Type: string

Path to the index.html.

memoryLimit

Type: number

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

namedChunks

Type: boolean

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

optimization

Type: boolean

Optimize the bundle using Terser.

outputFileName

Type: string

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

outputHashing

Type: 'none' | 'all'

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

outputPath

Type: string

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

poll

Type: number

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

polyfills

Type: string

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

postcssConfig

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

progress

Type: boolean

Display build progress in the terminal.

runtimeChunk

Type: boolean

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

scripts

Type: string[]

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

skipTypeChecking

Type: boolean

Skip type checking. Default is false.

sourceMap

Type: boolean | 'hidden'

Generate source maps.

ssr

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.

statsJson

Type: boolean

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

stylePreprocessorOptions

Type: object

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

styles

Type: string[]

External stylesheets that will be included with the application.

subresourceIntegrity

Type: boolean

Enables the use of subresource integrity validation.

target

Type: string | string[]

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

transformers

Type: TransformerEntry[]

List of TypeScript Compiler Transformers Plugins.

vendorChunk

Type: boolean

Generate a separate vendor chunk for 3rd party packages.

verbose

Type: boolean

Log additional information for debugging purposes.

watch

Type: boolean

Watch for file changes.

Example

1const { NxAppWebpackPlugin } = require('@nx/webpack/app-plugin'); 2const { join } = require('path'); 3 4module.exports = { 5 output: { 6 path: join(__dirname, '../../dist/apps/demo'), 7 }, 8 devServer: { 9 port: 4200, 10 }, 11 plugins: [ 12 new NxAppWebpackPlugin({ 13 main: './src/main.ts', 14 tsConfig: './tsconfig.app.json', 15 index: './src/index.html', 16 styles: ['./src/styles.css'], 17 outputHashing: process.env['NODE_ENV'] === 'production' ? 'all' : 'none', 18 optimization: process.env['NODE_ENV'] === 'production', 19 }), 20 ], 21}; 22

NxReactWebpackPlugin

Options

svgr

Type: boolean

Enables or disables React SVGR. Default is true.

Example

1const { NxReactWebpackPlugin } = require('@nx/react/webpack-plugin'); 2const { join } = require('path'); 3 4module.exports = { 5 // ... 6 plugins: [ 7 new NxReactWebpackPlugin({ 8 svgr: false, 9 }), 10 ], 11}; 12

Nx-enhanced plugins

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
1const { composePlugins } = require('@nx/webpack'); 2 3function myCustomPlugin() { 4 // `options` and `context` are the target options and 5 // `@nx/webpack:webpack` executor context respectively. 6 return (webpackConfig, { options, context }) => { 7 // Do something with the config. 8 return webpackConfig; 9 }; 10} 11 12module.export = composePlugins(withNx(), withReact(), myCustomPlugin()); 13

withNx

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

Options

skipTypeChecking

Type: boolean

Disable type checks (useful to speed up builds).

Example

1const { composePlugins, withNx } = require('@nx/webpack'); 2 3module.exports = composePlugins(withNx(), (config) => { 4 // Further customize webpack config 5 return config; 6}); 7

withWeb

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

Options

baseHref

Type: string

Base URL for the application being built.

crossOrigin

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

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

deployUrl

Type: string

URL where the application will be deployed.

extractCss

Type: boolean

Extract CSS into a .css file.

generateIndexHtml

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.

index

Type: string

HTML File which will be contain the application.

postcssConfig

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.

scripts

Type: string[]

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

stylePreprocessorOptions

Type: { includePaths: string[] }

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

styles

Type: string[]

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

subresourceIntegrity

Type: boolean

Enables the use of subresource integrity validation.

Example

1const { composePlugins, withNx, withWeb } = require('@nx/webpack'); 2 3module.exports = composePlugins( 4 // always pass withNx() first 5 withNx(), 6 // add web functionality 7 withWeb({ 8 styles: ['my-app/src/styles.css'], 9 }), 10 (config) => { 11 // Further customize webpack config 12 return config; 13 } 14); 15

withReact

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

Options

The options are the same as withWeb plus the following.

svgr

Type: undefined|false

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

Example

1const { composePlugins, withNx } = require('@nx/webpack'); 2const { withReact } = require('@nx/react'); 3 4module.exports = composePlugins( 5 withNx(), // always pass withNx() first 6 withReact({ 7 styles: ['my-app/src/styles.css'], 8 svgr: false, 9 postcssConfig: 'my-app/postcss', 10 }), 11 (config) => { 12 // Further customize webpack config 13 return config; 14 } 15); 16

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.

Options

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).

name

Type: string

The name of the host/remote application.

remotes

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.

library

Type: { type: string; name: string }

exposes

Type: Record<string, string>

Entry points that are exposed from a remote application.

e.g.

1exposes: { 2 './Module' 3: 4 '<app-root>/src/remote-entry.ts', 5} 6, 7
shared

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.
additionalShared

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

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

1const { composePlugins, withNx } = require('@nx/webpack'); 2const { withReact, withModuleFederation } = require('@nx/react'); 3 4// Host config 5// e.g. { remotes: ['about', 'dashboard'] } 6const moduleFederationConfig = require('./module-federation.config'); 7 8module.exports = composePlugins( 9 withNx(), 10 withReact(), 11 withModuleFederation(moduleFederationConfig), 12 (config) => { 13 // Further customize webpack config 14 return config; 15 } 16); 17