FAQ

本文是 esbuild 常见问题的集合。 你也可以在 GitHub issue 上提问

为何 esbuild 如此之快?

若干原因:

这些因素中每一点都只是有显著的提速, 但综合起来, 它们可以使得构建工具的速度比目前其他常用的构建工具快好几个数量级。

Benchmark 详情

以下是每个 benchmark 的详细信息:

JavaScript benchmark
esbuild
0.33s
parcel 2
32.48s
rollup + terser
34.95s
webpack 5
41.53s
0s
10s
20s
30s
40s

此 benchmark 通过复制 three.js 库 10 次, 来模拟构建一个大型 JavaScript 代码库的情况, 并从 0 开始构建了一个单一 bundle,且未使用任何缓存。 你可以在 esbuild 仓库中运行此 benchmark, 使用 make bench-three

Bundler Time Relative slowdown Absolute speed Output size
esbuild 0.33s 1x 1658.9 kloc/s 5.80mb
parcel 2 32.48s 98x 16.9 kloc/s 5.87mb
rollup + terser 34.95s 106x 15.7 kloc/s 5.81mb
webpack 5 41.53s 126x 13.2 kloc/s 5.84mb

每次报告的数据均为三次中最好的一次。 我通过 --bundle --minify --sourcemap 来运行 esbuild (单线程时则使用 GOMAXPROCS=1)。 在运行 Rollup 时,我使用了 rollup-plugin-terser 的 plugin, 因为 Rollup 本身并不支持压缩。而在运行 webpack 时,则使用了 --mode=production --devtool=sourcemap 的选项。 Parcel 则相对简单,使用默认选项即可。数据中的绝对速度是基于包括注释和空白行在内的总行数计算的, 目前为 547,441 行。 测试环境为一台 6 核,16gb 内存,macOS Spotlight 禁用的 2019 款 MacBook Pro。

TypeScript benchmark
esbuild
0.10s
parcel 2
8.73s
webpack 5
18.89s
0s
5s
10s
15s
20s

此 benchmark 则选用 Rome, 来模拟构建一个大型的 TypeScript 代码库。 所有代码必须合并成一个带有 source map, 且被压缩过的 bundle,并且此 bundle 必须正常运行。 你可以在 esbuild 仓库中运行此 benchmark,使用 make bench-rome

Bundler Time Relative slowdown Absolute speed Output size
esbuild 0.10s 1x 1318.4 kloc/s 0.97mb
parcel 2 8.73s 87x 15.1 kloc/s 0.97mb
webpack 5 18.89s 189x 7.0 kloc/s 1.27mb

每次报告的数据均为三次中最好的一次。 我通过 --bundle --minify --sourcemap --platform=node 来运行 esbuild(单线程时则使用 GOMAXPROCS=1)。在运行 webpack 时,则使用了 ts-loader,并设置 transpileOnly: true 以及其他配置项 --mode=production --devtool=sourcemap。在运行 Parcel 1 时,使用了 --target node --bundle-node-modules 选项。 运行 Parcel 2 时,在 package.json 中设置了 "engines": "node",同时还需要使用 @parcel/transformer-typescript-tsc 转换器来处理 benchmark 中使用的 TypeScript 代码。 数据中的绝对速度是基于包括注释和空白行在内的总行数计算的, 目前为 131,836 行。测试环境为一台 6 核,16gb 内存的 2019 款 MacBook Pro。

此结果集并未包含 Rollup,因为我没办法让其正常工作。 我尝试了 rollup-plugin-typescript@rollup/plugin-typescript,以及 @rollup/plugin-sucrase, 但他们都因为与 TypeScript 编译相关的原因而无法正常工作。

即将发布的路线图

这些特性已在进行中,处于第一优先级:

下面这些是未来可能会开发的特性,但也可能不会, 亦或是会进行开发,但开发的程度有限:

在这之后,我认为 esbuild 已相对完善。 我计划让 esbuild 达到一个基本稳定的状态, 然后停止增加更多的特性。 这将拒绝对 esbuild 本身增加主要特性的请求。 我不认为 esbuild 应该成为满足一切前端需求的一体化解决方案。 特别是,我希望避免 ”webpack config“ 模式的麻烦和问题, 因为该模式的底层过于灵活, 其易用性会受到影响。

例如,我并不打算在 esbuild 中加入如下特性:

我希望我添加到 esbuild 中的扩展点(pluginsAPI) 能让 esbuild 成为更多定制化构建工作流的一部分, 但我并未期望这些扩展点能覆盖所有的用例。 如果你有非常强烈的自定义需求,那么你应使用其他工具。 我也希望 esbuild 能激励其他的构建工具, 通过彻底改变他们的底层实现来大幅提高他们的性能 让每个人都能受益, 而不仅仅是那些使用 esbuild 的人。

我计划在 esbuild 达到稳定后, 继续维持其现有范围内的一切特性。 这意味着将继续实现对后续新增的 JavaScript 语法和 TypeScript 语法特性的支持。

投入生产环境的准备情况

此项目尚未达到 1.0.0 版本,仍处于积极开发阶段。 就目前而言,它已早已达到 alpha 阶段,并且非常稳定。 我认为这是一个后期测试版本。 对于早期的参与者来说,它足以用于生产环境。 当然还有一些开发者认为 esbuild 还未准备好。 本章节并不试图改变你的观点, 只是试图给你足够多的信息, 让你自行决定是否使用 esbuild 作为你的构建工具。

一些其他信息: