Bun

bun run

bun CLI 可用于执行 JavaScript/TypeScript 文件、package.json 脚本和可执行包

性能

Bun 的设计宗旨是快速启动和快速运行。

Bun 在底层使用 Apple 为 Safari 开发的 JavaScriptCore 引擎。在大多数情况下,其启动和运行性能优于 Node.js 和基于 Chromium 的浏览器使用的 V8 引擎。它的转译器和运行时是用 Zig 编写的,Zig 是一种现代的高性能语言。在 Linux 上,这意味着启动时间比 Node.js 快 4 倍

bun hello.js5.2ms
node hello.js25.1ms
在 Linux 上运行一个简单的 Hello World 脚本

运行文件

node <file> 比较

使用 bun run 执行源文件。

bun run index.js

Bun 开箱即用支持 TypeScript 和 JSX。每个文件都由 Bun 快速的本地转译器在执行前即时转译。

bun run index.js
bun run index.jsx
bun run index.ts
bun run index.tsx

或者,您可以省略 run 关键字并使用“裸”命令;它们的行为完全相同。

bun index.tsx
bun index.js

--watch

要以观察模式运行文件,请使用 --watch 标志。

bun --watch run index.tsx

注意 — 使用 bun run 时,请将 --watch 等 Bun 标志紧跟在 bun 之后。

bun --watch run dev # ✔️ do this
bun run dev --watch # ❌ don't do this

出现在命令末尾的标志将被忽略并传递给 "dev" 脚本本身。

运行 package.json 脚本

npm run <script>yarn <script> 比较

bun [bun flags] run <script> [script flags]

您的 package.json 可以定义许多名为 "scripts" 的脚本,它们对应于 shell 命令。

{
  // ... other fields
  "scripts": {
    "clean": "rm -rf dist && echo 'Done.'",
    "dev": "bun server.ts"
  }
}

使用 bun run <script> 执行这些脚本。

bun run clean
 $ rm -rf dist && echo 'Done.'
 Cleaning...
 Done.

Bun 在子 shell 中执行脚本命令。在 Linux 和 macOS 上,它会按顺序检查以下 shell,并使用找到的第一个 shell:bashshzsh。在 Windows 上,它使用 bun shell 来支持类似 bash 的语法和许多常用命令。

⚡️ npm run 在 Linux 上的启动时间大约是 170 毫秒;使用 Bun 则是 6 毫秒

脚本也可以使用更短的命令 bun <script> 运行,但是如果存在同名的内置 bun 命令,则内置命令优先。在这种情况下,使用更明确的 bun run <script> 命令来执行您的包脚本。

bun run dev

要查看可用脚本列表,请不带任何参数运行 bun run

bun run
quickstart scripts:

 bun run clean
   rm -rf dist && echo 'Done.'

 bun run dev
   bun server.ts

2 scripts

Bun 遵守生命周期钩子。例如,bun run clean 将执行 precleanpostclean(如果已定义)。如果 pre<script> 失败,Bun 将不会执行脚本本身。

--bun

package.json 脚本通常会引用本地安装的 CLI,例如 vitenext。这些 CLI 通常是标记有 shebang 的 JavaScript 文件,以指示它们应使用 node 执行。

#!/usr/bin/env node

// do stuff

默认情况下,Bun 遵守此 shebang 并使用 node 执行脚本。但是,您可以使用 --bun 标志覆盖此行为。对于基于 Node.js 的 CLI,这将使用 Bun 而不是 Node.js 运行 CLI。

bun run --bun vite

--no-addons

禁用原生插件并使用 node-addons 导出条件。

bun --no-addons run server.js

过滤

在包含多个包的 monorepo 中,您可以使用 --filter 参数一次性执行多个包中的脚本。

使用 bun run --filter <name_pattern> <script> 在所有名称与 <name_pattern> 匹配的包中执行 <script> 例如,如果您有包含名为 foobarbaz 的包的子目录,运行

bun run --filter 'ba*' <script>

将执行 <script>barbaz 中,但在 foo 中不执行。

有关更多详细信息,请参阅 filter 文档页面。

--workspaces

在 monorepo 的所有工作区中运行脚本

bun run --workspaces test

