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)!
Curious how much faster your build will be? See what users are saying.
Support this project by
npm i -D esbuild-loader
In webpack.config.js
:
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)
+ }
+ },
...
],
},
}
In webpack.config.js
:
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'
+ }
+ },
...
]
},
}
If you have a tsconfig.json
file, esbuild-loader will automatically detect it.
Alternatively, you can also pass it in directly via the tsconfigRaw
option:
{
test: /\.tsx?$/,
loader: 'esbuild-loader',
options: {
loader: 'tsx',
target: 'es2015',
+ tsconfigRaw: require('./tsconfig.json')
}
}
tsconfig
options (see TransformOptions
interface) and does not do type-checks. It's recommended to use a type-aware IDE or tsc --noEmit
for type-checking instead. It is also recommended to enable isolatedModules
and esModuleInterop
options in your tsconfig
by the esbuild docs.
You can replace JS minifiers like Terser or UglifyJs. Checkout the benchmarks to see how much faster esbuild is. The target
option tells esbuild that it can use newer JS syntax to perform better minification.
In webpack.config.js
:
+ const { ESBuildMinifyPlugin } = require('esbuild-loader')
module.exports = {
...,
+ optimization: {
+ minimizer: [
+ new ESBuildMinifyPlugin({
+ target: 'es2015' // Syntax to compile to (see options below for possible values)
+ })
+ ]
+ },
}
If you're not using TypeScript, JSX, or any syntax unsupported by Webpack, you can also leverage the minifier for transpilation (as an alternative to Babel). 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. Simply set the target
option on the minifier to specify which support level you want.
There are two ways to minify CSS, depending on your setup. You should already have CSS setup in your build using css-loader
.
If your CSS is extracted and emitted as a CSS file, you can replace CSS minification plugins like css-minimizer-webpack-plugin
or optimize-css-assets-webpack-plugin
with the same ESBuildMinifyPlugin
by enabling the css
option.
Assuming the CSS is extracted using something like MiniCssExtractPlugin, in webpack.config.js
:
const { ESBuildMinifyPlugin } = require('esbuild-loader')
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
...,
optimization: {
minimizer: [
new ESBuildMinifyPlugin({
target: 'es2015',
+ css: true // Apply minification to CSS assets
})
]
},
module: {
rules: [
{
test: /\.css$/i,
use: [
MiniCssExtractPlugin.loader,
'css-loader'
]
}
]
},
plugins: [
new MiniCssExtractPlugin()
]
}
If your CSS is not emitted as a CSS file, but rather loaded via JS using something like style-loader
, you can use the loader for minification.
In webpack.config.js
:
module.exports = {
...,
module: {
rules: [
{
test: /\.css$/i,
use: [
'style-loader',
'css-loader',
+ {
+ loader: 'esbuild-loader',
+ options: {
+ loader: 'css',
+ minify: true
+ }
+ }
]
}
]
}
}
If you'd like to see working Webpack builds that use esbuild-loader for basic JS, React, TypeScript, or Next.js, check out the examples repo.
esbuild-loader comes with a version of esbuild it has been tested to work with. However, esbuild has a frequent release cadence, and while we try to keep up with the important releases, it can easily go out of date.
Use the implementation
option in the loader or the minify plugin to pass in your own version of esbuild (eg. a newer one).
+ const esbuild = require('esbuild')
...
module.exports = {
...,
module: {
rules: [
{
test: ...,
loader: 'esbuild-loader',
options: {
...,
+ implementation: esbuild
}
}
]
}
}
The implementation
option will be removed once esbuild reaches a stable release. Instead esbuild will become a peerDependency so you always provide your own.
The loader supports all Transform options from esbuild.
Note:
devtool
. sourcemap
/sourcefile
options are ignored.tsconfig.json
is automatically detected for you. You don't need to pass in tsconfigRaw
unless it's in a different path.Here are some common configurations and custom options:
Type: string | Array<string>
Default: 'es2015'
The target environment (e.g. es2016
, chrome80
, esnext
).
Read more about it in the esbuild docs.
Type: 'js' | 'jsx' | 'ts' | 'tsx' | 'css' | 'json' | 'text' | 'base64' | 'file' | 'dataurl' | 'binary' | 'default'
Default: 'js'
The loader to use to handle the file. See the type for possible values.
Read more about it in the esbuild docs.
Type: string
Default: React.createElement
Customize the JSX factory function name to use.
Read more about it in the esbuild docs.
Type: string
Default: React.Fragment
Customize the JSX fragment function name to use.
Read more about it in the esbuild docs.
Type: { transform: Function }
Custom esbuild-loader option.
Use it to pass in a different esbuild version.
The loader supports all Transform options from esbuild.
Type: string | Array<string>
Default: 'esnext'
Target environment (e.g. 'es2016'
, ['chrome80', 'esnext']
)
Read more about it in the esbuild docs.
Here are some common configurations and custom options:
Type: boolean
Default: true
Enable JS minification. Enables all minify*
flags below.
To have nuanced control over minification, disable this and enable the specific minification you want below.
Read more about it in the esbuild docs.
Type: boolean
Minify JS by removing whitespace.
Type: boolean
Minify JS by shortening identifiers.
Type: boolean
Minify JS using equivalent but shorter syntax.
Type: 'none' | 'inline' | 'eof'
Default: 'inline'
Read more about it in the esbuild docs.
Type: boolean
Default: Webpack devtool
configuration
Whether to emit sourcemaps.
Type: boolean
Default: false
Custom esbuild-loader option.
Whether to minify CSS files.
Type: string | RegExp | Array<string | RegExp>
Custom esbuild-loader option.
Filter assets to include in minification
Type: string | RegExp | Array<string | RegExp>
Custom esbuild-loader option.
Filter assets to exclude from minification
Type: { transform: Function }
Custom esbuild-loader option.
Use it to pass in a different esbuild version.
No. esbuild plugins are only available in the build API. And esbuild-loader uses the transform API instead of the build API for two reasons:
The build API is for creating JS bundles, which is what Webpack does. If you want to use esbuild's build API, consider using esbuild directly instead of Webpack.
The build API reads directly from the file-system, but Webpack loaders operate in-memory. Webpack loaders are essentially just functions that are called with the source-code as the input. Not reading from the file-system allows loaders to be chainable. For example, using vue-loader
to compile Single File Components (.vue
files), then using esbuild-loader
to transpile just the JS part of the SFC.
No. The inject
option is only available in the build API. And esbuild-loader uses the transform API.
However, you can use the Webpack equivalent ProvidePlugin instead.
If you're using React, check out this example on how to auto-import React in your components.
No. If you really need them, consider porting them over to a Webpack loader.
And please don't chain babel-loader
and esbuild-loader
. The speed gains come from replacing babel-loader
.
Running esbuild as a standalone bundler vs esbuild-loader + Webpack are completely different:
Using any JS bundler introduces a bottleneck that makes reaching those speeds impossible. However, esbuild-loader can still speed up your build by removing the bottlenecks created by babel-loader
, ts-loader
, Terser, etc.
According to the esbuild FAQ, it will not be supported.
Consider these type-checking alternatives:
tsc --noEmit
to type checkfork-ts-checker-webpack-plugin
Webpack-integrated Mocha test-runner with Webpack 5 support.
Localize/i18nalize your Webpack build. Optimized for multiple locales!
错误 Uncaught Error: Module build failed (from ./node_modules/esbuild-loader/dist/index.cjs): Error: Transform failed with 1 error: error: Do not know how to load path: D:\custom-loader\vue\comp.vue 解决
eslint-loader无法检查vue-loader编译的js部分的代码 在使用webpack+vue开发时,一般使用vue-loader对.vue文件进行处理。 // webpack.config.js // ... const VueLoaderPlugin = require('vue-loader/lib/plugin') module.export = { //... module
webpack 配置 style-loader时出现错误,Module build failed (from …/node_modules/style-loader/dist/cjs.js):TypeError: this.getOptions is not a function at Object.loader 1.确保loader配置中的顺序,loader的执行顺序是从右到左,从下到上的,这里
前言 直入正题,自从 umi mfsu 和 vite unbundle 打响 FE 高效开发第一枪,淘系 rax 新增 swc 功能、swc 作者加入 vercel 麾下,nextjs 新版本默认 swc 打包,再到阿里 ice2 新增 swc + esbuild 链路支持,swc 和 esbuild 逐渐入侵 FE 主工具流,暗示了一统天下的预兆。 Rust 和 Go 将成为未来 JavaScr
报了以下错误:Module build failed (from ./node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js) Module build failed (from ./node_modules/@dcloudio/webpack-uni-mp-loader/lib/script.js): 改正前: import {Com
依赖 webpack@5.74.0 @swc/core@1.3.17 (1.3.14版本有问题) esbuild@0.15.14 swc-loader@0.2.3 esbuild-loader@2.20.0 方案 webpack 打包过程中影响构建时间的主要为babel,和代码压缩。因此针对这两方面进行方案替代。 swc 替代babel做代码polyfill。 由于swc只能压缩js,因此使用es
https://blog.csdn.net/qq_24058693/article/details/80056557 在项目下加载 cnpm install sass-loader -D cnpm install node-sass -D
problem pro ant desgin项目 npm run start 报错:Error spawn esbuild.exe ENOENT solution 在 项目根目录下运行 node .\node_modules\esbuild-loader\esbuild\install.js 即可生成 缺失的.exe文件 node .\node_modules\esbuild-loader\esb
基础使用 安装 npm install esbuild -S -D 确认安装成功 .\node_modules\.bin\esbuild --version 初体验 使用 react 作为示例 cnpm install react react-dom -D -S 在目录下新建文件 app.jsx import * as React from 'react' import * as Serve
esbuild 非常快速的 web 打包器,使用 go 语言编写。 特点: 无需缓存也能很快速的编译打包。 内置 js、css、ts、jsx 类型文件编译。 支持 es6 和 commonjs 模块。 可以编译打包成 esm 模块和 common JS 模块 tree shaking 摇树优化、优化资源大小、source-map 代码映射 启动本地服务,在监听模式下文件发生变化重新编译。 es
vue-cli脚手架build目录下vue-loader.conf.js 文件 // vue-loader的配置,用在webpack.base.conf.js中; const utils = require('./utils') const config = require('../config') //不同环境为isProduction 赋值: 生产环境为true,开发环境为false con
esbuild 是 Go 编写的 JavaScript 打包和压缩工具,支持 TypeScript。 根据项目介绍中的 Benchmark 测试结果,在使用同一份代码 (three.js) 的情况下,esbuild 比其他打包工具(rollup / webpack / parcel 等)快了至少 100 倍。Vue.js 作者尤雨溪的新工具 Vite 也是基于 esbuild 转换库来添加对 Ty
Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。 Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为参数,返回转换的结果。这样,我们就可以通过 require 来加载任何类型的模块或文件,比如 CoffeeScript、 JSX、 LESS 或图片。 先来看看 loader 有哪些特性? Loade
功能 资源加载器。由于兼容性问题,目前只支持图片:jpg,gif,png等图片格式 author leeenx version 1.0.0 data: 2015-12-07 Official Usage $.loader( { source:[], onchange:function(percent){ console.log(percent); },
Loader 是一个有动画效果的开关指示器。
【开篇】esbuild 概述 专栏中的代码均在 http://github.com/sunny-117/esbuild-book 完整版在掘金专栏地址:https://juejin.cn/column/7285233095058718756 什么是esbuild? esbuild 是一款基于 Go 语言开发的 javascript 构建打包工具,相比传统的构建工具,主打性能优势。同样规模的项目,使
我们是在 vue-loader 上做的修改,增加了建构到微信小程序 的若干能力。除此之外与原 vue-loader 文档 保持一致,所以本文档只列下修改的地方。 如果你对 vue-loader 不是很熟悉的话,强烈建议先阅读原文档一遍,下面的内容会默认你已经知道了什么是 vue-loader 和她能做什么。 开始 mpvue-loader 是 vue-loader 的一个扩展延伸版,类似于超集的关