Bun 的打包器 API 主要受 esbuild 启发。从 esbuild 迁移到 Bun 的打包器应该相对轻松。本指南将简要解释为什么你可能考虑迁移到 Bun 的打包器,并为已经熟悉 esbuild API 的人提供一个并排的 API 比较参考。
需要注意一些行为差异。
- 默认情况下进行打包。与 esbuild 不同,Bun 始终默认进行打包。这就是为什么 Bun 示例中不需要
--bundle
标志。要单独转换每个文件,请使用Bun.Transpiler
。 - 它只是一个打包器。与 esbuild 不同,Bun 的打包器不包含内置开发服务器或文件监视器。它只是一个打包器。打包器旨在与
Bun.serve
和其他运行时 API 结合使用,以实现相同的效果。因此,所有与 HTTP/文件监视相关的选项均不适用。
性能
Bun 的捆绑器结合了注重性能的 API 和经过广泛优化的基于 Zig 的 JS/TS 解析器,在 esbuild 的 three.js 基准测试 中比 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" ,但计划支持其他模块格式。esbuild 默认使用 "iife" 。 |
|
| Bun 支持与 esbuild 不同的内置加载器集;请参阅 捆绑器 > 加载器 以获取完整参考。esbuild 加载器
|
--minify | --minify | 无差异 |
--outdir | --outdir | 无差异 |
--outfile | --outfile | |
--packages | n/a | 不受支持 |
--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 | n/a | 不受支持 |
--certfile | n/a | 不适用 |
--charset=utf8 | n/a | 不受支持 |
--chunk-names | --chunk-naming | 为与 JS API 中的 naming 保持一致而重命名 |
--color | n/a | 始终启用 |
--drop | n/a | 不受支持 |
--entry-names | --entry-naming | 为与 JS API 中的 naming 保持一致而重命名 |
--footer | n/a | 不受支持 |
--global-name | n/a | 不适用,Bun 目前不支持 iife 输出 |
--ignore-annotations | n/a | 不受支持 |
--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 。bundler 不支持 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 | 无差异 |
页脚 | n/a | 不受支持 |
格式 | 格式 | 目前仅支持 "esm" 。计划支持 "cjs" 和 "iife" 。 |
全局名称 | n/a | 不受支持 |
忽略注释 | n/a | 不受支持 |
注入 | n/a | 不受支持 |
JSX | JSX | JS API 不支持,在 tsconfig.json 中配置 |
JSX 开发 | JSX 开发 | JS API 不支持,在 tsconfig.json 中配置 |
JSX 工厂 | JSX 工厂 | JS API 不支持,在 tsconfig.json 中配置 |
JSX 片段 | JSX 片段 | JS API 不支持,在 tsconfig.json 中配置 |
JSX 导入源 | JSX 导入源 | JS API 不支持,在 tsconfig.json 中配置 |
JSX 副作用 | JSX 副作用 | JS API 不支持,在 tsconfig.json 中配置 |
保留名称 | n/a | 不受支持 |
合法注释 | n/a | 不受支持 |
加载器 | 加载器 | Bun 支持与 esbuild 不同的内置加载器集;请参阅 捆绑器 > 加载器 以获取完整参考。esbuild 加载器 dataurl 、binary 、base64 、copy 和 empty 尚未实现。 |
日志级别 | n/a | 不受支持 |
日志限制 | n/a | 不受支持 |
日志覆盖 | n/a | 不受支持 |
主字段 | n/a | 不受支持 |
混淆缓存 | n/a | 不受支持 |
混淆属性 | n/a | 不受支持 |
混淆引号 | n/a | 不受支持 |
元文件 | n/a | 不受支持 |
|
| 在 Bun 中,
|
最小化标识符 | minify.identifiers | 参见 minify |
最小化语法 | minify.syntax | 参见 minify |
最小化空白 | minify.whitespace | 参见 minify |
节点路径 | n/a | 不受支持 |
输出扩展名 | n/a | 不受支持 |
输出基础 | 根 | 名称不同 |
输出目录 | 输出目录 | 无差异 |
输出文件 | 输出文件 | 无差异 |
包 | n/a | 不支持,使用 external |
平台 | 目标 | 支持 "bun" 、"node" 和 "browser" (默认)。不支持 "neutral" 。 |
插件 | 插件 | Bun 的插件 API 是 esbuild 的一个子集。一些 esbuild 插件可以与 Bun 一起开箱即用。 |
保留符号链接 | n/a | 不受支持 |
公共路径 | 公共路径 | 无差异 |
纯 | n/a | 不受支持 |
保留属性 | n/a | 不受支持 |
解析扩展名 | n/a | 不受支持 |
源根 | n/a | 不受支持 |
源映射 | 源映射 | 支持 "inline" 、"external" 和 "none" |
源内容 | n/a | 不受支持 |
拆分 | 拆分 | 无差异 |
标准输入 | n/a | 不受支持 |
支持 | n/a | 不受支持 |
目标 | n/a | 不支持语法降级 |
摇树 | n/a | 始终为 true |
tsconfig | n/a | 不受支持 |
写入 | n/a | 如果设置了 outdir /outfile ,则设置为 true ,否则设置为 false |
插件 API
Bun 的插件 API 旨在与 esbuild 兼容。Bun 不支持 esbuild 的整个插件 API 表面,但实现了核心功能。许多第三方 esbuild
插件可以与 Bun 一起开箱即用。
从长远来看,我们的目标是与 esbuild 的 API 实现功能对等,因此如果某些功能不起作用,请提交一个问题以帮助我们确定优先级。
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
选项
🟢 | 过滤器 |
---|---|
🟢 | 命名空间 |
参数
🟢 | 路径 |
---|---|
🟢 | 导入者 |
🔴 | 命名空间 |
🔴 | 解析目录 |
🔴 | 类型 |
🔴 | 插件数据 |
结果
🟢 | 命名空间 |
---|---|
🟢 | 路径 |
🔴 | 错误 |
🔴 | external |
🔴 | 插件数据 |
🔴 | 插件名称 |
🔴 | 副作用 |
🔴 | 后缀 |
🔴 | 警告 |
🔴 | 监视目录 |
🔴 | 监视文件 |
onLoad
选项
🟢 | 过滤器 |
🟢 | 命名空间 |
参数
🟢 | 路径 |
🔴 | 命名空间 |
🔴 | 后缀 |
🔴 | 插件数据 |
结果
🟢 | 内容 |
🟢 | 加载器 |
🔴 | 错误 |
🔴 | 插件数据 |
🔴 | 插件名称 |
🔴 | 解析目录 |
🔴 | 警告 |
🔴 | 监视目录 |
🔴 | 监视文件 |