esbuild logo

esbuild

使用 Go 编写的极速 JavaScript/TypeScript 打包器和转译器,构建速度比 Webpack 快 10-100 倍,是 Vite 开发模式的核心引擎。

精选工具编译转译Go高性能打包器

esbuild 由 Evan Wallace 使用 Go 语言从零构建,通过高度并行化和精心优化的内存管理,实现比 Webpack 快约 36 倍的构建速度。是 Vite 开发模式、Angular 17+ 的默认打包工具。

esbuild — 高性能转译和压缩工具

使用 Go 编写的极速 JavaScript/TypeScript 打包器和转译器,构建速度比 Webpack 快 10-100 倍,是 Vite 开发模式的核心引擎。

技术简介说明

esbuild 是由 Evan Wallace(Figma 联合创始人)使用 Go 语言从零构建的 JavaScript/TypeScript 打包器和转译器。它的设计目标是极致的构建速度——通过 Go 的编译型语言优势、高度并行化的处理架构和精心优化的内存管理,esbuild 实现了比 Webpack + Terser 组合快约 36 倍的构建速度,成为前端构建工具领域速度革命的核心推动者。

esbuild 的架构设计遵循"从零实现"原则——解析器、打包器、压缩器全部自行编写,不依赖任何第三方库。它利用 Go 的 goroutine 实现完全并行化的文件处理,通过仅 3 次交织 AST 遍历最大化 CPU 缓存利用率,并将所有模块打包为单个原生二进制文件分发,消除了 Node.js 的启动开销。

2025-2026 年,esbuild 持续快速迭代到 v0.28.x。它是 Vite(开发模式)、Angular 17+、Ruby on Rails 7+ 的默认打包工具,npm 周下载量超过 2.37 亿。然而,esbuild 面临两大挑战:一是 Rolldown(Rust 编写,Vite 团队开发)在 2026 年发布 1.0 并开始替代 esbuild 在 Vite 8 中的角色;二是单人维护模式(BDFL)带来的长期可持续性风险。

基本信息

项目详情
官网https://esbuild.github.io
GitHubhttps://github.com/evanw/esbuild
LicenseMIT
最新版本v0.28.1(2026 年 6 月 11 日)
主要维护者Evan Wallace(唯一维护者,BDFL 模式)
背景Figma 联合创始人 & 前 CTO,2021 年底离开 Figma
GitHub Stars~40,000
npm 周下载量~2.37 亿
Open Issues~566

快速上手

安装

# 安装为项目依赖
npm install --save-dev esbuild
 
# 或全局安装
npm install -g esbuild

基础配置

esbuild 支持 CLI 和 JavaScript API 两种使用方式:

CLI 方式

# 转译单个文件(不做打包)
esbuild src/index.ts --outfile=dist/index.js
 
# 打包 + 转译 + 压缩
esbuild src/index.ts --bundle --outfile=dist/index.js --minify
 
# 指定目标环境
esbuild src/index.ts --bundle --outfile=dist/index.js --target=es2022

JavaScript API 方式

import * as esbuild from 'esbuild';
 
await esbuild.build({
  entryPoints: ['src/index.ts'],
  bundle: true,
  outfile: 'dist/index.js',
  minify: true,
  target: ['es2022'],
  sourcemap: true,
  format: 'esm',
});

最小示例

# 最快的使用方式——直接转译 TypeScript
esbuild src/main.tsx --bundle --outfile=dist/main.js --loader:.tsx=tsx
 
# 启动开发服务器(esbuild 内置 serve)
esbuild src/main.tsx --bundle --outfile=dist/main.js --serve=8080 --servedir=public

核心概念与架构

Go 原生架构

特点详情
Go 编写编译为原生机器码,无 JIT 和 GC 开销
高度并行利用 Go goroutine 和共享内存,解析和代码生成完全并行化
从零实现解析器、打包器、压缩器全部从零编写,不依赖第三方库
内存高效仅 3 次交织 AST 遍历,最大化 CPU 缓存利用率
零依赖核心代码无外部依赖
单二进制分发平台特定的原生二进制,消除 Node.js 启动开销

