esbuild logo

esbuild

一个用 Go 编写的极速 JavaScript/CSS 打包器与转译工具,比传统工具快 10–100 倍。

精选工具BundlerGo极速打包Tree Shaking

esbuild 是用 Go 从零编写的极速 JS/CSS 打包器与转译工具,无需缓存即可实现惊人构建速度,比 Webpack 快 10-100 倍,是 Vite、Angular 等框架的底层构建引擎。

esbuild

一个用 Go 编写的极速 JavaScript/CSS 打包器与转译工具,比传统工具快 10–100 倍。

技术简介说明

esbuild 是由 Evan Wallace 创建的极速 JavaScript 打包与转译工具,使用 Go 语言从零编写。它的核心目标是为 Web 开发带来一个全新的构建性能时代,同时提供一个易用的现代化工具链。esbuild 将 JavaScript/TypeScript 打包、CSS 编译、代码压缩、Tree Shaking、Source Map 生成等能力集于一身,无需依赖缓存即可实现惊人的构建速度。

esbuild 的设计理念是作为一个"Web 链接器"——类似于编译系统中的 linker,它负责将多个模块文件组合成可执行的产物。通过充分利用现代硬件的并行处理能力与 Go 语言的内存共享机制,esbuild 在性能上实现了数量级的提升。在基准测试中,编译一个包含 10 份 3D 图形库副本的项目(含代码压缩和 Source Map),esbuild 仅需 0.39 秒,而传统工具需要 40 秒以上。

esbuild 已成为现代前端工具链的重要基石。Vite(截至 v6)、Angular(v17+)、Ruby on Rails(v7+)、Netlify Functions 等主流框架和平台都将 esbuild 作为默认构建引擎。截至 2026 年,esbuild 在 npm 上周下载量约 3000 万次,是整个前端生态中性能标杆级的构建工具。

基本信息

  • 官网https://esbuild.github.io/
  • GitHubhttps://github.com/evanw/esbuild
  • License:MIT
  • 最新版本:v0.28.1(2026 年 6 月 11 日)
  • 主要维护者:Evan Wallace(个人项目,社区贡献为辅)
  • 实现语言:Go
  • 支持平台:Windows、macOS、Linux(含 WebAssembly)

快速上手

安装

# npm
npm install esbuild --save-dev
 
# yarn
yarn add esbuild --dev
 
# pnpm
pnpm add esbuild -D
 
# 全局安装(CLI)
npm install -g esbuild

基础配置

esbuild 提供三种使用方式:CLI、JavaScript API 和 Go API。

CLI 方式:

# 打包单个文件
esbuild src/index.js --bundle --outfile=dist/out.js
 
# 生产模式(压缩 + 格式化)
esbuild src/index.js --bundle --minify --sourcemap --outfile=dist/out.js
 
# 启动开发服务器
esbuild src/index.js --bundle --servedir=www
 
# 监听文件变化
esbuild src/index.js --bundle --outfile=dist/out.js --watch

JavaScript API 方式:

const esbuild = require('esbuild')
 
// Build API — 打包
await esbuild.build({
  entryPoints: ['src/index.js'],
  bundle: true,
  outfile: 'dist/out.js',
  minify: true,
  sourcemap: true,
  target: ['es2020'],
  platform: 'browser', // 'node' | 'neutral'
  format: 'esm',       // 'cjs' | 'iife'
})
 
// Transform API — 转译(不打包,仅转换)
const result = await esbuild.transform(code, {
  loader: 'tsx',
  target: 'es2020',
})

Go API 方式:

package main
 
import (
  "github.com/evanw/esbuild/pkg/api"
)
 
func main() {
  result := api.Build(api.BuildOptions{
    EntryPoints: []string{"src/index.js"},
    Bundle:      true,
    Outfile:     "dist/out.js",
    MinifyWhitespace: true,
    MinifySyntax:      true,
    Target:            api.ES2020,
  })
  // 处理结果...
}

最小示例

项目结构:

my-app/
├── src/
│   ├── index.js
│   └── utils.js
├── package.json
└── build.js

src/utils.js:

export function greet(name) {
  return `Hello, ${name}!`
}

src/index.js:

import { greet } from './utils.js'
console.log(greet('esbuild'))

build.js:

const esbuild = require('esbuild')
 
esbuild.build({
  entryPoints: ['src/index.js'],
  bundle: true,
  outfile: 'dist/bundle.js',
  minify: true,
  sourcemap: true,
  target: ['es2015'],
  format: 'esm',
}).catch(() => process.exit(1))

执行:

node build.js
# 输出 dist/bundle.js

核心概念与架构

架构设计

esbuild 的架构围绕"极致性能"进行设计,核心特点包括:

  1. Go 语言实现:利用 Go 的静态编译、高效内存管理和原生并发原语,避免 JavaScript 运行时开销。
  2. 全并行处理:esbuild 内部将解析、转换、代码生成等阶段拆分为可并行的任务,充分利用多核 CPU。
  3. 共享内存策略:通过减少数据拷贝和内存分配,使用共享内存来降低 GC 压力。
  4. 手写解析器与编译器:esbuild 的 JavaScript/TypeScript/CSS 解析器全部从零手写,不依赖第三方库,针对性能做了深度优化。
  5. 零缓存设计:esbuild 不需要磁盘缓存即可达到极速,这与 webpack 等需要 cache 目录的工具形成鲜明对比。

核心工作流

源代码 → 解析(Parser)→ AST → 转换(Transformer)→ 链接(Linker/Bundler)→ 代码生成(Printer)→ 产物
  • Parser:将 JS/TS/JSX/CSS 源码解析为 AST
  • Transformer:进行语法降级、特性转换(如 TypeScript → JavaScript)
  • Bundler:解析依赖关系图,合并模块,执行 Tree Shaking
  • Printer:将 AST 序列化为最终的代码字符串,支持压缩输出

插件系统

esbuild 的插件是一个简单的 JavaScript 对象,包含 namesetup 函数。插件在每次构建时运行一次 setup,可以注册各种钩子拦截构建过程:

const myPlugin = {
  name: 'my-plugin',
  setup(build) {
    // 拦截模块解析
    build.onResolve({ filter: /\.png$/ }, args => {
      return { path: args.path, namespace: 'data-url' }
    })
    // 拦截模块加载
    build.onLoad({ filter: /.*/, namespace: 'data-url' }, async (args) => {
      return { contents: await loadImage(args.path), loader: 'dataurl' }
    })
  },
}

核心特性

1. 极速性能

基准测试中,esbuild 在冷启动场景下仅需 0.19 秒完成典型 React 项目打包,峰值内存占用仅 62.76 MB,磁盘占用 11 MB。比 webpack 快 10–100 倍,比大多数 Rust 构建工具也更快。

2. 多语言支持

原生支持 JavaScript(ES5+)、TypeScript、JSX/TSX、CSS(含 CSS Modules)、JSON,以及 base64、data URL、二进制文件等多种资源格式。

3. 内置代码压缩

无需额外工具即可进行代码压缩,包括变量重命名、语法简化、空白移除、死代码消除等。压缩过程与打包一体化,避免了二次解析开销。

4. Tree Shaking

支持 ES Module 和 CommonJS 模块的 Tree Shaking,自动移除未使用的导出和导入。

5. Source Map 支持

支持快速生成 Source Map,提供精确的源码映射,便于调试。支持内联(inline)和外置(external)两种模式。

6. 多输出格式

支持 ESM(esm)、CommonJS(cjs)、立即执行函数(iife)三种输出格式,满足不同部署环境需求。

7. 开发服务器

内置轻量级 HTTP 开发服务器,支持 --servedir 参数快速启动本地开发环境。

8. 文件监听与增量构建

支持 --watch 模式进行文件监听,以及 --serve 模式实现实时开发反馈。

9. 灵活的 Loader 系统

内置多种 loader:jsjsxtstsxcssjsontextbinarybase64dataurlfile,可通过 --loader 或 API 配置自定义资源处理方式。

10. 跨平台支持

支持 Windows、macOS、Linux,提供原生二进制文件,无需 Python 或 C++ 编译环境。同时支持 WebAssembly 版本。

生态图

关键依赖与被依赖关系

esbuild 处于现代前端工具链的核心位置:

                    ┌─────────────┐
                    │   esbuild   │
                    │  (核心引擎)  │
                    └──────┬──────┘
           ┌───────────────┼───────────────┐
           ▼               ▼               ▼
     ┌──────────┐   ┌──────────┐   ┌──────────┐
     │   Vite   │   │   tsup   │   │ Angular  │
     │  (≤ v6)  │   │ (库打包)  │   │ (v17+)   │
     └──────────┘   └──────────┘   └──────────┘
           │
     ┌─────┴─────┐
     ▼           ▼
 ┌────────┐ ┌────────┐
 │  Astro  │ │ Svelte │
 │  Kit   │ │  Kit   │
 └────────┘ └────────┘

主要使用 esbuild 的工具

工具用途说明
Vite(≤ v6)应用开发框架使用 esbuild 作为预打包和转译引擎
Angular CLI(v17+)应用框架将 esbuild 作为默认打包器
tsup库打包工具基于 esbuild 的 TypeScript 库打包器
Ruby on Rails(v7+)后端框架使用 esbuild 作为前端资源打包器
Netlify Functions云函数平台使用 esbuild 打包 Serverless 函数
Phoenix FrameworkElixir Web 框架集成 esbuild 进行前端资源构建
Sentry错误监控提供 esbuild 插件自动上传 Source Map

社区插件生态

虽然 esbuild 的插件生态不如 webpack 丰富,但核心插件覆盖了常见需求:

  • esbuild-plugin-postcss — PostCSS 集成
  • esbuild-sass-plugin — Sass/SCSS 支持
  • esbuild-style-plugin — CSS Modules 支持
  • @chialab/esbuild-plugin-html — HTML 入口处理
  • esbuild-plugin-copy — 静态资源拷贝
  • esbuild-plugin-babel — Babel 转译集成
  • esbuild-plugin-vue3 — Vue 3 单文件组件支持
  • esbuild-svelte — Svelte 集成
  • @happy-dom/esbuild-plugin — 测试环境支持

适用场景

1. 大型应用快速打包

当项目模块数量多、代码量大时,esbuild 的并行处理能力优势最为明显。适合需要频繁执行全量打包的 CI/CD 流水线。

2. 开发与构建工具底层引擎

作为 Vite、tsup、Angular CLI 等工具的底层引擎,esbuild 适合嵌入到更高层的构建工具中,提供极速的转译和打包能力。

3. TypeScript/JSX 快速转译

当仅需将 TypeScript/JSX 转换为 JavaScript 而不需要类型检查时,esbuild 的 Transform API 是最高效的选择,比 Babel + tsc 组合快数十倍。

4. Serverless/Edge 函数打包

Netlify Functions、Cloudflare Workers 等场景需要快速打包小体积的函数代码,esbuild 的 --bundle + --platform=node 非常适合。

5. 库文件构建

使用 tsup(基于 esbuild)或直接配置 esbuild,可以快速将 TypeScript 库打包为 ESM 和 CommonJS 双格式发布。

6. 静态资源处理

esbuild 内置支持 CSS、图片(base64/data URL)、JSON 等多种资源格式的加载和处理,适合作为简单的静态资源管线。

7. 旧项目迁移与现代化

esbuild 可以快速将大量 ES5/TypeScript 代码转译为现代语法,或降级到低版本目标环境,适合渐进式技术栈升级。

开发与工程化

开发流程集成

与 npm scripts 集成:

