Bun 的打包器 API 在很大程度上受到了 esbuild 的启发。从 esbuild 迁移到 Bun 的打包器应该是相对轻松的。本指南将简要解释您可能考虑迁移到 Bun 打包器的原因,并为那些已经熟悉 esbuild API 的人提供并排 API 对照参考。
有几个行为差异需要注意。
- 默认打包。与 esbuild 不同,Bun 始终默认打包。这就是为什么在 Bun 示例中不需要
--bundle
标志的原因。要单独转译每个文件,请使用Bun.Transpiler
。 - 它只是一个打包器。与 esbuild 不同,Bun 的打包器不包含内置的开发服务器或文件监视器。它只是一个打包器。该打包器旨在与
Bun.serve
和其他运行时 API 结合使用,以实现相同的效果。因此,所有与 HTTP/文件监视相关的选项均不适用。
性能
凭借性能至上的 API 以及经过广泛优化的基于 Zig 的 JS/TS 解析器,在 esbuild 的 three.js 基准测试中,Bun 的打包器比 esbuild 快 1.75 倍。

CLI API
Bun 和 esbuild 都提供了命令行界面。
esbuild <entrypoint> --outdir=out --bundle
bun build <entrypoint> --outdir=out
在 Bun 的 CLI 中,像 --minify
这样的简单布尔标志不接受参数。像 --outdir <path>
这样的其他标志确实接受参数;这些标志可以写成 --outdir out
或 --outdir=out
。一些标志,如 --define
,可以指定多次:--define foo=bar --define bar=baz
。
esbuild | bun build | |
---|---|---|
--bundle | n/a | Bun 始终打包,使用 --no-bundle 禁用此行为。 |
|
| 小语法差异;没有冒号。
|
|
| 小语法差异;没有冒号。
|
--format | --format | Bun 目前支持 "esm" 和 "cjs" ,但计划支持更多模块格式。esbuild 默认为 "iife" 。 |
|
| Bun 支持的内置加载器集与 esbuild 不同;有关完整参考,请参阅 Bundler > Loaders。esbuild 加载器
|
--minify | --minify | 无差异 |
--outdir | --outdir | 无差异 |
--outfile | --outfile | |
--packages | --packages | 无差异 |
--platform | --target | 为了与 tsconfig 保持一致,重命名为 --target 。不支持 neutral 。 |
--serve | n/a | 不适用 |
--sourcemap | --sourcemap | 无差异 |
--splitting | --splitting | 无差异 |
--target | n/a | 不支持。Bun 的打包器目前不执行任何语法降级。 |
--watch | --watch | 无差异 |
--allow-overwrite | n/a | 永远不允许覆盖 |
--analyze | n/a | 不支持 |
--asset-names | --asset-naming | 为了与 JS API 中的 naming 保持一致而重命名 |
--banner | --banner | 仅适用于 js 包 |
--footer | --footer | 仅适用于 js 包 |
--certfile | n/a | 不适用 |
--charset=utf8 | n/a | 不支持 |
--chunk-names | --chunk-naming | 为了与 JS API 中的 naming 保持一致而重命名 |
--color | n/a | 始终启用 |
--drop | --drop | |
--entry-names | --entry-naming | 为了与 JS API 中的 naming 保持一致而重命名 |
--global-name | n/a | 不适用,Bun 目前不支持 iife 输出 |
--ignore-annotations | --ignore-dce-annotations | |
--inject | n/a | 不支持 |
--jsx | --jsx-runtime <runtime> | 支持 "automatic" (使用 jsx 转换)和 "classic" (使用 React.createElement ) |
--jsx-dev | n/a | Bun 从 tsconfig.json 读取 compilerOptions.jsx 以确定默认值。如果 compilerOptions.jsx 是 "react-jsx" ,或者如果 NODE_ENV=production ,Bun 将使用 jsx 转换。否则,它使用 jsxDEV 。对于任何 Bun 都使用 jsxDEV 。打包器不支持 preserve 。 |
--jsx-factory | --jsx-factory | |
--jsx-fragment | --jsx-fragment | |
--jsx-import-source | --jsx-import-source | |
--jsx-side-effects | n/a | JSX 始终被假定为无副作用 |
--keep-names | n/a | 不支持 |
--keyfile | n/a | 不适用 |
--legal-comments | n/a | 不支持 |
--log-level | n/a | 不支持。这可以在 bunfig.toml 中设置为 logLevel 。 |
--log-limit | n/a | 不支持 |
--log-override:X=Y | n/a | 不支持 |
--main-fields | n/a | 不支持 |
--mangle-cache | n/a | 不支持 |
--mangle-props | n/a | 不支持 |
--mangle-quoted | n/a | 不支持 |
--metafile | n/a | 不支持 |
--minify-whitespace | --minify-whitespace | |
--minify-identifiers | --minify-identifiers | |
--minify-syntax | --minify-syntax | |
--out-extension | n/a | 不支持 |
--outbase | --root | |
--preserve-symlinks | n/a | 不支持 |
--public-path | --public-path | |
--pure | n/a | 不支持 |
--reserve-props | n/a | 不支持 |
--resolve-extensions | n/a | 不支持 |
--servedir | n/a | 不适用 |
--source-root | n/a | 不支持 |
--sourcefile | n/a | 不支持。Bun 尚不支持 stdin 输入。 |
--sourcemap | --sourcemap | 无差异 |
--sources-content | n/a | 不支持 |
--supported | n/a | 不支持 |
--tree-shaking | n/a | 始终为 true |
--tsconfig | --tsconfig-override | |
--version | n/a | 运行 bun --version 查看 Bun 的版本。 |
JavaScript API
esbuild.build() | Bun.build() | |
---|---|---|
absWorkingDir | n/a | 始终设置为 process.cwd() |
alias | n/a | 不支持 |
allowOverwrite | n/a | 始终为 false |
|
| 使用与 esbuild 相同的模板语法,但
|
banner | n/a | 不支持 |
bundle | n/a | 始终为 true 。使用 Bun.Transpiler 进行转译而不打包。 |
charset | n/a | 不支持 |
|
| 使用与 esbuild 相同的模板语法,但
|
color | n/a | Bun 在构建结果的 logs 属性中返回日志。 |
conditions | n/a | 不支持。导出条件优先级由 target 确定。 |
define | define | |
drop | n/a | 不支持 |
|
| Bun 支持
|
entryPoints | entrypoints | 大小写差异 |
external | external | 无差异 |
footer | n/a | 不支持 |
format | format | 目前仅支持 "esm" 。计划支持 "cjs" 和 "iife" 。 |
globalName | n/a | 不支持 |
ignoreAnnotations | n/a | 不支持 |
inject | n/a | 不支持 |
jsx | jsx | JS API 中不支持,在 tsconfig.json 中配置 |
jsxDev | jsxDev | JS API 中不支持,在 tsconfig.json 中配置 |
jsxFactory | jsxFactory | JS API 中不支持,在 tsconfig.json 中配置 |
jsxFragment | jsxFragment | JS API 中不支持,在 tsconfig.json 中配置 |
jsxImportSource | jsxImportSource | JS API 中不支持,在 tsconfig.json 中配置 |
jsxSideEffects | jsxSideEffects | JS API 中不支持,在 tsconfig.json 中配置 |
keepNames | n/a | 不支持 |
legalComments | n/a | 不支持 |
loader | loader | Bun 支持的内置加载器集与 esbuild 不同;有关完整参考,请参阅 Bundler > Loaders。esbuild 加载器 dataurl 、binary 、base64 、copy 和 empty 尚未实现。 |
logLevel | n/a | 不支持 |
logLimit | n/a | 不支持 |
logOverride | n/a | 不支持 |
mainFields | n/a | 不支持 |
mangleCache | n/a | 不支持 |
mangleProps | n/a | 不支持 |
mangleQuoted | n/a | 不支持 |
metafile | n/a | 不支持 |
|
| 在 Bun 中,
|
minifyIdentifiers | minify.identifiers | 请参阅 minify |
minifySyntax | minify.syntax | 请参阅 minify |
minifyWhitespace | minify.whitespace | 请参阅 minify |
nodePaths | n/a | 不支持 |
outExtension | n/a | 不支持 |
outbase | root | 不同的名称 |
outdir | outdir | 无差异 |
outfile | outfile | 无差异 |
packages | n/a | 不支持,请使用 external |
platform | target | 支持 "bun" 、"node" 和 "browser" (默认值)。不支持 "neutral" 。 |
plugins | plugins | Bun 的插件 API 是 esbuild 的子集。一些 esbuild 插件可以直接与 Bun 一起使用。 |
preserveSymlinks | n/a | 不支持 |
publicPath | publicPath | 无差异 |
pure | n/a | 不支持 |
reserveProps | n/a | 不支持 |
resolveExtensions | n/a | 不支持 |
sourceRoot | n/a | 不支持 |
sourcemap | sourcemap | 支持 "inline" 、"external" 和 "none" |
sourcesContent | n/a | 不支持 |
splitting | splitting | 无差异 |
stdin | n/a | 不支持 |
supported | n/a | 不支持 |
target | n/a | 不支持语法降级 |
treeShaking | n/a | 始终为 true |
tsconfig | n/a | 不支持 |
write | n/a | 如果设置了 outdir /outfile ,则设置为 true ,否则为 false |
插件 API
Bun 的插件 API 旨在与 esbuild 兼容。Bun 不支持 esbuild 的整个插件 API 表面,但核心功能已实现。许多第三方 esbuild
插件可以直接与 Bun 一起使用。
长期来看,我们的目标是与 esbuild 的 API 实现功能对等,因此如果某些功能不起作用,请提交 issue 以帮助我们确定优先级。
Bun 和 esbuild 中的插件都使用 builder
对象定义。
import type { BunPlugin } from "bun";
const myPlugin: BunPlugin = {
name: "my-plugin",
setup(builder) {
// define plugin
},
};
builder
对象提供了一些方法来挂钩到打包过程的各个部分。Bun 实现了 onResolve
和 onLoad
;它尚未实现 esbuild 钩子 onStart
、onEnd
和 onDispose
,以及 resolve
实用程序。initialOptions
已部分实现,为只读,并且仅具有 esbuild 选项的子集;请改用 config
(相同的东西,但使用 Bun 的 BuildConfig
格式)。
import type { BunPlugin } from "bun";
const myPlugin: BunPlugin = {
name: "my-plugin",
setup(builder) {
builder.onResolve(
{
/* onResolve.options */
},
args => {
return {
/* onResolve.results */
};
},
);
builder.onLoad(
{
/* onLoad.options */
},
args => {
return {
/* onLoad.results */
};
},
);
},
};
onResolve
options
🟢 | filter |
---|---|
🟢 | namespace |
arguments
🟢 | path |
---|---|
🟢 | importer |
🔴 | namespace |
🔴 | resolveDir |
🔴 | kind |
🔴 | pluginData |
results
🟢 | namespace |
---|---|
🟢 | path |
🔴 | errors |
🔴 | external |
🔴 | pluginData |
🔴 | pluginName |
🔴 | sideEffects |
🔴 | suffix |
🔴 | warnings |
🔴 | watchDirs |
🔴 | watchFiles |
onLoad
options
🟢 | filter |
🟢 | namespace |
arguments
🟢 | path |
🔴 | namespace |
🔴 | suffix |
🔴 | pluginData |
results
🟢 | contents |
🟢 | loader |
🔴 | errors |
🔴 | pluginData |
🔴 | pluginName |
🔴 | resolveDir |
🔴 | warnings |
🔴 | watchDirs |
🔴 | watchFiles |