初识 esbuild

449 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

esbuild 是什么?

esbuild 是一个由 Evan Wallace 开发的 JavaScript 打包器。由 Go 语言编写,打包速度和其他打包器相比,具有非常明显的优势。

性能对比

对一下打包器进行性能测试,测试内容为在没有任何缓存的情况下,将 Three.js 库打包成一个文件。得出如下数据:

可以看出,esbuild 相较其他打包器,速度快 10-100 倍。性能优势十分明显。

为什么 esbuild 那么快?

用 Go 编写,将源码编译成 native code

什么是 native code?

This form of computer code is specially-written to operate on a certain processor. It is written to maximize the efficiency of a particular processor.

native code 是一种在指定处理器运行的特别编写的计算机代码。native code 可以最大化指定处理器的效率。native code 可以在指定处理器中运行的更好的原因是它使用了处理器的硬件相关协议和逻辑顺序。

esbuild 是使用 Go 语言编写的。大部分前端打包工具都是使用 JavaScript 编写的,而 esbuild 是应用 Go 语言编写的。与 JavaScript(Node.js)是一种 IO 密集型语言不同,Go 语言是一种 CPU 密集型语言。在源码编译打包这种 CPU 密集型的场景下,Go 语言具有天然的语言优势。

另外,JavaScript 作为解释型语言,JavaScript 每次执行均需要现有解释器将源码翻译成 native code,再进行执行。而 Go 语言是编译型语言,在编译阶段就已经将 源码转化为 native code,Go 每次执行,直接执行 native code 即可。因此,Go 语言的执行性能更佳。

极致的并行任务

esbuild 的算法可以充分利用可用 CPU。编译和代码生成阶段充分并行执行。因为 Go 语言的多线程特性,所有线程共享内存,可以充分利用计算机多核。

esbuild 的所有内容都是重写的

esbuild 的所有功能都是重写的,并没有使用第三方库。因为第三方库因为各种原因,并不一定会将性能作为第一优先级。另外,重写还有个好处,就是可以保证整个代码处理过程的数据结构一致性,这也就大幅降低了不同数据结构相互转换所带来的非必要性能损耗。

高效利用内存

内存访问速度对于编译打包性能有很大影响。减少内存访问次数和减少文件存储空间都会提升性能。

因为 esbuild 将编译打包过程进行了重写,链路中涉及内存访问的节点明显减少。另外,Go 语言可以通过更紧致的方式在内存中存储数据。

这都使得 esbuild 可以更加高效的利用内存,以致更好的性能表现。

参考资料