{
  "scripts": {
    "build": "esbuild src/index.tsx --bundle --minify --sourcemap --outfile=dist/bundle.js",
    "dev": "esbuild src/index.tsx --bundle --watch --servedir=public --outdir=public/dist",
    "typecheck": "tsc --noEmit"
  }
}

与 build.js 配置文件集成(推荐):

// build.js
const esbuild = require('esbuild')
 
const isDev = process.env.NODE_ENV === 'development'
 
esbuild.build({
  entryPoints: ['src/index.tsx'],
  bundle: true,
  minify: !isDev,
  sourcemap: isDev ? 'inline' : true,
  outfile: 'dist/bundle.js',
  target: ['es2020'],
  define: {
    'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production'),
  },
  loader: {
    '.png': 'file',
    '.svg': 'file',
    '.woff2': 'file',
  },
  external: ['fsevents'],
  logLevel: 'info',
})

CI/CD 集成

esbuild 在 CI 环境中的优势尤为突出:

# GitHub Actions 示例
name: Build
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci
      - run: npx esbuild src/index.tsx --bundle --minify --outfile=dist/bundle.js
      - run: npm run typecheck
      - uses: actions/upload-artifact@v4
        with:
          name: build
          path: dist/

由于 esbuild 无需缓存且启动极快,CI 流水线中的构建时间可以大幅缩短。在 Docker 构建中,esbuild 的二进制分发方式也避免了额外的系统依赖。

Monorepo 支持

在 Turborepo 或 Nx 等 Monorepo 工具中,esbuild 可作为各 workspace 的构建引擎:

// packages/ui/build.js
const esbuild = require('esbuild')
 
esbuild.build({
  entryPoints: ['src/index.ts'],
  bundle: true,
  format: 'esm',
  outfile: 'dist/index.mjs',
  external: ['react', 'react-dom'], // 外部化共享依赖
  packages: 'external',             // 排除 node_modules
})

性能与安全

性能特点

指标esbuild (v0.28)webpack 5Rollup 4
冷启动打包(React 项目)~0.19s~1.5–3s~0.8s
峰值内存~63 MB~200+ MB~150+ MB
磁盘占用~11 MB~50+ MB~30+ MB
依赖数量150+10+
TypeScript 转译(1000 文件)~350msN/A(需 Babel)N/A(需 Babel)

性能优化建议

  1. 合理设置 target:目标越现代,esbuild 需要做的语法降级越少,产物越小。
  2. 使用 external 排除大依赖:将 React、Vue 等大型库标记为外部依赖,减少打包体积和时间。
  3. 利用 splitting:ESM 格式下启用代码分割,按需加载。
  4. 避免过度使用插件:esbuild 插件运行在 JS 线程上,可能成为瓶颈。优先使用 esbuild 内置能力。
  5. 增量构建:开发环境使用 --watch 模式,避免重复全量打包。
  6. 选择合适的 format:现代浏览器优先使用 esm,支持 Tree Shaking 和代码分割。

安全注意事项

  • 路径穿越防护:v0.28.1 修复了 Windows 平台本地开发服务器中反斜杠字符导致的目录穿越漏洞。生产环境务必使用最新版本。
  • 完整性校验:从 v0.27.5 起,npm 下载脚本添加了完整性检查,防止供应链攻击。Deno 安装脚本也从 v0.28.1 起增加了此保护。
  • 依赖信任:esbuild 仅 1 个直接依赖(其平台特定的二进制包),依赖链极短,降低了供应链风险。
  • define 注入:使用 define 注入环境变量时要谨慎,避免将敏感信息泄露到客户端代码中。
  • 外部依赖审计external 标记的依赖不受 esbuild 控制,需单独进行安全审计。

技术对比

esbuild vs webpack 5

