esbuild-loader

⚡️ Speed up your Webpack build with esbuild
授权协议 MIT License
开发语言 JavaScript
所属分类 Web应用开发、 常用JavaScript包
软件类型 开源软件
地区 不详
投 递 者 冯良才
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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)!

Curious how much faster your build will be? See what users are saying.

Support this project by ⭐️ starring and sharing 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:

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)
+         }
+       },

        ...
      ],
    },
  }

TypeScript & TSX

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'
+         }
+       },

        ...
      ]
    },
  }

Configuration

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')
      }
  }

⚠️ esbuild only supports a subset of 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.

JS Minification (eg. Terser)

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)
+       })
+     ]
+   },
  }

��‍♀️ Protip: Use the minify plugin in-place of the loader to transpile the JS

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.

CSS Minification

There are two ways to minify CSS, depending on your setup. You should already have CSS setup in your build using css-loader.

CSS assets

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()
    ]
  }

CSS in JS

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
+             }
+           }
          ]
        }
      ]
    }
  }

Examples

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.

Bring your own esbuild (Advanced)

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).

⚠️ esbuild is not stable yet and can have dramatic differences across releases. Using a different version of esbuild is not guaranteed to work.

+ 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.

⚙️ Options

Loader

The loader supports all Transform options from esbuild.

Note:

  • Source-maps are automatically configured for you via devtool. sourcemap/sourcefile options are ignored.
  • The root 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:

target

Type: string | Array<string>

Default: 'es2015'

The target environment (e.g. es2016, chrome80, esnext).

Read more about it in the esbuild docs.

loader

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.

jsxFactory

Type: string

Default: React.createElement

Customize the JSX factory function name to use.

Read more about it in the esbuild docs.

jsxFragment

Type: string

Default: React.Fragment

Customize the JSX fragment function name to use.

Read more about it in the esbuild docs.

implementation

Type: { transform: Function }

Custom esbuild-loader option.

Use it to pass in a different esbuild version.

MinifyPlugin

The loader supports all Transform options from esbuild.

target

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:

minify

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.

minifyWhitespace

Type: boolean

Minify JS by removing whitespace.

minifyIdentifiers

Type: boolean

Minify JS by shortening identifiers.

minifySyntax

Type: boolean

Minify JS using equivalent but shorter syntax.

legalComments

Type: 'none' | 'inline' | 'eof'

Default: 'inline'

Read more about it in the esbuild docs.

sourcemap

Type: boolean

Default: Webpack devtool configuration

Whether to emit sourcemaps.

css

Type: boolean

Default: false

Custom esbuild-loader option.

Whether to minify CSS files.

include

Type: string | RegExp | Array<string | RegExp>

Custom esbuild-loader option.

Filter assets to include in minification

exclude

Type: string | RegExp | Array<string | RegExp>

Custom esbuild-loader option.

Filter assets to exclude from minification

implementation

Type: { transform: Function }

Custom esbuild-loader option.

Use it to pass in a different esbuild version.

��‍♀️ FAQ

Is it possible to use esbuild plugins?

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:

  1. 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.

  2. 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.

Is it possible to use esbuild's inject option?

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.

Is it possible to use Babel plugins?

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.

Why am I not getting a 100x speed improvement as advertised?

Running esbuild as a standalone bundler vs esbuild-loader + Webpack are completely different:

  • esbuild is highly optimized, written in Go, and compiled to native code. Read more about it here.
  • esbuild-loader is handled by Webpack in a JS runtime, which applies esbuild transforms per file. On top of that, there's likely other loaders & plugins in a Webpack config that slow it down.

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.

Will there be type-checking support?

According to the esbuild FAQ, it will not be supported.

Consider these type-checking alternatives:

�� Other Webpack plugins

instant-mocha

Webpack-integrated Mocha test-runner with Webpack 5 support.

webpack-localize-assets-plugin

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

  • 【开篇】esbuild 概述 专栏中的代码均在 http://github.com/sunny-117/esbuild-book 完整版在掘金专栏地址:https://juejin.cn/column/7285233095058718756 什么是esbuild? esbuild 是一款基于 Go 语言开发的 javascript 构建打包工具,相比传统的构建工具,主打性能优势。同样规模的项目,使

  • 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 是一个有动画效果的开关指示器。

  • 我们是在 vue-loader 上做的修改,增加了建构到微信小程序 的若干能力。除此之外与原 vue-loader 文档 保持一致,所以本文档只列下修改的地方。 如果你对 vue-loader 不是很熟悉的话,强烈建议先阅读原文档一遍,下面的内容会默认你已经知道了什么是 vue-loader 和她能做什么。 开始 mpvue-loader 是 vue-loader 的一个扩展延伸版,类似于超集的关