Webpack plugins
Nx provides two types of Webpack plugins:
- Basic plugins that work in a standard webpack configuration file.
- 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.
NxWebpackPlugin
The NxWebpackPlugin
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.
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.
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