维度esbuildwebpack 5
速度极快(10–100x)较慢,依赖缓存
生态插件生态较小最成熟的插件生态
配置复杂度简单直观配置复杂,学习曲线陡
HMR不支持完善的 HMR
代码分割基础支持高级 SplitChunksPlugin
类型检查不支持通过 ts-loader/ForkTsCheckerWebpackPlugin
适用场景快速打包、转译、工具链引擎大型复杂应用、需要高度定制

esbuild vs Rollup

维度esbuildRollup 4
速度更快快,但略慢于 esbuild
库打包可用(tsup 等)库打包的黄金标准
Tree Shaking支持,ESM 优先更成熟的 Tree Shaking
插件 API简单实用丰富的插件钩子
CSS 支持内置需要插件
输出格式ESM/CJS/IIFEESM/CJS/IIFE/UMD
适用场景通用打包、开发工具链库/组件库打包

esbuild vs SWC

维度esbuildSWC
定位完整打包器 + 转译器纯转译器
打包能力完整支持不支持(需配合其他工具)
语言GoRust
速度极快极快(接近)
TypeScript转译(不检查类型)转译(不检查类型)
装饰器有限支持更完善的装饰器支持
适用场景打包 + 转译一体化仅需转译(替代 Babel)

esbuild vs Rolldown

维度esbuildRolldown
语言GoRust
定位通用打包器Rollup 的 Rust 替代品
速度极快(基准最快)极快(接近 esbuild)
生态兼容独立生态兼容 Rollup 插件 API
Vite 集成Vite ≤ v6Vite 8+(默认)
成熟度成熟稳定(2020 至今)较新(2024 至今)
适用场景通用、工具链嵌入Vite 8+ 项目、Rollup 迁移

最佳实践

生产环境配置建议

const esbuild = require('esbuild')
 
await esbuild.build({
  entryPoints: ['src/index.tsx'],
  bundle: true,
  minify: true,
  sourcemap: true,
  target: ['es2020'],
  format: 'esm',
  splitting: true,           // ESM 代码分割
  outdir: 'dist',
  platform: 'browser',
  define: {
    'process.env.NODE_ENV': '"production"',
  },
  external: [],              // 生产环境不外部化
  treeShaking: true,
  metafile: true,            // 生成元数据用于分析
  logLevel: 'warning',
  // 安全相关
  legalComments: 'none',     // 移除法律注释以减小体积
})

常见陷阱

  1. 不做类型检查:esbuild 只剥离 TypeScript 类型标注,不进行类型检查。必须在 CI 中单独运行 tsc --noEmit

  2. const enum 不支持:esbuild 不支持 TypeScript 的 const enum,建议使用普通 enum 或字面量联合类型替代。

  3. 实验性装饰器:esbuild 对 Stage 3 装饰器的支持有限,复杂场景可能需要 Babel/SWC。

  4. CommonJS Tree Shaking 不完美:对 CJS 模块的 Tree Shaking 能力不如 ESM 完善,尽量使用 ESM 格式。

  5. 无 HMR:esbuild 没有内置热模块替换,开发时的 HMR 需要依赖 Vite 等上层框架。

  6. 插件性能:esbuild 插件运行在 JavaScript 线程上,对于大量文件的自定义处理可能成为瓶颈。尽量使用 onResolve/onLoad 的批量处理模式。

  7. 版本锁定:esbuild 的 npm 包通过平台特定二进制包分发,CI 中应锁定版本并确保平台兼容。

分析打包产物

# 生成 metafile
esbuild src/index.js --bundle --metafile=meta.json --outfile=dist/out.js
 
# 使用可视化分析工具
npx esbuild-visualizer --metadata meta.json
# 或使用 bundlenalyzer
npx source-map-explorer dist/out.js

技术局限与边界

