Allows you to set up exports using module.exports or export for source files.
Useful when a source file does not contain exports or when something is not exported.
For more information on compatibility issues, refer to the Shimming guide in the official documentation.
By default, the loader generates exports using ES module syntax.
Be careful: modifying existing exports (export, module.exports, or exports) or adding new exports can lead to errors.
To begin, you'll need to install exports-loader:
npm install exports-loader --save-devor
yarn add -D exports-loaderor
pnpm add -D exports-loaderThe | or %20 (space) allow to separate the syntax, name and alias of export.
The documentation and syntax examples can be read here.
%20 represents a space in a query string because spaces are not allowed in URLs.
Then add the loader to the desired import statement or require calls. For example:
import { myFunction } from "exports-loader?exports=myFunction!./file.js";
// Adds the following code to the file's source:
//
// ...
// Code
// ...
//
// export { myFunction }
myFunction("Hello world");Descriptions of string values can be found in the documentation below.
webpack.config.js
module.exports = {
module: {
rules: [
{
// You can use `regexp`
// test: /vendor\.js/$
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: "myFunction",
},
},
],
},
};Finally, run webpack using the method you normally use (e.g., via CLI or an npm script).
| Name | Type | Default | Description |
|---|---|---|---|
type | {String} | module | Format of generated exports |
exports | {String|Object|Array<String|Object>} | undefined | List of exports |
Type: String
Default: module
Format of generated exports.
Possible values - commonjs (CommonJS module syntax) and module (ES module syntax).
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "commonjs",
exports: "Foo",
},
},
],
},
};Generate output:
// ...
// Code
// ...
module.exports = { Foo };webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "module",
exports: "Foo",
},
},
],
},
};Generate output:
// ...
// Code
// ...
export { Foo };Type: String|Array
Default: undefined
List of exports.
Allows to use a string to describe an export.
The | or %20 (space) allow to separate the syntax, name and alias of export.
String syntax - [[syntax] [name] [alias]] or [[syntax]|[name]|[alias]], where:
-
[syntax](may be omitted) -- if
typeismodule- can bedefaultandnamed, - if
typeiscommonjs- can besingleandmultiple
- if
-
[name]- name of an exported value (required) -
[alias]- alias of an exported value (may be omitted)
Examples:
[Foo]- generatesexport { Foo };.[default Foo]- generatesexport default Foo;.[named Foo]- generatesexport { Foo };.[named Foo FooA]- generatesexport { Foo as FooA };.[single Foo]- generatesmodule.exports = Foo;.[multiple Foo]- generatesmodule.exports = { Foo };.[multiple Foo FooA]- generatesmodule.exports = { 'FooA': Foo };.[named [name] [name]Alias]- generates ES module named exports and exports a value equal to the filename under other name., forsingle.jsit will besingleandsingleAlias, generatesexport { single as singleAlias };.
You need to set type: "commonjs" to use single or multiple syntaxes.
Aliases can't be used together with default or single syntaxes.
ES Module Default Export
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: "default Foo",
},
},
],
},
};Generate output:
// ...
// Code
// ...
export default Foo;ES Module Named Exports
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: "named Foo FooA",
},
},
],
},
};Generate output:
// ...
// Code
// ...
export { Foo as FooA };CommonJS Single Export
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "commonjs",
exports: "single Foo",
},
},
],
},
};Generate output:
// ...
// Code
// ...
module.exports = Foo;CommonJS Multiple Exports
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "commonjs",
exports: "multiple Foo FooA",
},
},
],
},
};Generate output:
// ...
// Code
// ...
module.exports = { FooA: Foo };Allows to use an object to describe an export.
Properties:
syntax- can bedefaultornamedfor themoduletype (ES modulesmodule format), andsingleormultiplefor thecommonjstype (CommonJSmodule format) (may be omitted)name- name of an exported value (required)alias- alias of an exported value (may be omitted)
ES Module Default Export
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: {
syntax: "default",
name: "Foo",
},
},
},
],
},
};Generate output:
// ...
// Code
// ...
export default Foo;ES Module Named Exports
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: {
syntax: "named",
name: "Foo",
alias: "FooA",
},
},
},
],
},
};Generate output:
// ...
// Code
// ...
export { Foo as FooA };CommonJS Single Export
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "commonjs",
exports: {
syntax: "single",
name: "Foo",
},
},
},
],
},
};Generate output:
// ...
// Code
// ...
module.exports = Foo;CommonJS Multiple Exports
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "commonjs",
exports: {
syntax: "multiple",
name: "Foo",
alias: "FooA",
},
},
},
],
},
};Generate output:
// ...
// Code
// ...
module.exports = { FooA: Foo };Allow to specify multiple exports. Each item can be a string or an object.
Not possible to use both single and multiple syntaxes together due to CommonJS format limitations.
Not possible to use multiple default values due to ES module format limitations.
Not possible to use multiple single values due to CommonJS format limitations.
CommonJS Multiple Exports
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
type: "commonjs",
exports: ["Foo", "multiple Bar", "multiple Baz BazA"],
},
},
],
},
};Generate output:
// ...
// Code
// ...
module.exports = { Bar, BazA: Bar, Foo };ES Module Default Export And Named Exports Together
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: ["default Foo", "named Bar BarA"],
},
},
],
},
};Generate output:
// ...
// Code
// ...
export default Foo;
export { Bar as BarA };Named Exports
webpack.config.js
module.exports = {
module: {
rules: [
{
test: require.resolve("./path/to/vendor.js"),
loader: "exports-loader",
options: {
exports: [
{ syntax: "named", name: "Foo", alias: "FooA" },
{ syntax: "named", name: "Bar" },
"Baz",
],
},
},
],
},
};Generate output:
// ...
// Code
// ...
export { Foo as FooA, Bar, Baz };