Bun Build
Bun 运行时内置的高性能打包器,用 Zig 编写,比 esbuild 快 1.75 倍,支持全栈构建、单文件可执行产物和零配置前端开发。
Bun Build 是 Bun 运行时内置的 JavaScript/TypeScript 打包器,用 Zig 编写,深度集成运行时、包管理器和测试运行器,实现极致构建速度与全栈零配置开发体验。
Bun Build
Bun 运行时内置的高性能打包器,用 Zig 编写,比 esbuild 快 1.75 倍,支持全栈构建、单文件可执行产物和零配置前端开发。
技术简介说明
Bun Build 是 Bun 运行时内置的 JavaScript/TypeScript 打包器。它并非独立工具,而是与 Bun 的运行时、包管理器、测试运行器深度集成的"全合一"工具链核心组件。Bun Build 用 Zig 语言编写,架构设计参考了 esbuild,但通过将打包逻辑直接嵌入运行时(而非外部进程),消除了进程间通信开销,从而实现了极致的构建速度。
Bun Build 的定位不仅是"更快的 esbuild"——它试图重新定义前端构建范式。通过 HTML 文件导入、Bun.serve() 全栈开发服务器和零配置 HMR,Bun 将传统上需要 Webpack/Vite + 开发服务器 + 多个插件协同完成的工作,压缩到一条命令、零配置即可完成。它同时支持浏览器端(browser)、Bun 运行时(bun)和 Node.js(node)三种目标,可一次构建覆盖全栈。
截至 2026 年,Bun 已发展到 v1.3.x 系列,打包器在生产场景中逐步成熟,但仍处于快速迭代期。2025 年底 Oven(Bun 的母公司)被 Anthropic 收购,未来发展方向可能受到更大平台战略的影响。
基本信息
| 项目 | 信息 |
|---|---|
| 官网 | https://bun.com/docs/bundler |
| GitHub | https://github.com/oven-sh/bun |
| License | MIT(核心),部分组件为 Zig + C++ 混合许可 |
| 最新版本 | v1.3.14(2026 年 5 月 13 日发布) |
| 主要维护者 | Oven (oven.sh),创始人 Jarred Sumner |
| 编写语言 | Zig(正在向 Rust 重写迁移中) |
快速上手
安装
# macOS / Linux
curl -fsSL https://bun.sh/install | bash
# Windows (PowerShell)
powershell -c "irm bun.sh/install.ps1 | iex"
# 通过 npm
npm install -g bun
# 验证安装
bun --version基础配置
Bun Build 支持两种调用方式:CLI 和 JavaScript API。
CLI 方式:
# 基础打包
bun build ./src/index.ts --outdir ./dist
# 生产构建(启用压缩 + NODE_ENV=production)
bun build ./src/index.ts --outdir ./dist --production
# 指定目标
bun build ./src/index.ts --target=browser --outdir ./dist
# 监听模式
bun build ./src/index.ts --outdir ./dist --watch
# 编译为单文件可执行程序
bun build ./src/cli.ts --outfile mycli --compileJavaScript API 方式:
const result = await Bun.build({
entrypoints: ['./src/index.tsx'],
outdir: './dist',
target: 'browser',
format: 'esm',
splitting: true,
minify: true,
sourcemap: 'external',
});
if (!result.success) {
console.error(result.logs);
process.exit(1);
}最小示例
// src/greet.ts
export function greet(name: string): string {
return `Hello, ${name}!`;
}
// src/index.ts
import { greet } from './greet';
console.log(greet('Bun'));bun build ./src/index.ts --outdir ./dist --production
# 输出: dist/index.js (压缩后的单文件)核心概念与架构
架构设计
Bun Build 的架构基于以下核心原则:
- 运行时内嵌:打包器直接嵌入 Bun 运行时,不依赖外部进程。避免了 esbuild 需要 fork 子进程的 IPC 开销。
- Zig 编写:核心代码使用 Zig 语言,内存安全且无 GC 停顿,编译为高度优化的原生代码。
- JavaScriptCore 引擎:使用 Apple 的 JavaScriptCore(而非 V8),在启动速度和内存效率上有独特优势。
- esbuild 兼容设计:API 架构参考 esbuild,降低迁移成本。
工作原理
源文件 → 解析(Zig 原生解析器)
→ 依赖图构建
→ Tree Shaking(始终启用)
→ 代码转换(TS/JSX → JS)
→ 压缩(原生压缩器)
→ 产物输出(BuildArtifact,实现 Blob 接口)
BuildArtifact
打包产物类型为 BuildArtifact,实现了 Blob 接口,可直接用于 HTTP 响应:
const result = await Bun.build({ entrypoints: ['./app.ts'] });
// 直接作为 HTTP 响应返回
return new Response(result.outputs[0], {
headers: { 'Content-Type': 'application/javascript' },
});目标(Target)
| 目标 | 说明 |
|---|---|
browser | 默认目标。优先使用 browser 导出条件,自动 polyfill Node 内置模块 |
bun | 面向 Bun 运行时。输出带 // @bun 注释跳过重复转译 |
node | 面向 Node.js。优先使用 node 导出条件,输出 .mjs |
格式(Format)
| 格式 | 状态 | 说明 |
|---|---|---|
esm | 稳定(默认) | 支持顶层 await 和 import.meta |
cjs | 实验性 | 兼容 Bun 和 Node.js |
iife | 实验性 | 立即执行函数包装 |
核心特性
1. 极致构建速度
基于 esbuild 的 three.js 基准测试(10 份 three.js + sourcemap + 压缩):
| 工具 | 相对速度 |
|---|---|
| Bun | 1x(基准) |
| esbuild | 1.75x(比 Bun 慢) |
| Parcel 2 | 150x |
| Rollup + Terser | 180x |
| Webpack | 220x |
2. Tree Shaking 始终启用
无需配置,自动移除未使用代码。尊重 package.json 的 sideEffects 字段、@__PURE__ 注释和环境变量。同时支持 ESM 和基础 CommonJS 的 tree shaking。
3. 全栈构建(Fullstack Build)
通过 HTML 文件导入 + Bun.serve() 实现前后端一体化构建:
import homepage from './index.html';
Bun.serve({
routes: { '/': homepage },
development: true,
});自动处理 <script>、<link> 标签引用的资源,生成带哈希的产物 URL。
4. 条件编译(Features)
通过 bun:bundle 模块实现编译时死代码消除:
import { feature } from 'bun:bundle';
if (feature('PREMIUM')) {
initPremiumFeatures(); // 当 PREMIUM 未启用时,整段代码被移除
}5. 单文件可执行产物
bun build ./cli.ts --outfile mycli --compile生成包含 Bun 运行时的独立可执行文件,无需目标机器安装 Node 或 Bun。
6. 字节码编译
await Bun.build({
entrypoints: ['./app.ts'],
target: 'bun',
bytecode: true,
compile: true,
});将代码预编译为 .jsc 字节码,大幅缩短大型应用启动时间。
7. 多格式资源加载
| 文件类型 | 处理方式 |
|---|---|
.ts / .tsx / .jsx | 原生转译,无需配置 |
.json / .jsonc / .toml / .yaml | 解析为 JS 对象内联 |
.css | 合并为单个 .css 文件 |
.html | 自动处理引用的脚本、样式和图片 |
.txt | 内联为字符串 |
.wasm / .node | 作为资源拷贝 |
8. 虚拟文件系统(files)
完全从内存构建项目,无需磁盘文件:
await Bun.build({
entrypoints: ['/app/index.ts'],
files: {
'/app/index.ts': `import { greet } from './greet.ts'; console.log(greet('World'));`,
'/app/greet.ts': `export function greet(name) { return 'Hello, ' + name; }`,
},
});9. 原生压缩器
支持细粒度控制:
minify: {
whitespace: true, // 压缩空白
identifiers: true, // 缩短标识符
syntax: true, // 语法优化
}10. Metafile 产物分析
bun build ./src/index.ts --outdir ./dist --metafile ./dist/meta.json --metafile-md ./dist/meta.md输出完整的依赖图、导入/导出信息和体积分析,可用于可视化打包分析。
生态图
关键依赖与集成
| 组件 | 说明 |
|---|---|
| Bun Runtime | 打包器与运行时深度集成,共享 JavaScriptCore 引擎 |
| JavaScriptCore | Apple 的 JS 引擎,替代 V8 |
| Zig | 核心编写语言(正在向 Rust 迁移) |
| bunfig.toml | Bun 的统一配置文件,影响打包、运行时、测试行为 |
插件生态
Bun Build 提供统一插件 API,生命周期钩子包括:
| 钩子 | 用途 |
|---|---|
onStart() | 构建开始时执行 |
onResolve() | 拦截模块解析 |
onLoad() | 拦截文件加载,自定义转译 |
onBeforeParse() | 解析前的原生零拷贝扩展(Rust/C++) |
onEnd() | 构建完成后处理结果 |
社区插件示例:
// Tailwind CSS 插件
// bunfig.toml
[serve.static]
plugins = ["bun-plugin-tailwind"]bun add bun-plugin-tailwind tailwindcss自定义插件:
const myPlugin: BunPlugin = {
name: 'custom-loader',
setup(build) {
build.onLoad({ filter: /\.md$/ }, async (args) => {
const text = await Bun.file(args.path).text();
return {
contents: `export default ${JSON.stringify(text)};`,
loader: 'js',
};
});
},
};社区生态
| 项目 | 说明 |
|---|---|
| bun-plugin-* | npm 上已有数十个社区插件 |
| Bun Discord | 官方社区 |
| GitHub Discussions | 活跃的技术讨论区 |
适用场景
1. 全栈 Web 应用
HTML 导入 + Bun.serve() 让前后端代码在单一构建命令中完成,特别适合中小规模全栈项目。
2. CLI 工具分发
--compile 编译为独立可执行文件,用户无需安装 Node.js 或 Bun,适合分发命令行工具。
3. Serverless / Edge 函数
极快的冷启动 + 小体积产物,适合 Lambda、Cloudflare Workers 等对启动延迟敏感的场景。
4. CI/CD 构建加速
替代 Webpack/esbuild 作为 CI 中的打包步骤,利用速度优势缩短构建流水线时间。
5. TypeScript/JSX 项目快速转译
零配置支持 TypeScript 和 JSX,无需额外安装 tsc、@babel/preset-typescript 等工具。
6. Monorepo 开发
与 Bun 的 workspace 支持结合,为 monorepo 提供统一的构建、测试、运行体验。
7. 条件编译的产品变体
通过 features 条件编译,同一代码库构建免费/付费/企业版等不同产品变体。
开发与工程化
开发模式
// server.ts
import homepage from './index.html';
Bun.serve({
routes: { '/': homepage },
development: {
hmr: true, // 热模块替换
console: true, // 浏览器日志输出到终端
},
});生产构建
# 预编译构建(推荐)
bun build --target=bun --production --outdir=dist ./src/index.ts
# 运行
NODE_ENV=production bun dist/index.jsDocker 部署
FROM oven/bun:1 AS base
WORKDIR /app
FROM base AS install
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
FROM base AS build
COPY --from=install /app/node_modules ./node_modules
COPY . .
RUN bun build --target=bun --production --outdir=dist ./src/index.ts
FROM base AS release
COPY --from=build /app/dist ./dist
EXPOSE 3000
CMD ["bun", "dist/index.js"]CI/CD 集成
# GitHub Actions 示例
name: Build & Deploy
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- run: bun install --frozen-lockfile
- run: bun run typecheck
- run: bun build --production --outdir=dist ./src/index.ts
- run: bun test代码分割
await Bun.build({
entrypoints: ['./src/page-a.ts', './src/page-b.ts'],
splitting: true, // 共享模块提取为独立 chunk
outdir: './dist',
});性能与安全
性能特点
| 维度 | 说明 |
|---|---|
| 构建速度 | 比 esbuild 快约 1.75 倍,比 Webpack 快两个数量级(three.js 基准) |
| 依赖安装 | 低至 115ms(v1.3.14),warm install 比 v1.2 快 7 倍 |
| 启动速度 | 字节码编译可大幅缩短大型应用启动时间;tsc 启用字节码后启动快 2 倍 |
| 产物体积 | Tree shaking 始终启用,原生压缩器优化产物大小 |
| HTTP 吞吐 | 合成基准测试中 Bun HTTP 服务器达 Node.js 的 3-4 倍;实际应用中差距约 3% |
| 冷启动 | Vercel Edge Functions 使用 Bun 后冷启动快 40%(2025 年中数据) |
优化建议
- 启用代码分割:
splitting: true,共享模块自动提取,减少重复加载 - 使用条件编译:
features标记移除不需要的功能代码 optimizeImports:针对 antd、lodash-es 等 barrel 文件优化解析- 字节码编译:对启动延迟敏感的应用启用
bytecode: true drop选项:移除生产环境不需要的调试调用:drop: ['console', 'debugger']external标记:大型依赖(如 react)通过 CDN 加载,减少产物体积
安全注意事项
| 关注点 | 说明 |
|---|---|
| 环境变量泄露 | env: "inline" 会将所有环境变量内联到产物中,应使用 "PREFIX_*" 只暴露公开变量 |
| 依赖安全 | Bun 的包管理器兼容 npm 生态,需自行审计依赖安全性 |
| 代码执行 | 单文件可执行产物包含完整运行时,需确保分发渠道安全 |
技术对比
Bun Build vs esbuild
| 维度 | Bun Build | esbuild |
|---|---|---|
| 速度 | 比 esbuild 快 1.75x | 基准 |
| 语言 | Zig | Go |
| 集成度 | 内嵌运行时,无需额外安装 | 独立工具,需单独安装 |
| API 兼容性 | 兼容 esbuild API(有差异) | 原生 API |
| 开发服务器 | 内置(Bun.serve()) | 无,需配合其他工具 |
| HMR | 内置 | 无 |
| 插件生态 | 新兴,较少 | 较少但稳定 |
| 格式支持 | esm(稳定)、cjs/iife(实验性) | esm/cjs/iife(稳定) |
| CSS 支持 | 有,支持 chunking | 无原生 CSS 打包 |
| HTML 处理 | 有,自动处理引用资源 | 无 |
| 目标平台 | browser / bun / node | browser / node / neutral |
Bun Build vs Vite
| 维度 | Bun Build | Vite |
|---|---|---|
| 定位 | 全合一运行时打包器 | 前端开发框架/构建工具 |
| 底层引擎 | Zig 原生 | esbuild(dev)+ Rollup(prod) |
| 开发体验 | 零配置 HMR + 全栈 | 成熟的 HMR + 丰富插件 |
| 插件生态 | 新兴 | 极其丰富(Rollup 插件兼容) |
| SSR | 实验性(React Server Components) | 成熟支持 |
| 框架集成 | 通用 | Vue/React/Svelte 等深度优化 |
| 生产打包 | 内置 | Rollup |
Bun Build vs Webpack
| 维度 | Bun Build | Webpack |
|---|---|---|
| 速度 | 快 220x | 基准 |
| 成熟度 | 较新 | 极其成熟 |
| 插件数量 | 数十个 | 数万个 |
| 配置复杂度 | 几乎零配置 | 配置复杂但灵活 |
| 边缘场景 | 部分不支持 | 几乎全部覆盖 |
| 学习曲线 | 低 | 高 |
| Module Federation | 不支持 | 支持 |
| 缓存策略 | 内容哈希 | 丰富(memory/filesystem 等) |
对比总结
| 场景 | 推荐 |
|---|---|
| 极致构建速度 | Bun Build |
| 成熟前端开发 | Vite / Webpack |
| 复杂企业项目 | Webpack |
| 库/SDK 发布 | Rollup |
| 全栈零配置 | Bun Build |
| CLI 工具分发 | Bun Build |
| CI 构建加速 | Bun Build / esbuild |
最佳实践
1. 环境变量管理
// 推荐:只暴露公开变量
await Bun.build({
entrypoints: ['./src/index.ts'],
env: 'PUBLIC_*', // 仅内联 PUBLIC_ 前缀的变量
outdir: './dist',
});2. Barrel 文件优化
// 针对 antd/lodash 等重导出文件优化
await Bun.build({
entrypoints: ['./src/index.ts'],
optimizeImports: ['antd', '@mui/material', 'lodash-es'],
outdir: './dist',
});当 package.json 中有 "sideEffects": false 时,该优化自动启用。
3. 生产环境构建配置
await Bun.build({
entrypoints: ['./src/server.ts'],
target: 'bun',
format: 'esm',
minify: {
whitespace: true,
identifiers: true,
syntax: true,
},
sourcemap: 'external',
splitting: true,
drop: ['console', 'debugger'],
outdir: './dist',
});4. 多入口 + 代码分割
await Bun.build({
entrypoints: [
'./src/pages/home.ts',
'./src/pages/dashboard.ts',
'./src/pages/settings.ts',
],
splitting: true,
naming: {
entry: '[dir]/[name]-[hash].[ext]',
chunk: 'chunks/[name]-[hash].[ext]',
},
outdir: './dist',
});5. 单文件 CLI 分发
bun build ./src/cli.ts \
--outfile mycli \
--compile \
--windows-hide-console \
--windows-icon ./icon.ico6. 文件命名策略
await Bun.build({
entrypoints: ['./src/index.ts'],
naming: {
entry: '[dir]/[name]-[hash].[ext]',
chunk: '[name]-[hash].[ext]',
asset: 'assets/[name]-[hash].[ext]',
},
publicPath: 'https://cdn.example.com/',
outdir: './dist',
});技术局限与边界
已知限制
| 限制 | 说明 |
|---|---|
| CJS 输出实验性 | format: "cjs" 仍为实验性,部分场景可能有问题 |
| IIFE 输出实验性 | format: "iife" 的 globalNames 等高级选项尚不完善 |
| 插件生态不成熟 | 相比 Webpack/Vite 插件数量极少,复杂场景需自行实现 |
| Module Federation 不支持 | 无法像 Webpack 5 那样实现微前端模块联邦 |
| 部分 npm 兼容性 | npm 兼容率约 92%,某些边缘包可能不兼容 |
| 无内置 SSR | 全栈模式无内建服务端渲染(React Server Components 为实验性) |
| API 路由无自动发现 | 需手动注册路由,不支持文件系统路由自动发现 |
| 语法不降级 | 不做语法降级(如 async/await → generators),仅转译 TS/JSX |
不适用场景
- 需要 Module Federation 的微前端架构 → 使用 Webpack 5
- 需要数万个插件覆盖的边缘场景 → 使用 Webpack
- 纯库/SDK 发布且需要极致产物优化 → 使用 Rollup
- 需要成熟 SSR 的复杂前端应用 → 使用 Next.js + Vite/Webpack
- 需要语法降级到旧浏览器 → Bun 不做语法降级,需配合其他工具
- 生产环境要求绝对稳定 → Bun 仍在快速迭代,API 可能变更
学习资源
官方资源
| 资源 | 链接 |
|---|---|
| Bun 打包器文档 | https://bun.com/docs/bundler |
| 全栈开发文档 | https://bun.com/docs/bundler/fullstack |
| 插件 API 文档 | https://bun.com/docs/bundler/plugins |
| esbuild 迁移指南 | https://bun.com/docs/bundler/esbuild |
| 官方博客 | https://bun.com/blog |
| Discord 社区 | https://discord.com/invite/bun |
| GitHub Discussions | https://github.com/oven-sh/bun/discussions |
教程与文章
| 资源 | 说明 |
|---|---|
| The Bun Bundler (官方博客) | Bun 打包器发布说明与架构介绍 |
| Bun in 2025: Critical Evaluation | 2025 年 Bun 成熟度评估 |
| The Practical Guide to Bun in Production | 生产环境实战指南 |
| Turbopack, Vite, Bun Bundler and the Next-Gen Tooling Race | 下一代构建工具竞争格局分析 |
| JavaScript 2026: The New Era | 2026 年 JS 生态全景 |
2026 年现状
最新版本:v1.3.14(2026 年 5 月)
v1.3.x 系列重要里程碑:
| 版本 | 发布时间 | 关键特性 |
|---|---|---|
| v1.3.14 | 2026-05 | Bun.Image 图像处理 API、HTTP/3 支持、依赖安装低至 115ms |
| v1.3.12 | 2026-04 | Bun.WebView 原生无头浏览器自动化 |
| v1.3.11 | 2026-03 | Bun.cron 定时任务支持 |
| v1.3.10 | 2026-02 | REPL 完全用 Zig 重写 |
| v1.3.6 | 2025-12 | Bun.Archive tar/gzip API |
| v1.3.0 | 2025-10 | 统一 SQL API、内置 Redis 客户端、包目录、零配置前端开发 |
| v1.2.0 | 2025-01 | Bun Bake 实验性全栈框架 |
发展趋势
- Rust 重写迁移:v1.3.14 可能是最后一个完全使用 Zig 的版本。Jarred Sumner 已表示如果 Rust 重写完成并合并,未来将切换到 Rust。
- Anthropic 收购:Oven 于 2025 年 12 月被 Anthropic 收购,Bun 的未来发展方向可能受到 Anthropic 平台战略的影响。
- 全栈一体化:Bun 正朝着"一个工具覆盖全栈开发"的方向演进,
Bun.serve()+ HTML 导入 + React Server Components 是核心路径。 - 运行时能力持续扩展:从 v1.3.x 可见,Bun 不断内置新能力(Image、WebView、Cron、SQL、Redis),减少对外部依赖的需求。
- 社区采用率:Reddit 和 HN 讨论显示,部分开发者已在生产环境使用 Bun,但主流采用仍受制于兼容性担忧和生态成熟度。
未来路线图(已知/推测)
bun buildCLI 完整支持全栈应用构建- 文件系统路由自动发现(API 路由)
- 内建 SSR 支持
- Rust 重写完成后性能进一步提升
- 更丰富的插件生态
- 与 Anthropic 生态(Claude 等)的深度集成可能性