bun run - 从 stdin 管道代码

bun run - 允许您从 stdin 读取 JavaScript、TypeScript、TSX 或 JSX 并执行,而无需先写入临时文件。

echo "console.log('Hello')" | bun run -
Hello

您还可以使用 bun run - 将文件重定向到 Bun。例如,将 .js 文件作为 .ts 文件运行

echo "console.log!('This is TypeScript!' as any)" > secretly-typescript.js
bun run - < secretly-typescript.js
This is TypeScript!

为方便起见,使用 bun run - 时,所有代码都被视为支持 JSX 的 TypeScript。

bun run --console-depth

使用 --console-depth 标志控制控制台输出中对象检查的深度。

bun --console-depth 5 run index.tsx

这设置了 console.log() 输出中嵌套对象的显示深度。默认深度为 2。更高的值会显示更多嵌套属性,但对于复杂对象可能会产生冗长的输出。

const nested = { a: { b: { c: { d: "deep" } } } };
console.log(nested);
// With --console-depth 2 (default): { a: { b: [Object] } }
// With --console-depth 4: { a: { b: { c: { d: 'deep' } } } }

bun run --smol

在内存受限的环境中,使用 --smol 标志可以减少内存使用,但会牺牲性能。

bun --smol run index.tsx

这会导致垃圾回收器更频繁地运行,这会减慢执行速度。但是,这在内存有限的环境中很有用。Bun 会根据可用内存(考虑 cgroups 和其他内存限制)自动调整垃圾回收器的堆大小,无论是否使用 --smol 标志,因此这主要适用于您希望堆大小增长更慢的情况。

--user-agent

--user-agent <string> - 为所有 fetch() 请求设置 User-Agent 标头

bun --user-agent "MyBot/1.0" run index.tsx

解析顺序

绝对路径和以 ./.\\ 开头的路径始终作为源文件执行。除非使用 bun run,否则运行具有允许扩展名的文件将优先于 package.json 脚本。

当 package.json 脚本和同名文件同时存在时,bun run 优先执行 package.json 脚本。完整的解析顺序是

  1. package.json 脚本,例如 bun run build
  2. 源文件,例如 bun run src/main.js
  3. 项目包中的二进制文件,例如 bun add eslint && bun run eslint
  4. (仅限 bun run)系统命令,例如 bun run ls

--unhandled-rejections

配置如何处理未处理的 Promise 拒绝

bun --unhandled-rejections=throw script.js  # Throw exception (terminate immediately)
bun --unhandled-rejections=strict script.js # Throw exception (emit rejectionHandled if handled later)
bun --unhandled-rejections=warn script.js   # Print warning to stderr (default in Node.js)
bun --unhandled-rejections=none script.js   # Silently ignore

CLI 用法

$bun run <文件或脚本>

Flags

通用执行选项

--silent
不打印脚本命令
--if-present
如果入口点不存在,则不带错误退出
-e,--eval=<val>
将参数作为脚本评估
-p,--print=<val>
将参数作为脚本评估并打印结果
-h,--help
显示此菜单并退出

工作区管理

--elide-lines=<val>
使用 --filter 时显示的脚本输出行数(默认值:10)。设置为 0 以显示所有行。
-F,--filter=<val>
在所有与模式匹配的工作区包中运行脚本
--workspaces
在所有工作区包中运行脚本(来自 package.json 中的 "workspaces" 字段)

运行时与进程控制

-b,--bun
强制脚本或包使用 Bun 的运行时而不是 Node.js(通过符号链接 node)
--shell=<val>
控制 package.json 脚本使用的 shell。支持 'bun' 或 'system'
--smol
减少内存使用,但更频繁地运行垃圾回收
--expose-gc
在全局对象上公开 gc()。对 Bun.gc() 没有影响。
--no-deprecation
抑制所有自定义弃用报告。
--throw-deprecation
确定弃用警告是否会导致错误。
--title=<val>
设置进程标题
--zero-fill-buffers
布尔值,强制 Buffer.allocUnsafe(size) 归零。
--no-addons
如果调用 process.dlopen,则抛出错误,并禁用导出条件 "node-addons"
--unhandled-rejections=<val>
"strict"、"throw"、"warn"、"none" 或 "warn-with-error-code" 之一
--console-depth=<val>
设置 console.log 对象检查的默认深度(默认值:2)

