Bun

bun run

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

性能

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

Bun 在底层使用 JavaScriptCore 引擎,该引擎由 Apple 为 Safari 开发。在大多数情况下,启动和运行性能都比 V8(Node.js 和基于 Chromium 的浏览器使用的引擎)更快。它的转换器和运行时是用 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 时,将 Bun 标志(如 --watch)放在 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 可以定义许多对应于 shell 命令的命名 "scripts"

{
  // ... 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 中执行脚本命令。它按顺序检查以下 shell,并使用找到的第一个 shell:bashshzsh

⚡️ 在 Linux 上,npm run 的启动时间约为 170 毫秒;而 Bun 的启动时间为 6 毫秒

如果 package.json 脚本名称与内置 bun 命令(installdevupgrade 等)发生名称冲突,则 Bun 的内置命令优先。在这种情况下,使用更明确的 bun run 命令来执行包脚本。

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 遵守生命周期钩子。例如,如果定义了 precleanpostclean,则 bun run clean 将执行它们。如果 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

过滤

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

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

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

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

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

bun run - 从标准输入中管道代码

bun run - 允许您从标准输入中读取 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 --smol

在内存受限的环境中,使用 --smol 标志以牺牲性能为代价来减少内存使用。

bun --smol run index.tsx

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