已知限制

  1. 无类型检查:esbuild 明确不做 TypeScript 类型检查,这是设计决策而非缺陷,但用户需配合 tsc 或其他工具。

  2. 未达 1.0:截至 2026 年 7 月,esbuild 仍为 0.x 版本。Evan Wallace 表示在核心功能完善前不会发布 1.0。已知存在一些边界情况的 bug。

  3. CSS 能力有限:esbuild 的 CSS 处理仅覆盖基础功能(嵌套、变量、@scope 等),不支持 Sass/Less 语法(需插件),也没有 PostCSS 级别的转换能力。

  4. 无 HMR 支持:不支持热模块替换,开发环境的 HMR 必须依赖上层框架(如 Vite)。

  5. 插件生态较小:相比 webpack 和 Rollup,esbuild 的社区插件数量有限,某些特殊需求可能需要自行实现。

  6. 代码分割不够灵活:ESM 的 splitting 功能相对基础,不支持 webpack 级别的细粒度 SplitChunksPlugin 控制。

  7. 单人维护风险:esbuild 主要由 Evan Wallace 一人维护,存在"bus factor"风险。虽然社区活跃,但核心代码贡献者较少。

不适用场景

  • 需要完善 HMR 的大型 SPA 开发:直接使用 Vite 或 webpack。
  • 库打包需要最大兼容性:Rollup 在库打包场景的 Tree Shaking 和输出生成更成熟。
  • 需要复杂 CSS 管线:如 Sass/Less/PostCSS 全流程,webpack + loader 更合适。
  • 需要 100% TypeScript 兼容:包括 const enumnamespace 等边缘特性,应使用 tsc 或 SWC。
  • 高度定制化的构建流程:esbuild 的配置灵活性不如 webpack,极端定制需求可能受限。

学习资源

官方资源

教程与指南

社区资源

2026 年现状

最新版本

截至 2026 年 7 月,esbuild 的最新稳定版为 v0.28.1(2026 年 6 月 11 日发布)。

2025–2026 版本演进:

版本发布日期关键变更
v0.25.02025 年初多项功能增强
v0.27.32025.02CSS @scope 规则支持,SVG URL 片段保留
v0.27.42025.03CSS or 媒体查询修复,大 metafile 处理优化
v0.27.52025.04TypeScript 参数属性语义定义,es2025 target 支持
v0.28.02025.04with { type: 'text' } 导入提案支持,Go 编译器升级
v0.28.12026.06安全修复(路径穿越),Deno 完整性校验

发展趋势

  1. Rolldown 的崛起:2026 年 3 月,Vite 8 正式发布,将默认打包引擎从 esbuild + Rollup 替换为 Rolldown(Rust 编写)。这是 esbuild 生态中最大的变化——Vite 曾是 esbuild 最大的消费方。但 esbuild 在原始打包速度上仍然领先(基准测试中 esbuild 0.19s vs Rolldown 0.27s)。

  2. VoidZero 加入 Cloudflare:Rolldown 背后的公司 VoidZero 于 2026 年 6 月加入 Cloudflare,意味着 Rolldown 将获得更多资源支持,与 esbuild 的竞争将持续。

  3. 持续维护:esbuild 仍在活跃更新中,安全漏洞得到及时修复(如 v0.28.1 的路径穿越修复),但核心发展节奏由 Evan Wallace 个人把控。

  4. 生态位稳固:尽管 Vite 8 迁移到 Rolldown,esbuild 在 Angular(v17+)、tsup、Ruby on Rails、Netlify Functions 等平台中的地位未变。作为"最快转译器"的角色依然稳固。

  5. 1.0 之路:社区对 esbuild 1.0 的期待持续(GitHub Issue #2544),但 Evan Wallace 表示在功能完善之前不会急于发布。当前仍处于 0.x 阶段。

未来展望

  • esbuild 预计将继续作为"极速打包器 + 转译器"的定位深耕
  • Go 语言生态的优势在于部署简单、跨平台一致性好,但 Rust 工具链(Rolldown、SWC)的势头在增强
  • 随着 Vite 8 迁移到 Rolldown,esbuild 可能需要更多独立场景的证明
  • Evan Wallace 的个人投入是项目发展的关键变量——作为个人项目,其可持续性依赖作者的持续兴趣和时间