处理流程

源代码
   │
   ▼
┌─────────────────────────────────────────────────────┐
│  并行解析(每个文件一个 goroutine)                    │
│  ├── 词法分析(Scanner)                              │
│  └── 语法分析(Parser)→ AST                          │
├─────────────────────────────────────────────────────┤
│  模块解析(并行解析 import/require)                   │
├─────────────────────────────────────────────────────┤
│  依赖图构建 + Tree Shaking                            │
├─────────────────────────────────────────────────────┤
│  代码生成 + 压缩(并行)                              │
│  ├── 作用域分析                                       │
│  ├── 常量折叠                                         │
│  ├── 死代码消除(DCE)                                 │
│  └── 变量名混淆                                       │
├─────────────────────────────────────────────────────┤
│  输出(ESM / CJS / IIFE)                             │
└─────────────────────────────────────────────────────┘

核心设计哲学

  1. 速度至上:所有设计决策优先考虑性能
  2. 简单性:不提供复杂的插件系统,保持核心简洁
  3. 正确性优先于功能:不做不成熟的功能,宁可少做也不做错
  4. 不做类型检查:故意不实现 TypeScript 类型检查,认为应由 tsc 负责

核心特性

  • 极致构建速度:比 Webpack + Terser 快约 36 倍,比 Parcel 快约 337 倍
  • JavaScript/TypeScript/JSX 转译:完整的语法转换支持
  • 模块打包:ESM、CJS、IIFE 多种输出格式
  • Tree Shaking:基于 ES Module 静态分析的 dead code elimination
  • 代码压缩:内置压缩器(变量名混淆、死代码消除、常量折叠)
  • Source Map:完整的 source map 支持(包括外部和 inline)
  • CSS 支持:原生 CSS 打包和压缩(支持 @import、变量等)
  • 代码分割:基于动态 import() 的代码分割(持续改进中)
  • Import Attributes:支持 with { type: 'text' } 等 TC39 Stage 3 提案(v0.28+)
  • 零配置启动:内置 --serve 开发服务器
  • 多格式输出:ESM、CJS、IIFE 按需选择
  • Path Namespaces:v0.25+ 支持路径命名空间(v0.25.0)

生态图

esbuild 生态系统

┌──────────────────────────────────────────────────────────────┐
│                     esbuild 生态系统                          │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│  核心                                                         │
│  ├── esbuild            — 编译器/打包器核心                   │
│  └── esbuild-wasm       — Wasm 构建(浏览器/非 Node 环境)    │
│                                                              │
│  构建工具集成                                                  │
│  ├── Vite (dev)         — 开发模式使用 esbuild                │
│  ├── esbuild-loader     — Webpack 中使用 esbuild              │
│  ├── rollup-plugin-esbuild — Rollup 中使用 esbuild           │
│  └── esbuild-register   — Node.js 直接运行 TS/JSX            │
│                                                              │
│  插件生态                                                     │
│  ├── esbuild-plugin-vue3    — Vue 3 SFC 支持                 │
│  ├── esbuild-plugin-dts     — TypeScript 声明生成             │
│  ├── esbuild-plugin-copy    — 静态文件复制                    │
│  ├── esbuild-plugin-define  — 全局标识符替换                  │
│  ├── esbuild-plugin-sass    — Sass/SCSS 支持                 │
│  └── @chialab/esbuild-plugin-html — HTML 入口支持           │
│                                                              │
│  框架采用                                                     │
│  ├── Vite (开发模式)  — 最流行的 esbuild 消费者               │
│  ├── Angular 17+      — 默认打包工具                          │
│  ├── Ruby on Rails 7+ — 默认打包工具(通过 jsbundling-rails) │
│  ├── Remix            — 使用 esbuild 构建                     │
│  ├── Turborepo        — 使用 esbuild 加速                     │
│  └── Netlify Functions — 使用 esbuild 构建                    │
│                                                              │
│  开发辅助                                                     │
│  ├── esbuild-sitemap    — 自动生成 sitemap                   │
│  ├── esbuild-stylelint  — 样式检查                           │
│  └── ts-plugin          — TypeScript 插件集成                │
│                                                              │
└──────────────────────────────────────────────────────────────┘

