What is esbuild-loader?
esbuild-loader is a Webpack loader that leverages the esbuild bundler to perform fast JavaScript and TypeScript transpilation and bundling. It is designed to significantly speed up the build process by using esbuild's highly optimized and parallelized architecture.
What are esbuild-loader's main functionalities?
JavaScript and TypeScript Transpilation
This feature allows you to transpile JavaScript and TypeScript files using esbuild. The code sample demonstrates how to configure esbuild-loader in a Webpack configuration to handle `.tsx` and `.ts` files, targeting ES2015 syntax.
module.exports = {
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'esbuild-loader',
options: {
loader: 'tsx', // Or 'ts' if you don't need tsx
target: 'es2015' // Syntax to compile to (see options below for possible values)
}
}
]
}
};
Minification
esbuild-loader can also be used to minify JavaScript code. The code sample shows how to use the `EsbuildPlugin` to enable minification in a Webpack configuration, targeting ES2015 syntax.
const EsbuildPlugin = require('esbuild-loader').EsbuildPlugin;
module.exports = {
optimization: {
minimize: true,
minimizer: [
new EsbuildPlugin({
target: 'es2015' // Syntax to compile to (see options below for possible values)
})
]
}
};
CSS Loading
esbuild-loader can also handle CSS files. The code sample demonstrates how to configure esbuild-loader to load and minify CSS files in a Webpack configuration.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'esbuild-loader',
options: {
loader: 'css',
minify: true
}
}
]
}
]
}
};
Other packages similar to esbuild-loader
babel-loader
babel-loader is a Webpack loader that uses Babel to transpile JavaScript and TypeScript files. While babel-loader is highly configurable and supports a wide range of plugins and presets, it is generally slower than esbuild-loader due to Babel's single-threaded architecture.
ts-loader
ts-loader is a Webpack loader specifically designed for TypeScript transpilation using the TypeScript compiler (tsc). It provides fine-grained control over TypeScript compilation but is slower compared to esbuild-loader, which uses esbuild's faster, parallelized architecture.
terser-webpack-plugin
terser-webpack-plugin is a Webpack plugin used for minifying JavaScript files using Terser. While it is highly configurable and widely used, it is generally slower than esbuild-loader's minification capabilities, which leverage esbuild's optimized performance.
esbuild-loader
Speed up your Webpack build with esbuild! 🔥
esbuild is a JavaScript bundler written in Go that supports blazing fast ESNext & TypeScript transpilation and JS minification.
esbuild-loader lets you harness the speed of esbuild in your Webpack build by offering faster alternatives for transpilation (eg. babel-loader/ts-loader) and minification (eg. Terser)!
If you like this project, please star it & follow me to see what other cool projects I'm working on! ❤️
🚀 Install
npm i -D esbuild-loader
🚦 Quick Setup
Javascript & JSX transpilation (eg. Babel)
In webpack.config.js
:
+ const { ESBuildPlugin } = require('esbuild-loader')
module.exports = {
module: {
rules: [
- {
- test: /\.js$/,
- use: 'babel-loader',
- },
+ {
+ test: /\.js$/,
+ loader: 'esbuild-loader',
+ options: {
+ loader: 'jsx', // Remove this if you're not using JSX
+ target: 'es2015' // Syntax to compile to (see options below for possible values)
+ }
+ },
...
],
},
plugins: [
+ new ESBuildPlugin()
]
}
TypeScript & TSX
In webpack.config.js
:
+ const { ESBuildPlugin } = require('esbuild-loader')
module.exports = {
module: {
rules: [
- {
- test: /\.tsx?$/,
- use: 'ts-loader'
- },
+ {
+ test: /\.tsx?$/,
+ loader: 'esbuild-loader',
+ options: {
+ loader: 'tsx', // Or 'ts' if you don't need tsx
+ target: 'es2015'
+ }
+ },
...
]
},
plugins: [
+ new ESBuildPlugin()
]
}
Configuration
If you have a tsconfig.json
file, esbuild-loader will automatically detect it. Alternatively, you can pass it in via the tsconfigRaw
option.
Note, esbuild only supports a subset of tsconfig
options (see TransformOptions
interface) and does not do type checks.
{
test: /\.tsx?$/,
loader: 'esbuild-loader',
options: {
loader: 'tsx',
target: 'es2015',
+ tsconfigRaw: require('./tsconfig.json')
}
}
Minification (eg. Terser)
You can replace JS minifiers like Terser or UglifyJs. Checkout the benchmarks to see how much faster esbuild is.
In webpack.config.js
:
+ const {
+ ESBuildPlugin,
+ ESBuildMinifyPlugin
+ } = require('esbuild-loader')
module.exports = {
...,
+ optimization: {
+ minimize: true,
+ minimizer: [
+ new ESBuildMinifyPlugin({
+ target: 'es2015' // Syntax to compile to (see options below for possible values)
+ })
+ ]
+ },
plugins: [
+ new ESBuildPlugin()
]
}
💁♀️ Protip: Use the minify plugin in-place of the loader to transpile your JS
The target
option tells esbuild that it can use newer JS syntax to perform better minification. If you're not using TypeScript or any syntax unsupported by Webpack, you can also leverage this as a transpilation step. It will be faster because there's less files to work on and will produce a smaller output because the polyfills will only be bundled once for the entire build instead of per file.
⚙️ Options
Loader
The loader supports options from esbuild.
target
String
(es2015
) - Environment target (e.g. es2016, chrome80, esnext)loader
String
(js
) - Which loader to use to handle file
- Possible values:
js
, jsx
, ts
, tsx
, json
, text
, base64
, file
, dataurl
, binary
jsxFactory
String
- What to use instead of React.createElementjsxFragment
String
- What to use instead of React.Fragment
Enable source-maps via devtool
MinifyPlugin
target
String
(esnext
) - Environment target (e.g. es2016, chrome80, esnext)minify
Boolean
(true
) - Sets all minify
flagsminifyWhitespace
Boolean
- Remove whitespaceminifyIdentifiers
Boolean
- Shorten identifiersminifySyntax
Boolean
- Use equivalent but shorter syntaxsourcemap
Boolean
(defaults to Webpack devtool
) - Whether to emit sourcemapsinclude
String|RegExp|Array<String|RegExp>
- Filter assets for inclusion in minificationexclude
String|RegExp|Array<String|RegExp>
- Filter assets for exclusion in minification
💼 License