These options determine how the different types of modules within a project will be treated.
An array of rules applied by default for modules.
See source code for details.
export default {
module: {
defaultRules: [
"...", // you can use "..." to reference those rules applied by webpack by default
],
},
};Starting with webpack 5.87.0, falsy values including 0, "", false, null and undefined are allowed to pass to module.defaultRules to conditionally disable specific rules.
export default {
module: {
defaultRules: [
false &&
{
// this rule will be disabled
},
],
},
};It's possible to configure all generators' options in one place with a module.generator.
webpack.config.js
export default {
module: {
generator: {
asset: {
// Generator options for asset modules
// Indicates if this asset should be treated as binary. Set to 'false' to handle it as text instead. Available since webpack 5.93.0
binary: false,
// The options for data url generator.
dataUrl: {
// Asset encoding (defaults to "base64")
// type: 'base64' | false
encoding: "base64",
// Asset mimetype (getting from file extension by default).
// type: string
mimetype: "image/png",
},
// Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.
// type: boolean
emit: true,
// Customize filename for this asset module
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
filename: "static/[path][name][ext]",
// Customize publicPath for asset modules, available since webpack 5.28.0
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
publicPath: "https://cdn/assets/",
// Emit the asset in the specified folder relative to 'output.path', available since webpack 5.67.0
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
outputPath: "cdn-assets/",
},
"asset/inline": {
// Generator options for asset/inline modules
// Indicates if this asset should be treated as binary. Set to 'false' to handle it as text instead. Available since webpack 5.93.0
binary: false,
// The options for data url generator.
dataUrl: {
// Asset encoding (defaults to "base64")
// type: 'base64' | false
encoding: "base64",
// Asset mimetype (getting from file extension by default).
// type: string
mimetype: "image/png",
},
},
"asset/resource": {
// Generator options for asset/resource modules
// Indicates if this asset should be treated as binary. Set to 'false' to handle it as text instead. Available since webpack 5.93.0
binary: false,
// Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.
// type: boolean
emit: true,
// Customize filename for this asset module
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
filename: "static/[path][name][ext]",
// Customize publicPath for asset/resource modules, available since webpack 5.28.0
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
publicPath: "https://cdn/assets/",
// Emit the asset in the specified folder relative to 'output.path', available since webpack 5.67.0
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
outputPath: "cdn-assets/",
},
"asset/bytes": {
// No generator options are supported for this module type yet
},
javascript: {
// No generator options are supported for this module type yet
},
"javascript/auto": {
// ditto
},
"javascript/dynamic": {
// ditto
},
"javascript/esm": {
// ditto
},
css: {
// Generator options for css modules
// Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.
// type: boolean, available since webpack 5.90.0
exportsOnly: true,
// Customize how css export names are exported to javascript modules, such as keeping them as is, transforming them to camel case, etc.
// type: 'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only' | ((name: string) => string)
// available since webpack 5.90.4
exportsConvention: "camel-case-only",
},
"css/auto": {
// Generator options for css/auto modules
// Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.
// type: boolean, available since webpack 5.90.0
exportsOnly: true,
// Customize how css export names are exported to javascript modules, such as keeping them as is, transforming them to camel case, etc.
// type: 'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only' | ((name: string) => string)
// available since webpack 5.90.4
exportsConvention: "camel-case-only",
// Customize the format of the local class names generated for css modules.
// type: string, besides the substitutions at File-level and Module-level in https://webpack.js.org/configuration/output/#template-strings, also include [uniqueName] and [local].
// available since webpack 5.90.4
localIdentName: "[uniqueName]-[id]-[local]",
},
"css/global": {
// ditto
},
"css/module": {
// ditto
},
json: {
// Generator options for json modules
// Use `JSON.parse` when the JSON string is longer than 20 characters.
parse: JSONParse,
},
// others…
},
},
};Similar to the module.generator, you can configure all parsers' options in one place with a module.parser.
webpack.config.js
export default {
module: {
parser: {
asset: {
// Parser options for asset modules
// The options for data url generator.
dataUrl: {
// Asset encoding (defaults to "base64")
// type: 'base64' | false
encoding: "base64",
// Asset mimetype (getting from file extension by default).
// type: string
mimetype: "image/png",
},
// Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.
// type: boolean
emit: true,
// Customize filename for this asset module
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
filename: "static/[path][name][ext]",
// Customize publicPath for asset modules, available since webpack 5.28.0
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
publicPath: "https://cdn/assets/",
// Emit the asset in the specified folder relative to 'output.path', available since webpack 5.67.0
// type: string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
outputPath: "cdn-assets/",
},
"asset/inline": {
// No parser options are supported for this module type yet
},
"asset/resource": {
// ditto
},
"asset/source": {
// ditto
},
"asset/bytes": {
// ditto
},
javascript: {
// Parser options for javascript modules
// e.g, enable parsing of require.ensure syntax
requireEnsure: true,
// Set the module to `'strict'` or `'non-strict'` mode. This can affect the module's behavior, as some behaviors differ between strict and non-strict modes.
overrideStrict: "non-strict",
},
"javascript/auto": {
// ditto
},
"javascript/dynamic": {
// ditto
},
"javascript/esm": {
// ditto
},
css: {
// Parser options for css modules
// Enable/disable `@import` at-rules handling, available since webpack 5.97.0
// type: boolean
import: true,
// Enable/disable url()/image-set()/src()/image() functions handling, available since webpack 5.97.0
// type: boolean
url: true,
// Use ES modules named export for css exports, available since webpack 5.90.0
// type: boolean
namedExports: true,
// Configure how CSS content is exported
// type: string
exportType: "link",
},
"css/auto": {
// ditto
},
"css/global": {
// ditto
},
"css/module": {
// ditto
},
// others…
},
},
};Configure options for the CSS parser.
export default {
module: {
parser: {
css: {
// ...
namedExports: true,
},
},
},
};This option enables the handling of @import at-rules in CSS files. When set to true, @import statements are processed, allowing modular inclusion of styles from other CSS files.
Type: boolean
Available: 5.97.0+
Example:
export default {
module: {
parser: {
css: {
import: true,
},
},
},
};/* reset-styles.css */
body {
margin: 0;
padding: 0;
}/* styles.css */
@import "./reset-styles.css";
body {
background-color: red;
}This option enables or disables the handling of URLs in functions such as url(), image-set(), src(), and image() within CSS files. When enabled, these URLs are resolved and processed by webpack.
Type: boolean
Available: 5.97.0+
Example:
export default {
module: {
parser: {
css: {
url: true,
},
},
},
};/* styles.css */
.background {
background-image: url("./images/bg.jpg");
}
.icon {
content: image("./icons/star.svg");
}This option enables the use of ES modules named export for CSS exports. When set to true, the CSS module will export its classes and styles using named exports.
Type: boolean
Available: 5.90.0+
Example:
export default {
module: {
parser: {
css: {
namedExports: true,
},
},
},
};When namedExports is false for CSS modules, you can retrieve CSS classes using various import methods.
Named exports are redirected to improve developer experience (DX), facilitating a smooth transition from default exports to named exports:
import * as styles from "./styles.module.css";
import styles1 from "./styles.module.css";
import { foo } from "./styles.module.css";
console.log(styles.default.foo); // Access via styles.default
console.log(styles.foo); // Access directly from styles
console.log(styles1.foo); // Access via default import styles1
console.log(foo); // Direct named importWhen namedExports is enabled (default behavior), you can use only named exports to import CSS classes.
/* styles.css */
.header {
color: blue;
}
.footer {
color: green;
}import { footer, header } from "./styles.module.css";By enabling namedExports, you adopt a more modular and maintainable approach to managing CSS in JavaScript projects, leveraging ES module syntax for clearer and more explicit imports.
Enable or disable renaming of @keyframes animation names in CSS modules.
booleantruewebpack.config.js
export default {
module: {
parser: {
css: {
animation: true, // Enable @keyframes renaming
},
},
},
};Enable or disable renaming of @container names in CSS modules.
booleantruewebpack.config.js
export default {
module: {
parser: {
css: {
container: true, // Enable @container renaming
},
},
},
};Enable or disable renaming of custom identifiers in CSS modules.
booleantruewebpack.config.js
export default {
module: {
parser: {
css: {
customIdents: true, // Enable custom identifier renaming
},
},
},
};Enable or disable renaming of dashed identifiers, such as CSS custom properties (e.g., --my-variable).
booleantruewebpack.config.js
export default {
module: {
parser: {
css: {
dashedIdents: true, // Enable dashed identifier renaming
},
},
},
};Enable or disable renaming of @function names in CSS modules.
booleantruewebpack.config.js
export default {
module: {
parser: {
css: {
function: true, // Enable @function renaming
},
},
},
};Enable or disable renaming of grid identifiers in CSS modules.
booleantruewebpack.config.js
export default {
module: {
parser: {
css: {
grid: true, // Enable grid identifier renaming
},
},
},
};Configure how CSS content will be exported.
Type: boolean
Available: 5.102.0+
Example:
export default {
module: {
parser: {
css: {
// ...
exportType: "text",
},
},
},
};Possible values: `'link' | 'text' | 'css-style-sheet'
link - extract CSS into own file and use link tags to inject into DOM.text - store CSS in JS file and return using default export.css-style-sheet - the default export is a constructable stylesheet (i.e. CSSStyleSheet). Useful for custom elements and shadow DOM.Configure options for JavaScript parser.
export default {
module: {
parser: {
javascript: {
// ...
commonjsMagicComments: true,
},
},
},
};It's allowed to configure those options in Rule.parser as well to target specific modules.
Enable magic comments support for CommonJS.
Type: boolean
Available: 5.17.0+
Example:
export default {
module: {
parser: {
javascript: {
commonjsMagicComments: true,
},
},
},
};Note that only webpackIgnore comment is supported at the moment:
const x = require(/* webpackIgnore: true */ "x");Specify the global fetchPriority for dynamic import.
Type: 'low' | 'high' | 'auto' | false
Available: 5.87.0+
Example:
export default {
module: {
parser: {
javascript: {
dynamicImportFetchPriority: "high",
},
},
},
};Specifies global mode for dynamic import.
Type: 'eager' | 'weak' | 'lazy' | 'lazy-once'
Available: 5.73.0+
Example:
export default {
module: {
parser: {
javascript: {
dynamicImportMode: "lazy",
},
},
},
};Specifies global prefetch for dynamic import.
Type: number | boolean
Available: 5.73.0+
Example:
export default {
module: {
parser: {
javascript: {
dynamicImportPrefetch: false,
},
},
},
};Specifies global preload for dynamic import.
Type: number | boolean
Available: 5.73.0+
Example:
export default {
module: {
parser: {
javascript: {
dynamicImportPreload: false,
},
},
},
};Specifies the behavior of invalid export names in \"import ... from ...\" and \"export ... from ...\".
Type: 'error' | 'warn' | 'auto' | false
Available: 5.62.0+
Example:
export default {
module: {
parser: {
javascript: {
exportsPresence: "error",
},
},
},
};Specifies the behavior of invalid export names in \"import ... from ...\".
Type: 'error' | 'warn' | 'auto' | false
Available: 5.62.0+
Example:
export default {
module: {
parser: {
javascript: {
importExportsPresence: "error",
},
},
},
};Controls how webpack evaluates import.meta expressions during bundling.
boolean | 'preserve-unknown'trueAccepted values:
true - webpack evaluates known import.meta properties (e.g. import.meta.url, import.meta.webpackHot); behavior of unknown properties depends on other configuration (e.g. output.module).
false - disables all import.meta evaluation; webpack leaves expressions as-is.
'preserve-unknown' 5.105.0+ - evaluates known properties as usual but preserves any non-standard properties verbatim in the output instead of removing them.
Example - disable import.meta evaluation entirely:
export default {
module: {
parser: {
javascript: {
importMeta: false,
},
},
},
};Example - preserve custom import.meta properties without enabling output.module:
// webpack.config.js
export default {
module: {
parser: {
javascript: {
importMeta: "preserve-unknown",
},
},
},
};With this configuration, custom properties on import.meta set by the build tool or runtime are preserved in the generated output:
// import.meta.customProp is set externally (e.g. by a build tool or runtime)
if (import.meta.customProp) {
console.log(import.meta.customProp);
}Enable/disable evaluating import.meta.webpackContext.
Type: boolean
Available: 5.70.0+
Example:
export default {
module: {
parser: {
javascript: {
importMetaContext: true,
},
},
},
};Set the module to 'strict' or 'non-strict' mode. This can affect the module's behavior, as some behaviors differ between strict and non-strict modes.
Type: 'strict' | 'non-strict'
Available: 5.93.0+
Example:
export default {
module: {
parser: {
javascript: {
overrideStrict: "non-strict",
},
},
},
};Specifies the behavior of invalid export names in \"export ... from ...\". This might be useful to disable during the migration from \"export ... from ...\" to \"export type ... from ...\" when reexporting types in TypeScript.
Type: 'error' | 'warn' | 'auto' | false
Available: 5.62.0+
Example:
export default {
module: {
parser: {
javascript: {
reexportExportsPresence: "error",
},
},
},
};Enable parsing of new URL() syntax.
Type: boolean = true | 'relative'
Example:
export default {
module: {
parser: {
javascript: {
url: false, // disable parsing of `new URL()` syntax
},
},
},
};The 'relative' value for module.parser.javascript.url is available since webpack 5.23.0. When used, webpack would generate relative URLs for new URL() syntax, i.e., there's no base URL included in the result URL:
<!-- with 'relative' -->
<img src="c43188443804f1b1f534.svg" />
<!-- without 'relative' -->
<img src="file:///path/to/project/dist/c43188443804f1b1f534.svg" />Use a custom JavaScript parse function instead of webpack's built-in parser.
Return ast, comments, and semicolons to ensure webpack’s AST analysis works correctly.
ast should be ESTree-compatible.
comments is an array of ESTree comment nodes.
semicolons is a set of positions where the parser inserted a semicolon.
Type: (code: string, options: ParseOptions) => ParseResult
Example:
export default {
module: {
parser: {
javascript: {
parse: (code, options) => {
const comments = [];
const semicolons = new Set();
const onInsertedSemicolon = (pos) => semicolons.add(pos);
const parseOptions = {
...options,
module: options.sourceType === "module",
loc: options.locations,
onComment: options.comments ? comments : undefined,
onInsertedSemicolon: options.semicolons
? onInsertedSemicolon
: undefined,
};
const ast = meriyah.parse(code, parseOptions);
return { ast, comments, semicolons };
},
},
},
},
};Configure options for json parser.
export default {
module: {
parser: {
json: {
// options
},
},
},
};The depth of json dependency flagged as exportInfo. By default, it is set to Infinity in production mode, and 1 in development mode.
numberexport default {
module: {
parser: {
json: {
// For example, for the following json
// {
// "depth_1": {
// "depth_2": {
// "depth_3": "foo"
// }
// },
// "_depth_1": "bar"
// }
// when `exportsDepth: 1`, `depth_2` and `depth_3` will not be flagged as `exportInfo`.
exportsDepth: 1,
},
},
},
};Allow named exports for json of object type.
booleanexport default {
module: {
parser: {
json: {
// Example:
// import { myField } from "./file.json";
//
// console.log(myField);
namedExports: true,
},
},
},
};Function to parser content and return JSON.
((input: string) => Buffer | JsonValue)import json5 from "json5";
export default {
module: {
parser: {
json: {
parse: json5.parse,
},
},
},
};RegExp [RegExp] function(resource) string [string]
Prevent webpack from parsing any files matching the given regular expression(s). Ignored files should not have calls to import, require, define or any other importing mechanism. This can boost build performance when ignoring large libraries.
noParse can be also used as a way to deliberately prevent expansion of all import, require, define etc. calls for cases when those calls are unreachable at runtime.
For example, when building a project for 'browser' target and using a third-party library that was prebuilt for both browser and Node.js and it requires Node.js built-ins e.g. require('os').
webpack.config.js
export default {
// ...
module: {
noParse: /jquery|lodash|src[\\/]vendor[\\/]somelib/,
},
};export default {
// ...
module: {
noParse: (content) =>
/jquery|lodash|src[\\/]vendor[\\/]somelib/.test(content),
},
};boolean function (module)
Cache the resolution of module requests. There are a couple of defaults for module.unsafeCache:
false if cache is disabled.true if cache is enabled and the module appears to come from node modules, false otherwise.webpack.config.js
export default {
// ...
module: {
unsafeCache: false,
},
};(Rule | undefined | null | false | "" | 0 | "...")[]
An array of Rules which are matched to requests when modules are created. These rules can modify how the module is created. They can apply loaders to the module, or modify the parser.
As of webpack 5.87.0, falsy values such as false, undefined, null and 0 can be used to conditionally disable a rule.
object
A Rule can be separated into three parts — Conditions, Results and nested Rules.
There are two input values for the conditions:
The resource: An absolute path to the file requested. It's already resolved according to the resolve rules.
The issuer: An absolute path to the file of the module which requested the resource. It's the location of the import.
Example: When we import './style.css' within app.js, the resource is /path/to/style.css and the issuer is /path/to/app.js.
In a Rule the properties test, include, exclude and resource are matched with the resource and the property issuer is matched with the issuer.
When using multiple conditions, all conditions must match.
Rule results are used only when the Rule condition matches.
There are two output values of a Rule:
These properties affect the loaders: loader, options, use.
For compatibility also these properties: query, loaders.
The enforce property affects the loader category. Whether it's a normal, pre- or post- loader.
The parser property affects the parser options.
Nested rules can be specified under the properties rules and oneOf.
These rules are evaluated only when the parent Rule condition matches. Each nested rule can contain its own conditions.
The order of evaluation is as follows:
A Condition that allows you to match the import assertion of a dependency and apply specific rules based on the assertion type.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// Handles imports with the assertion "assert { type: 'json' }"
assert: { type: "json" },
loader: import.meta.resolve("./loader-assert.js"),
},
],
},
};index.js
import one from "./pkg-1.json" assert { type: "json" };In this example, Rule.assert is used to apply loader-assert.js to any module imported with the assertion assert { type: "json" }, ensuring that JSON files are processed correctly.
A Condition that allows you to match the child compiler name.
webpack.config.js
export default {
// ...
name: "compiler",
module: {
rules: [
{
test: /a\.js$/,
compiler: "compiler", // Matches the "compiler" name, loader will be applied
use: "./loader",
},
{
test: /b\.js$/,
compiler: "other-compiler", // Does not match the "compiler" name, loader will NOT be applied
use: "./loader",
},
],
},
};string
Possible values: 'pre' | 'post'
Specifies the category of the loader. No value means normal loader.
There is also an additional category "inlined loader" which are loaders applied inline of the import/require.
There are two phases that all loaders enter one after the other:
post, inline, normal, pre. See Pitching Loader for details.pre, normal, inline, post. Transformation on the source code of a module happens in this phase.All normal loaders can be omitted (overridden) by prefixing ! in the request.
All normal and pre loaders can be omitted (overridden) by prefixing -! in the request.
All normal, post and pre loaders can be omitted (overridden) by prefixing !! in the request.
// Disable normal loaders
import { a } from "!./file1.js";// Disable preloaders and normal loaders
import { b } from "-!./file2.js";// Disable all loaders
import { c } from "!!./file3.js";Inline loaders and ! prefixes should not be used as they are non-standard. They may be used by loader generated code.
Exclude all modules matching any of these conditions. If you supply a Rule.exclude option, you cannot also supply a Rule.resource. See Rule.resource and Condition.exclude for details.
Include all modules matching any of these conditions. If you supply a Rule.include option, you cannot also supply a Rule.resource. See Rule.resource and Condition.include for details.
A Condition to match against the module that issued the request. In the following example, the issuer for the a.js request would be the path to the index.js file.
index.js
import A from "./a.js";This option can be used to apply loaders to the dependencies of a specific module or set of modules.
Allows to filter/match by layer of the issuer.
webpack.config.js
export default {
// ...
module: {
rules: [
{
issuerLayer: "other-layer",
},
],
},
};string
Specify the layer in which the module should be placed in. A group of modules could be united in one layer which could then be used in split chunks, stats or entry options.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /module-layer-change/,
layer: "layer",
},
],
},
};boolean = false
Extracts existing source map data from files (from their //# sourceMappingURL comment), useful for preserving the source maps of third-party libraries.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.m?js$/,
extractSourceMap: true,
},
],
},
};Rule.loader is a shortcut to Rule.use: [ { loader } ]. See Rule.use and UseEntry.loader for details.
Rule.loaders is an alias to Rule.use. See Rule.use for details.
You can match config rules to data uri with mimetype.
webpack.config.js
export default {
// ...
module: {
rules: [
{
mimetype: "application/json",
type: "json",
},
],
},
};application/json, text/javascript, application/javascript, application/node and application/wasm are already included by default as mimetype.
An array of Rules from which only the first matching Rule is used when the Rule matches.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.css$/,
oneOf: [
{
resourceQuery: /inline/, // foo.css?inline
type: "asset/inline",
},
{
resourceQuery: /external/, // foo.css?external
type: "asset/resource",
},
],
},
],
},
};Rule.options and Rule.query are shortcuts to Rule.use: [ { options } ]. See Rule.use and UseEntry.options for details.
An object with parser options. All applied parser options are merged.
Parsers may inspect these options and disable or reconfigure themselves accordingly. Most of the default plugins interpret the values as follows:
false disables the parser.true or leaving it undefined enables the parser.However, parser plugins may accept more than only a boolean. For example, the internal NodeStuffPlugin can accept an object instead of true to add additional options for a particular Rule.
Examples (parser options by the default plugins):
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
// ...
module: {
rules: [
{
// ...
parser: {
amd: false, // disable AMD
commonjs: false, // disable CommonJS
system: false, // disable SystemJS
harmony: false, // disable ES2015 Harmony import/export
requireInclude: false, // disable require.include
requireEnsure: false, // disable require.ensure
requireContext: false, // disable require.context
browserify: false, // disable special handling of Browserify bundles
requireJs: false, // disable requirejs.*
commonjsMagicComments: false, // disable magic comments support for CommonJS
node: {}, // reconfigure node layer on module level
// or
// node: false, // disable __dirname, __filename, etc.
worker: ["default from web-worker", "..."], // Customize the WebWorker handling for javascript files, "..." refers to the defaults.
},
},
],
},
};If Rule.type is an asset then Rules.parser option may be an object or a function that describes a condition whether to encode file contents to Base64 or emit it as a separate file into the output directory.
If Rule.type is an asset or asset/inline then Rule.generator option may be an object that describes the encoding of the module source or a function that encodes module's source by a custom algorithm.
See Asset Modules guide for additional information and use cases.
object = { maxSize number = 8096 } function (source, { filename, module }) => boolean
If a module source size is less than maxSize then module will be injected into the bundle as a Base64-encoded string, otherwise module file will be emitted into the output directory.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
parser: {
dataUrlCondition: {
maxSize: 4 * 1024,
},
},
},
],
},
};When a function is given, returning true tells webpack to inject the module into the bundle as Base64-encoded string, otherwise module file will be emitted into the output directory.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
parser: {
dataUrlCondition: (source, { filename, module }) => {
const content = source.toString();
return content.includes("some marker");
},
},
},
],
},
};object = { encoding string = 'base64' | false, mimetype string = undefined | false } function (content, { filename, module }) => string
When Rule.generator.dataUrl is used as an object, you can configure two properties:
'base64', module source will be encoded using Base64 algorithm. Setting encoding to false will disable encoding.webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
generator: {
dataUrl: {
encoding: "base64",
mimetype: "mimetype/png",
},
},
},
],
},
};When used as a function, it executes for every module and must return a data URI string.
export default {
// ...
module: {
rules: [
{
// ...
generator: {
dataUrl: (content) => {
const svgToMiniDataURI = require("mini-svg-data-uri");
if (typeof content !== "string") {
content = content.toString();
}
return svgToMiniDataURI(content);
},
},
},
],
},
};Opt out of writing assets from Asset Modules, you might want to use it in Server side rendering cases.
Type: boolean = true
Available: 5.25.0+
Example:
export default {
// …
module: {
rules: [
{
test: /\.png$/i,
type: "asset/resource",
generator: {
emit: false,
},
},
],
},
};The same as output.assetModuleFilename but for specific rule. Overrides output.assetModuleFilename and works only with asset and asset/resource module types.
webpack.config.js
export default {
// ...
output: {
assetModuleFilename: "images/[hash][ext][query]",
},
module: {
rules: [
{
test: /\.png$/,
type: "asset/resource",
},
{
test: /\.html$/,
type: "asset/resource",
generator: {
filename: "static/[hash][ext]",
},
},
],
},
};Customize publicPath for specific Asset Modules.
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)export default {
// ...
output: {
publicPath: "static/",
},
module: {
rules: [
{
test: /\.png$/i,
type: "asset/resource",
generator: {
publicPath: "assets/",
},
},
],
},
};Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there.
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)export default {
// ...
output: {
publicPath: "static/",
},
module: {
rules: [
{
test: /\.png$/i,
type: "asset/resource",
generator: {
publicPath: "https://cdn/assets/",
outputPath: "cdn-assets/",
},
},
],
},
};A Condition matched with the resource. See details in Rule conditions.
A Condition matched with the resource query. This option is used to test against the query section of a request string (i.e. from the question mark onwards). If you were to import Foo from './foo.css?inline', the following condition would match:
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.css$/,
resourceQuery: /inline/,
type: "asset/inline",
},
],
},
};function(input) => string | object
If Rule.type is set to 'json' then Rules.parser.parse option may be a function that implements custom logic to parse module's source and convert it to a JavaScript object. It may be useful to import toml, yaml and other non-JSON files as JSON, without specific loaders:
webpack.config.js
import toml from "toml";
export default {
// ...
module: {
rules: [
{
test: /\.toml/,
type: "json",
parser: {
parse: toml.parse,
},
},
],
},
};An array of Rules that is also used when the Rule matches.
Match the used schema, e.g., data, http.
string | RegExp | ((value: string) => boolean) | RuleSetLogicalConditions | RuleSetCondition[]webpack.config.js
export default {
module: {
rules: [
{
scheme: "data",
type: "asset/resource",
},
],
},
};bool
Indicate what parts of the module contain side effects. See Tree Shaking for details.
Include all modules that pass test assertion. If you supply a Rule.test option, you cannot also supply a Rule.resource. See Rule.resource and Condition for details.
string
Possible values: 'javascript/auto' | 'javascript/dynamic' | 'javascript/esm' | 'json' | 'webassembly/sync' | 'webassembly/async' | 'asset' | 'asset/source' | 'asset/resource' | 'asset/inline' | 'asset/bytes' | 'css' | 'css/auto' | 'css/module' | 'css/global'
Rule.type sets the type for a matching module. This prevents defaultRules and their default importing behaviors from occurring. For example, if you want to load a .json file through a custom loader, you'd need to set the type to javascript/auto to bypass webpack's built-in json importing.
webpack.config.js
export default {
// ...
module: {
rules: [
// ...
{
test: /\.json$/,
type: "javascript/auto",
loader: "custom-json-loader",
},
],
},
};See Asset Modules guide for more about
asset*type.
See use case of css/auto module type here. Make sure to enable experiments.css to use css/auto.
export default {
target: "web",
mode: "development",
experiments: {
css: true,
},
module: {
rules: [
{
test: /\.less$/,
use: "less-loader",
type: "css/auto",
},
],
},
};[UseEntry] function(info)
Starting with webpack 5.87.0 falsy values such as undefined null can be used to conditionally disable specific use entry.
[UseEntry]
Rule.use can be an array of UseEntry which are applied to modules. Each entry specifies a loader to be used.
Passing a string (i.e. use: [ 'style-loader' ]) is a shortcut to the loader property (i.e. use: [ { loader: 'style-loader '} ]).
Loaders can be chained by passing multiple loaders, which will be applied from right to left (last to first configured).
webpack.config.js
export default {
// ...
module: {
rules: [
{
// ...
use: [
"style-loader",
{
loader: "css-loader",
options: {
importLoaders: 1,
},
},
{
loader: "less-loader",
options: {
noIeCompat: true,
},
},
],
},
],
},
};function(info)
Rule.use can also be a function which receives the object argument describing the module being loaded, and must return an array of UseEntry items.
The info object parameter has the following fields:
compiler: The current webpack compiler (can be undefined)issuer: The path to the module that is importing the module being loadedrealResource: Always the path to the module being loadedresource: The path to the module being loaded, it is usually equal to realResource except when the resource name is overwritten via !=! in request stringThe same shortcut as an array can be used for the return value (i.e. use: [ 'style-loader' ]).
webpack.config.js
export default {
// ...
module: {
rules: [
{
use: (info) => [
{
loader: "custom-svg-loader",
},
{
loader: "svgo-loader",
options: {
plugins: [
{
cleanupIDs: {
prefix: basename(info.resource),
},
},
],
},
},
],
},
],
},
};See UseEntry for details.
Resolving can be configured on module level. See all available options on resolve configuration page. All applied resolve options get deeply merged with higher level resolve.
For example, let's imagine we have an entry in ./src/index.js, ./src/footer/default.js and a ./src/footer/overridden.js to demonstrate the module level resolve.
./src/index.js
import footer from "footer";
console.log(footer);./src/footer/default.js
export default "default footer";./src/footer/overridden.js
export default "overridden footer";webpack.js.org
export default {
resolve: {
alias: {
footer: "./footer/default.js",
},
},
};When creating a bundle with this configuration, console.log(footer) will output 'default footer'. Let's set Rule.resolve for .js files, and alias footer to overridden.js.
webpack.js.org
export default {
resolve: {
alias: {
footer: "./footer/default.js",
},
},
module: {
rules: [
{
resolve: {
alias: {
footer: "./footer/overridden.js",
},
},
},
],
},
};When creating a bundle with updated configuration, console.log(footer) will output 'overridden footer'.
boolean = true
When enabled, you should provide the file extension when importing a module in .mjs files or any other .js files when their nearest parent package.json file contains a "type" field with a value of "module", otherwise webpack would fail the compiling with a Module not found error. And webpack won't resolve directories with filenames defined in the resolve.mainFiles, you have to specify the filename yourself.
webpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.m?js$/,
resolve: {
fullySpecified: false, // disable the behaviour
},
},
],
},
};A Condition that allows you to match the imports based on specific conditions provided with the with keyword, enabling different rules to be applied based on the content type.
webpack.config.js
export default {
// ...
module: {
rules: [
{
// Handles imports with the condition "with { type: 'json' }"
with: { type: "json" },
loader: import.meta.resolve("./loader-assert.js"),
},
],
},
};index.js
import one from "./pkg-1.json" with { type: "json" };In this example, Rule.with is used to apply loader-assert.js to any module imported with the condition with { type: "json" }.
Conditions can be one of these:
{ and: [Condition] }: All Conditions must match.
{ or: [Condition] }: Any Condition must match.
{ not: [Condition] }: All Conditions must NOT match.
Example:
import path from "node:path";
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export default {
// ...
module: {
rules: [
{
test: /\.css$/,
include: [
// will include any paths relative to the current directory starting with `app/styles`
// e.g. `app/styles.css`, `app/styles/styles.css`, `app/stylesheet.css`
path.resolve(__dirname, "app/styles"),
// add an extra slash to only include the content of the directory `vendor/styles/`
path.join(__dirname, "vendor/styles/"),
],
},
],
},
};object function(info)
object
It must have a loader property being a string. It is resolved relative to the configuration context with the loader resolving options (resolveLoader).
It can have an options property being a string or object. This value is passed to the loader, which should interpret it as loader options.
For compatibility a query property is also possible, which is an alias for the options property. Use the options property instead.
Note that webpack needs to generate a unique module identifier from the resource and all loaders including options. It tries to do this with a JSON.stringify of the options object. This is fine in 99.9% of cases, but may be not unique if you apply the same loaders with different options to the resource and the options have same stringified values.
It also breaks if the options object cannot be stringified (i.e. circular JSON). Because of this you can have a ident property in the options object which is used as unique identifier.
webpack.config.js
export default {
// ...
module: {
rules: [
{
loader: "css-loader",
options: {
modules: true,
},
},
],
},
};function(info)
A UseEntry can also be a function which receives the object argument describing the module being loaded, and must return a non-function UseEntry object. This can be used to vary the loader options on a per-module basis.
The info object parameter has the following fields:
compiler: The current webpack compiler (can be undefined)issuer: The path to the module that is importing the module being loadedrealResource: Always the path to the module being loadedresource: The path to the module being loaded, it is usually equal to realResource except when the resource name is overwritten via !=! in request stringwebpack.config.js
export default {
// ...
module: {
rules: [
{
test: /\.svg$/,
type: "asset",
use: (info) => ({
loader: "svgo-loader",
options: {
plugins: [
{
cleanupIDs: { prefix: basename(info.resource) },
},
],
},
}),
},
],
},
};These options describe the default settings for the context created when a dynamic dependency is encountered.
Example for an unknown dynamic dependency: require.
Example for an expr dynamic dependency: require(expr).
Example for an wrapped dynamic dependency: require('./templates/' + expr).
Here are the available options with their defaults:
webpack.config.js
export default {
// ...
module: {
exprContextCritical: true,
exprContextRecursive: true,
exprContextRegExp: false,
exprContextRequest: ".",
unknownContextCritical: true,
unknownContextRecursive: true,
unknownContextRegExp: false,
unknownContextRequest: ".",
wrappedContextCritical: false,
wrappedContextRecursive: true,
wrappedContextRegExp: /.*/,
strictExportPresence: false,
},
};A few use cases:
wrappedContextCritical: true.require(expr) should include the whole directory: exprContextRegExp: /^\.\//require('./templates/' + expr) should not include subdirectories by default: wrappedContextRecursive: falsestrictExportPresence makes missing exports an error instead of warningwrappedContextRegExp: /\\.\\*/