Skip to content
导航

esbuild

不同于其他构建工具是Javascript开发的Node.js应用,esbuild 是基于Go语言开发的。

esbuild 快的原因

why-is-esbuild-fast

  • Go语言编写的,并编译成本机代码。
    • 其他工具要先通过Node.js解析工具代码以启动运行,然后才开始处理代码构建逻辑。esbuild直接开始处理代码构建逻辑。
    • Go语言有着比Node.js优秀的线程并发、更高效的垃圾回收。
  • 充分使用并行
    • 充分利用所有可用的CPU内核
    • 所有线程共享内存,在打包引入相同JavaScript库的不同入口文件时,可以轻松共享
  • 完全重写
    • 所有内容使用一致的数据结构,避免在不同工具间转换。(类似重写一切的还有bun.js项目)
    • 从性能出发,解决了编译TS时官方编译器的性能
  • 高效使用内存
    • esbuild只遍历整个JavaScript AST三次,最大程度重用AST数据。其他工具则会在多个库之间反复AST转换。
    • Go语言相比JavaScript,可以用更少的内存存储更多的数据

esbuild 打包产物

同样使用这份代码,来看看esbuild的打包产物。

js
// index.js
import { sayHello } from './mod'
sayHello()

// mod.js
export function sayHello(){
    console.log('hello')
}

esbuild执行以下命令

shell
(() => {
  // src/mod.js
  function sayHello() {
    console.log(`Hello`);
  }

  // src/index.js
  sayHello();
})();

esbuild构建产物没有模块加载器,只支持ES模块的代码分割能力,需要要借助ES模块机制来实现模块加载。

esbuild 用法上类似rollup,支持配置和使用插件,不同的是开放给插件的能力有限,且性能容易被插件拖累。
因此,官方推荐是将esbuild作为打包器使用,在模块打包前后做扩展功能。

社区生态

据我所知,有以下基于推荐用法开发的工具:

  • esbuild-loader 方便在webpack中使用,封装了esbuild的打包及压缩功能。
  • vite 使用ES模块与esbuild加速开发环境构建、模块热替换。