开发工作流

--watch
文件更改时自动重启进程
--hot
在 Bun 运行时、测试运行器或打包器中启用自动重载
--no-clear-screen
当启用 --hot 或 --watch 时,禁用重载时清除终端屏幕

调试

--inspect=<val>
激活 Bun 的调试器
--inspect-wait=<val>
激活 Bun 的调试器,等待连接后执行
--inspect-brk=<val>
激活 Bun 的调试器,在代码第一行设置断点并等待

依赖项与模块解析

-r,--preload=<val>
在加载其他模块之前导入模块
--require=<val>
--preload 的别名,用于 Node.js 兼容性
--import=<val>
--preload 的别名,用于 Node.js 兼容性
--no-install
禁用 Bun 运行时中的自动安装
--install=<val>
配置自动安装行为。可以是 "auto"(默认,没有 node_modules 时自动安装)、"fallback"(仅缺少包时安装)、"force"(始终安装)。
-i
执行期间自动安装依赖项。等同于 --install=fallback。
--prefer-offline
跳过 Bun 运行时中包的陈旧性检查,并从磁盘解析
--prefer-latest
使用 Bun 运行时中匹配包的最新版本,始终检查 npm
--conditions=<val>
传递自定义条件以解析
--main-fields=<val>
在 package.json 中查找的主要字段。默认为 --target 相关
--preserve-symlinks
解析文件时保留符号链接
--preserve-symlinks-main
解析主入口点时保留符号链接
--extension-order=<val>
默认为:.tsx,.ts,.jsx,.js,.json

转译与语言特性

--tsconfig-override=<val>
指定自定义 tsconfig.json。默认 <d>$cwd<r>/tsconfig.json
-d,--define=<val>
在解析时替换 K:V,例如 --define process.env.NODE_ENV:"development"。值被解析为 JSON。
--drop=<val>
删除函数调用,例如 --drop=console 删除所有 console.* 调用。
-l,--loader=<val>
使用 .ext:loader 解析文件,例如 --loader .js:jsx。有效加载器:js, jsx, ts, tsx, json, toml, text, file, wasm, napi
--no-macros
禁用在打包器、转译器和运行时中执行宏
--jsx-factory=<val>
更改使用经典 JSX 运行时编译 JSX 元素时调用的函数
--jsx-fragment=<val>
更改编译 JSX 片段时调用的函数
--jsx-import-source=<val>
声明用于导入 jsx 和 jsxs 工厂函数的模块说明符。默认值:"react"
--jsx-runtime=<val>
"automatic"(默认)或 "classic"
--jsx-side-effects
将 JSX 元素视为具有副作用(禁用纯注释)
--ignore-dce-annotations
忽略摇树注释,例如 @__PURE__

网络与安全

--port=<val>
设置 Bun.serve 的默认端口
--fetch-preconnect=<val>
在代码加载时预连接到 URL
--max-http-header-size=<val>
设置 HTTP 头的最大大小(以字节为单位)。默认值是 16KiB
--dns-result-order=<val>
设置 DNS 查找结果的默认顺序。有效顺序:verbatim(默认)、ipv4first、ipv6first
--use-system-ca
使用系统的受信任证书颁发机构
--use-openssl-ca
使用 OpenSSL 的默认 CA 存储
--use-bundled-ca
使用捆绑的 CA 存储
--redis-preconnect
启动时预连接到 $REDIS_URL
--sql-preconnect
启动时预连接到 PostgreSQL
--user-agent=<val>
设置 HTTP 请求的默认 User-Agent 标头

通用配置

--env-file=<val>
从指定文件加载环境变量
--cwd=<val>
从何处解析文件和入口点的绝对路径。这只会更改进程的当前工作目录。
-c,--config=<val>
指定 Bun 配置文件路径。默认 <d>$cwd<r>/bunfig.toml

Examples

运行 JavaScript 或 TypeScript 文件
bun run ./index.js
bun run ./index.tsx
运行 package.json 脚本
bun run dev
bun run lint
完整文档可在 https://bun.net.cn/docs/cli/run 查看