关键依赖关系

  • Vite 是 esbuild 最大的消费者(开发模式),但 Vite 8 已开始使用 Rolldown 替代 esbuild
  • Angular 17+ 使用 esbuild 作为默认打包器
  • Ruby on Rails 7+ 通过 jsbundling-rails 使用 esbuild

适用场景

  • 开发模式极速构建:Vite 开发模式使用 esbuild 实现毫秒级 HMR
  • 快速原型开发:零配置即可启动开发和构建
  • TypeScript/JSX 快速转译:无需配置 Babel 或 tsc
  • 小型到中型项目打包:对于不需要复杂配置的项目,esbuild 是最快的选择
  • CI/CD 加速:利用 esbuild 的速度优势缩短 CI 构建时间
  • SSR/SSG 构建:Next.js 风格的 SSR/SSG 场景可使用 esbuild 加速
  • CSS 打包:原生 CSS 打包和压缩能力

开发与工程化

JavaScript API 高级用法

import * as esbuild from 'esbuild';
 
// 使用 Plugin API 扩展功能
const myPlugin = {
  name: 'my-plugin',
  setup(build) {
    // 拦截模块解析
    build.onResolve({ filter: /^virtual:/ }, args => ({
      path: args.path,
      namespace: 'virtual'
    }));
 
    // 提供虚拟模块内容
    build.onLoad({ filter: /.*/, namespace: 'virtual' }, () => ({
      contents: 'export default "virtual module"',
      loader: 'js'
    }));
  }
};
 
await esbuild.build({
  entryPoints: ['src/index.ts'],
  bundle: true,
  outfile: 'dist/index.js',
  plugins: [myPlugin],
  // 代码分割
  splitting: true,
  format: 'esm',
  // 外部依赖(不打包)
  external: ['react', 'react-dom'],
  // 定义全局常量
  define: {
    'process.env.NODE_ENV': '"production"'
  }
});

开发服务器配置

import * as esbuild from 'esbuild';
 
const ctx = await esbuild.context({
  entryPoints: ['src/index.tsx'],
  bundle: true,
  outfile: 'dist/index.js',
  jsx: 'automatic',
  sourcemap: true,
});
 
// 启动 watch 模式
await ctx.watch();
 
// 或启动开发服务器
const { host, port } = await ctx.serve({
  servedir: 'public',
  port: 3000,
});

CI/CD 集成

# 使用 esbuild 构建
- name: Build with esbuild
  run: npx esbuild src/index.ts --bundle --outfile=dist/index.js --minify
 
# Metafile 分析
- name: Build with Metafile
  run: npx esbuild src/index.ts --bundle --outfile=dist/index.js --metafile=meta.json
 
# 分析产物大小
- name: Analyze Bundle
  run: npx esbuild-visualizer --metadata meta.json

性能与安全

性能数据

工具构建时间相对 esbuild
esbuild1.25s1x(基线)
Rollup + Terser36.06s~29x 慢
Webpack 544.74s~36x 慢
Parcel~337x 慢

综合评估(2026 年)

维度赢家
原始构建速度esbuild — 持续最快
包体积优化(tree-shaking)Rollup — 最小产物
生态/插件成熟度Webpack — 最久经沙场
开发体验(HMR)esbuild / Vite — 10-20ms vs Webpack 500ms+

