--compile 标志,用于从 TypeScript 或 JavaScript 文件生成独立的二进制文件。
- CLI
- JavaScript
terminal
cli.ts
cli.ts 打包成一个你可以直接运行的可执行文件:
terminal
交叉编译到其他平台
使用--target 标志将你的独立可执行文件编译为与你运行 bun build 的机器不同的操作系统、架构或 Bun 版本。
要为 Linux x64(大多数服务器)构建:
- CLI
- JavaScript
terminal
- CLI
- JavaScript
terminal
- CLI
- JavaScript
terminal
- CLI
- JavaScript
terminal
- CLI
- JavaScript
terminal
- CLI
- JavaScript
terminal
支持的目标平台
--target 值的各段可以用任何顺序出现,只要它们由 - 分隔即可。
构建时常量
使用--define 标志将构建时常量注入到你的可执行文件中,例如版本号、构建时间戳或配置值:
- CLI
- JavaScript
terminal
更多示例和模式,请参见构建时常量指南。
部署到生产环境
编译后的可执行文件减少了内存使用并改善了 Bun 的启动时间。 通常,Bun 在import 和 require 时读取并转译 JavaScript 和 TypeScript 文件。这是 Bun 许多功能”开箱即用”的原因之一,但并非免费:从磁盘读取文件、解析路径、解析、转译和打印源代码都会消耗时间和内存。
编译后的可执行文件将这些成本从运行时转移到了构建时。
部署到生产环境时,我们建议:
- CLI
- JavaScript
terminal
字节码编译
为了改善启动时间,启用字节码编译:- CLI
- JavaScript
terminal
tsc 启动快 2 倍:
bun build 命令稍微慢一点。它不会混淆源代码。
与
--compile 一起使用时,字节码编译同时支持 cjs 和 esm 格式。这些标志做了什么?
--minify 参数减少转译后输出代码的大小。对于大型应用,这可以节省数兆字节的空间。对于较小的应用,它可能仍然能略微改善启动时间。
--sourcemap 参数嵌入一个用 zstd 压缩的 sourcemap,这样错误和堆栈跟踪指向原始位置而不是转译后的位置。Bun 在发生错误时自动解压缩并解析 sourcemap。
--bytecode 参数启用字节码编译。每次你在 Bun 中运行 JavaScript 代码时,JavaScriptCore(引擎)都会将你的源代码编译为字节码。--bytecode 将该解析工作从运行时转移到打包时,从而缩短启动时间。
嵌入运行时参数
--compile-exec-argv="args" - 嵌入运行时参数,在运行时可通过 process.execArgv 获取:
- CLI
- JavaScript
terminal
app.ts
通过 BUN_OPTIONS 传递运行时参数
独立可执行文件会读取 BUN_OPTIONS 环境变量,因此你可以传递运行时标志而无需重新编译:
terminal
自动配置加载
独立可执行文件可以自动从运行目录加载配置文件。默认情况下:tsconfig.json和package.json加载已禁用——这些通常只在开发时需要,打包器在编译时已经使用了它们.env和bunfig.toml加载已启用——这些通常包含可能因部署而异的运行时配置
在未来的 Bun 版本中,
.env 和 bunfig.toml 可能也会默认禁用,以实现更确定的行为。在运行时启用配置加载
如果你的可执行文件需要在运行时读取tsconfig.json 或 package.json,使用这些标志选择加入:
terminal
在运行时禁用配置加载
要禁用.env 或 bunfig.toml 加载以实现确定性执行:
- CLI
- JavaScript
terminal
作为 Bun CLI 运行
Bun v1.2.16 新增
BUN_BE_BUN=1 环境变量,使独立可执行文件像 bun CLI 本身一样运行。可执行文件会忽略其打包的入口点,而是暴露完整的 bun CLI。
例如,考虑从这个脚本编译的可执行文件:
terminal
./such-bun 时会带参数执行脚本。
terminal
BUN_BE_BUN=1 环境变量时,它就像 bun 二进制文件一样运行:
terminal
全栈可执行文件
Bun v1.2.17 新增
--compile 标志可以创建一个包含服务器和客户端代码的独立可执行文件,适用于全栈应用程序。当你在服务器代码中导入 HTML 文件时,Bun 会打包前端资源(JavaScript、CSS 等)并将其嵌入到可执行文件中。
- CLI
- JavaScript
terminal
- 你的服务器代码
- Bun 运行时
- 所有前端资源(HTML、CSS、JavaScript)
- 服务器使用的任何 npm 包
terminal
Bun.serve 使用它来提供预打包的资源。
有关构建全栈应用的更多信息,请参阅全栈指南。
Worker
要在独立可执行文件中使用 worker,将 worker 的入口点添加到构建中:- CLI
- JavaScript
terminal
index.ts
new Worker(path) 中静态已知的路径并自动打包它们,但目前你需要将 worker 文件列为入口点,如上例所示。
如果你使用相对路径引用未包含在独立可执行文件中的文件,Bun 会相对于进程当前工作目录从磁盘加载该路径,如果文件不存在则会报错。
SQLite
你可以将bun:sqlite 导入与 bun build --compile 一起使用。
默认情况下,数据库相对于进程的当前工作目录进行解析。
index.ts
/usr/bin/hello 而用户终端在 /home/me/Desktop,Bun 会在 /home/me/Desktop/my.db 中查找。
terminal
嵌入资源与文件
独立可执行文件可以将文件直接嵌入到二进制文件中,因此单个可执行文件可以携带你的应用所需的图片、JSON 配置、模板或任何其他资源。工作原理
使用with { type: "file" } 导入属性来嵌入文件:
index.ts
- 读取文件内容
- 将数据嵌入到可执行文件中
- 将导入替换为内部路径(以
/$bunfs/为前缀)
Bun.file() 或 Node.js fs API 读取这个嵌入的文件。
使用 Bun.file() 读取嵌入文件
Bun.file() 是读取嵌入文件的推荐方式:
index.ts
使用 Node.js fs 读取嵌入文件
嵌入文件与 Node.js 文件系统 API 兼容:index.ts
实用示例
嵌入 JSON 配置文件
index.ts
在 HTTP 服务器中提供静态资源
在Bun.serve() 中使用 static 路由实现高效的静态文件服务:
server.ts
嵌入模板
index.ts
嵌入二进制文件
index.ts
嵌入 SQLite 数据库
要将 SQLite 数据库嵌入到编译后的可执行文件中,在导入属性中设置type: "sqlite" 并将 embed 属性设置为 "true"。
数据库文件必须已经在磁盘上存在。然后,在你的代码中导入它:
index.ts
terminal
运行
bun build --compile 时,数据库文件必须存在于磁盘上。embed: "true" 属性告诉打包器将数据库内容包含在编译后的可执行文件中。当正常使用 bun run 运行时,数据库文件就像常规的 SQLite 导入一样从磁盘加载。嵌入 N-API 插件
你可以将.node 文件嵌入到可执行文件中。
index.ts
@mapbox/node-pre-gyp 或类似工具,.node 文件必须被直接 require,否则无法正确打包。
嵌入目录
要使用bun build --compile 嵌入目录,在构建中包含文件模式:
- CLI
- JavaScript
terminal
index.ts
在运行时检测独立模式
使用Bun.isStandaloneExecutable 检查当前进程是否从编译后的二进制文件运行:
index.ts
Bun.embeddedFiles.length > 0 不同,此检查不会为每个嵌入文件分配 Blob 对象,因此在嵌入大量资源的二进制文件中,在启动时调用是安全的。
列出嵌入文件
Bun.embeddedFiles 将所有嵌入文件作为 Blob 对象暴露:
index.ts
Bun.embeddedFiles 中的每一项都是一个带有 name 属性的 Blob:
static 路由提供每个嵌入资源:
server.ts
Bun.embeddedFiles 排除打包的源代码(.ts、.js 等),以帮助保护你的应用源码。内容哈希
默认情况下,嵌入文件的名称会附加一个内容哈希,这有助于在通过 URL 或 CDN 提供时进行缓存失效。要保留原始名称,请配置资源命名:- CLI
- JavaScript
terminal
压缩
要缩减可执行文件的大小,启用压缩:- CLI
- JavaScript
terminal
Windows 专用标志
在 Windows 上编译独立可执行文件时,平台特定的选项可以自定义生成的.exe 文件的元数据:
- CLI
- JavaScript
terminal
icon- 可执行文件图标的.ico文件路径hideConsole- 禁用后台终端(用于 GUI 应用)title- 文件属性中的应用程序标题publisher- 文件属性中的发布者名称version- 文件属性中的版本字符串description- 文件属性中的描述copyright- 文件属性中的版权声明
macOS 上的代码签名
要在 macOS 上对独立可执行文件进行代码签名(修复 Gatekeeper 警告),使用codesign 命令。
terminal
entitlements.plist 文件。
info.plist
--entitlements 标志传递给 codesign。
terminal
terminal
代码分割
独立可执行文件支持代码分割。使用--compile 和 --splitting 创建一个可执行文件,在运行时加载代码分割的块。
- CLI
- JavaScript
terminal
异步插件
你可以在Bun.build({ plugins }) 中使用插件和 --compile。这使你可以在构建时应用自定义转换。
build.ts
cli.ts
不支持的 CLI 参数
--compile 标志不支持以下参数:
--outdir—— 改用outfile。--public-path--target=node--target=browser(不带 HTML 入口点——请参阅独立 HTML 了解带.html文件的--compile --target=browser)--no-bundle——Bun 总是将所有内容打包到可执行文件中。
API 参考
Bun.build() 中的 compile 选项接受三种形式:
types
支持的目标
Bun.Build.CompileTarget
完整示例
build.ts