esbuild
不同于其他构建工具是Javascript开发的Node.js应用,esbuild 是基于Go语言开发的。
esbuild 快的原因
- 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加速开发环境构建、模块热替换。