Skip to content

import Run from "/snippets/cli/run.mdx";

Bun 运行时旨在快速启动和快速运行。

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

命令时间
bun hello.js5.2ms
node hello.js25.1ms

此基准测试基于在 Linux 上运行简单的 Hello World 脚本。

运行文件

使用 bun run 执行源文件。

bash
bun run index.js

Bun 开箱即用支持 TypeScript 和 JSX。每个文件在 Bun 执行之前都会通过 Bun 的快速原生转译器即时转译。

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

或者,你可以省略 run 关键字并使用"裸"命令;它表现相同。

bash
bun index.tsx
bun index.js

--watch

要在监视模式下运行文件,使用 --watch 标志。

bash
bun --watch run index.tsx

::: note 使用 bun run 时,将 --watch 等 Bun 标志放在 bun 之后。 :::

bash
bun --watch run dev # ✔️ 这样做
bun run dev --watch # ❌ 不要这样做

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

运行 package.json 脚本

::: note 与 npm run <script>yarn <script> 比较 :::

sh
bun [bun 标志] run <script> [脚本标志]

你的 package.json 可以定义多个对应 shell 命令的命名 "scripts"

json
{
  // ... 其他字段
  "scripts": {
    "clean": "rm -rf dist && echo 'Done.'",
    "dev": "bun server.ts"
  }
}

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

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

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

NOTE

⚡️ 在 Linux 上 `npm run` 的启动时间大约为 170ms;使用 Bun 时为 `6ms`。

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

bash
bun run dev

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

bash
bun run
txt
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 执行。

js
#!/usr/bin/env node

// do stuff

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

bash
bun run --bun vite

过滤

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

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

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

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

filter 文档页面中查找更多详细信息。

bun run - 从 stdin 管道代码

bun run - 让你可以从 stdin 读取 JavaScript、TypeScript、TSX 或 JSX 并执行它,而无需先写入临时文件。

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

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

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

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

bun run --console-depth

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

bash
bun --console-depth 5 run index.tsx

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

ts
const nested = { a: { b: { c: { d: "deep" } } } };
console.log(nested);
// 使用 --console-depth 2(默认):{ a: { b: [Object] } }
// 使用 --console-depth 4:{ a: { b: { c: { d: 'deep' } } } }

bun run --smol

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

bash
bun --smol run index.tsx

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

解析顺序

绝对路径和以 ./.\\ 开头的路径始终作为源文件执行。除非使用 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

Bun学习网由www.bunjs.com.cn整理维护