webpack + esbuild-loader 提升构建速度

1,354 阅读1分钟

esbuild 是基于 Golang 开发的一款打包工具,其主要目的是为了提升构建速度,相比传统打包工具速度可快 10 ~ 100 倍。

esbuild-loader 是一个构建在 esbuild 上的 webpack loader,且可以替代 babel-loaderts-loader 来提高构建速度。

安装

pnpm i -D esbuild-loader

配置

替换 ts-loaderbabel-loader

babel-loader 配置:

{
  test: /\.tsx?$/,
  use: [{loader: 'babel-loader'}, {loader: 'ts-loader'}],
  exclude: [/node_modules/],
},
{
  test: /\.jsx?$/,
  loader: 'babel-loader',
  options: {
    cacheDirectory: true,
  },
  exclude: [/node_modules/],
},

esbuild-loader 配置:

{
  test: /\.jsx?$/,
  loader: 'esbuild-loader',
  options: {
    loader: 'jsx',
    target: 'es2018',
    jsx: 'automatic',
    tsconfigRaw: {},
    // implementation: esbuild, // 自定义 esbuild 版本
  },
  exclude: [/node_modules/],
},

替换 TerserPluginCssMinimizerPlugin

TerserPluginCssMinimizerPlugin 配置:

new TerserPlugin({
  parallel: true,
  extractComments: false,
  terserOptions: {
    ecma: 5,
    compress: {
      drop_console: true,
    },
    format: {
      comments: false,
    },
    parse: {},
    mangle: true,
    module: false,
  },
}),
new CssMinimizerPlugin({
  parallel: true,
  minimizerOptions: {
    preset: [
      'default',
      {
        discardComments: {removeAll: true},
      },
    ],
  },
}),

esbuild-loader 配置:

new ESBuildMinifyPlugin({
  target: 'es2018',
  css: true, // 缩小CSS
  minify: true, // 缩小JS
  minifyWhitespace: true, // 去掉空格
  minifyIdentifiers: true, // 缩短标识符
  minifySyntax: true, // 缩短语法
  legalComments: 'none', // 去掉注释
  // implementation: esbuild, // 自定义 esbuild 版本
}),

使用

huxy-admin 项目为例,测试一下速度提升了多少。

babel-loader 开发环境构建时间:1654 ms

babel-dev.png babel-loader 生产环境打包时间:3880 ms

babel-prod.png

esbuild-loader 开发环境构建时间:1057 ms

esbuild-dev.png

esbuild-loader 生产环境打包时间:2977 ms

esbuild-prod.png

babel-loader 打包资源大小:1.7 MB

esbuild-loader 打包资源大小:1.6 MB

构建速度有所提升,打包资源大小变化不大。如果是大型项目,效果可能更明显。