性能优化建议

  1. 使用 bundle 模式:esbuild 的打包模式比单文件转译更充分利用并行化
  2. 利用缓存--incremental 选项(API)支持增量构建
  3. 减少插件:每个 JS 插件都涉及 Go ↔ JS 的跨语言调用开销
  4. 选择合适的 target:较高的 target 减少不必要的语法转换
  5. 使用 Metafile 分析:通过 --metafile 识别打包瓶颈

安全注意事项

  • 2026 年 6 月安全公告(v0.28.1):修复 Windows 目录穿越漏洞(GHSA-gv7w-rqvm-qjhr)
  • 2025 年初安全修复(v0.25.0):SSRF 安全修复
  • Deno 安装脚本:v0.28.1 增加完整性校验
  • 建议:保持更新到最新版本,特别是安全补丁版本

技术对比

与同类工具的详细对比

维度esbuildSWCBabelRolldownOXC
实现语言GoRustJavaScriptRustRust
定位转译 + 打包器编译器编译器打包器工具链
构建速度最快
TypeScript✅ 剥离类型✅ 剥离类型✅ 剥离类型✅ 剥离类型✅ 剥离类型
类型检查❌ 故意不做
JSX
打包能力✅ 完整✅ 完整✅(Rolldown)
CSS 支持✅ 原生⚠️ 有限
插件系统⚠️ 有限(JS)✅ Wasm✅ 最丰富✅ 兼容 Rollup发展中
代码分割✅(改进中)
HMR❌ 不支持
npm 周下载量~2.37 亿~3950 万~6.5 亿增长中~1000 万
维护模式单人 BDFL团队 + 赞助3 人 + 机构赞助VoidZero/CloudflareVoidZero/Cloudflare
版本状态仍 0.xv1.15+v8.0+v1.0+各组件独立版本

与 Rolldown 的竞争

维度esbuildRolldown
语言GoRust
Vite 集成Vite 开发模式(被替代中)Vite 8 默认(2026.03)
打包能力
Rollup 兼容✅ 100% Rollup API 兼容
插件生态有限兼容整个 Rollup 插件生态
成熟度成熟(仍 0.x)2026 年 5 月发布 1.0
HMR
代码分割改进中成熟

何时选择 esbuild

  • 追求极致的原始构建速度
  • 小型到中型项目,不需要复杂插件
  • 作为 Vite 开发模式的一部分(自动使用)
  • 需要零配置快速启动

何时考虑替代方案

  • 需要完整的 Rollup 插件兼容 → Rolldown
  • 需要成熟的打包器插件生态 → Webpack
  • 需要类型检查 → 配合 tsc
  • 大型生产项目 → Rolldown 或 Webpack

最佳实践

生产环境配置

import * as esbuild from 'esbuild';
 
await esbuild.build({
  entryPoints: ['src/index.tsx'],
  bundle: true,
  outfile: 'dist/index.js',
  minify: true,
  target: ['es2022'],
  sourcemap: true,
  format: 'esm',
  splitting: true,           // 代码分割
  metafile: true,            // 产物分析
  external: ['react', 'react-dom'],  // 外部依赖
  define: {
    'process.env.NODE_ENV': '"production"',
    '__DEV__': 'false'
  },
  logLevel: 'info',
  // 压缩选项细化
  minifyWhitespace: true,
  minifyIdentifiers: true,
  minifySyntax: true,
});

常见陷阱

  1. 不做类型检查:esbuild 故意不实现 TypeScript 类型检查——必须独立运行 tsc --noEmit
  2. 插件限制:无 CLI 插件支持(必须通过 JS API)、无自定义 AST 操作、无 HMR
  3. 0.x 版本号:每个 minor 版本可能包含 breaking changes
  4. 代码分割:esbuild 的代码分割功能仍在改进中,不如 Rollup/Webpack 成熟
  5. emit 装饰器:esbuild 对 Decorator 的支持与 Babel/SWC 有差异
  6. 单维护者风险:所有代码几乎由 Evan Wallace 一人编写

