bun CLI 可用于执行 JavaScript/TypeScript 文件、package.json 脚本和可执行包。
性能
Bun 的设计宗旨是快速启动和快速运行。
Bun 在底层使用 Apple 为 Safari 开发的 JavaScriptCore 引擎。在大多数情况下,其启动和运行性能优于 Node.js 和基于 Chromium 的浏览器使用的 V8 引擎。它的转译器和运行时是用 Zig 编写的,Zig 是一种现代的高性能语言。在 Linux 上,这意味着启动时间比 Node.js 快 4 倍。
bun hello.js | 5.2ms |
node hello.js | 25.1ms |
运行文件
与 node <file> 比较
使用 bun run 执行源文件。
bun run index.jsBun 开箱即用支持 TypeScript 和 JSX。每个文件都由 Bun 快速的本地转译器在执行前即时转译。
bun run index.jsbun run index.jsxbun run index.tsbun run index.tsx或者,您可以省略 run 关键字并使用“裸”命令;它们的行为完全相同。
bun index.tsxbun index.js--watch
要以观察模式运行文件,请使用 --watch 标志。
bun --watch run index.tsx注意 — 使用 bun run 时,请将 --watch 等 Bun 标志紧跟在 bun 之后。
bun --watch run dev # ✔️ do thisbun 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:bash、sh、zsh。在 Windows 上,它使用 bun shell 来支持类似 bash 的语法和许多常用命令。
⚡️ npm run 在 Linux 上的启动时间大约是 170 毫秒;使用 Bun 则是 6 毫秒。
脚本也可以使用更短的命令 bun <script> 运行,但是如果存在同名的内置 bun 命令,则内置命令优先。在这种情况下,使用更明确的 bun run <script> 命令来执行您的包脚本。
bun run dev要查看可用脚本列表,请不带任何参数运行 bun run。
bun runquickstart scripts:
bun run clean
rm -rf dist && echo 'Done.'
bun run dev
bun server.ts
2 scriptsBun 遵守生命周期钩子。例如,bun run clean 将执行 preclean 和 postclean(如果已定义)。如果 pre<script> 失败,Bun 将不会执行脚本本身。
--bun
package.json 脚本通常会引用本地安装的 CLI,例如 vite 或 next。这些 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>。 例如,如果您有包含名为 foo、bar 和 baz 的包的子目录,运行
bun run --filter 'ba*' <script>
将执行 <script> 在 bar 和 baz 中,但在 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.jsbun run - < secretly-typescript.jsThis 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 脚本。完整的解析顺序是
- package.json 脚本,例如
bun run build - 源文件,例如
bun run src/main.js - 项目包中的二进制文件,例如
bun add eslint && bun run eslint - (仅限
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