esbuild 的 1.0 计划

Evan Wallace 的公开声明:

"我计划让 esbuild 达到一个基本稳定的状态,然后停止累积更多功能。"

  • 代码分割改进是下一个大规模开发重点
  • 完成后进入"基本稳定"状态
  • 1.0 无明确时间表——策略是先稳定再发布

技术局限与边界

已知限制

  • 无类型检查:esbuild 明确拒绝实现 TypeScript 类型检查
  • 插件系统有限:无 CLI 插件、无 AST 操作 API、无 HMR 插件、Go 和 JS 不互通
  • 代码分割不成熟:相比 Rollup/Webpack,代码分割能力仍在改进
  • 不做框架特定支持:明确拒绝 Vue SFC、Angular 模板等框架特定编译
  • 0.x 不稳定:minor 版本可能包含 breaking changes
  • 单人维护:长期可持续性完全依赖 Evan Wallace 个人意愿
  • 无 Rollup 插件兼容:不兼容 Rollup 插件生态

不适用场景

  • 需要完整 Rollup 插件兼容 → Rolldown
  • 需要类型检查 → 配合 tsc
  • 需要 HMR → Vite 或 Webpack
  • 需要复杂代码分割 → Rollup 或 Webpack
  • 需要框架特定编译 → Webpack + 对应 loader

Rolldown 的替代威胁

2026 年是 esbuild 的关键转折年。Rolldown(Rust 编写,VoidZero/Vite 团队开发)于 2026 年 5 月发布 1.0,Vite 8(2026 年 3 月)已开始使用 Rolldown 替代 esbuild。Rolldown 的优势包括:

  • Rust 实现的极致性能
  • 100% Rollup API 兼容性
  • 完整的 Rollup 插件生态
  • HMR 支持
  • VoidZero/Cloudflare 的团队支持

学习资源

2026 年现状

最新版本

  • v0.28.1(2026 年 6 月 11 日)—— Import Attributes 支持、Windows 安全修复

发展趋势

  1. Rolldown 替代压力:Vite 8 开始使用 Rolldown 替代 esbuild,esbuild 在 Vite 生态的核心地位受到挑战
  2. 仍是最快的打包器:在原始构建速度上,esbuild 仍是所有工具中最快的
  3. Angular/Rails 采用:Angular 17+ 和 Ruby on Rails 7+ 的默认打包器地位稳固
  4. 单人维护的可持续性:Evan Wallace 仍在活跃维护,但长期可持续性存在疑问

2025-2026 重要里程碑

版本日期重大变化
0.25.02025 年初SSRF 安全修复、Path Namespaces
0.26.02025 年 11 月@view-transition CSS 规则、Trusted Publishing
0.27.0-0.27.72026 年 2-4 月Go 编译器升级 1.25→1.26、Metafile 改进
0.28.02026 年 4 月Import Attributes with { type: 'text' } 支持
0.28.12026 年 6 月Windows 目录穿越安全修复

社区活跃度

指标数值
GitHub Stars~40,000
npm 周下载量~2.37 亿
Open Issues~566
贡献者极少(主要 Evan Wallace 一人)
资金来源GitHub Sponsors(具体未公开)
维护状态活跃但单人依赖

总体评价

esbuild 仍然是前端构建工具中速度最快的存在,它的出现彻底改变了开发者对构建速度的预期。作为 Vite 开发模式的核心引擎,它影响了数百万开发者的日常体验。然而 2026 年是关键转折年——Rolldown 在 Vite 8 中的替代标志着 esbuild 在打包领域的统治地位开始松动。esbuild 的价值更多转向"纯粹的转译器"角色——它的转译速度仍然无人能及。Evan Wallace 的单人 BDFL 模式既是 esbuild 质量保障的原因(代码一致性极高),也是其最大的可持续性风险。