bun
CLI 可用于执行 JavaScript/TypeScript 文件、package.json
脚本和 可执行包。
性能
Bun 旨在快速启动和快速运行。
Bun 在底层使用 JavaScriptCore 引擎,该引擎由 Apple 为 Safari 开发。在大多数情况下,启动和运行性能都比 V8(Node.js 和基于 Chromium 的浏览器使用的引擎)更快。它的转换器和运行时是用 Zig 编写的,Zig 是一种现代的高性能语言。在 Linux 上,这转化为 比 Node.js 快 4 倍 的启动时间。
bun hello.js | 5.2ms |
node hello.js | 25.1ms |
运行文件
与 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:bash
、sh
、zsh
。
⚡️ 在 Linux 上,npm run
的启动时间约为 170 毫秒;而 Bun 的启动时间为 6 毫秒
。
如果 package.json
脚本名称与内置 bun
命令(install
、dev
、upgrade
等)发生名称冲突,则 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 遵守生命周期钩子。例如,如果定义了 preclean
和 postclean
,则 bun run clean
将执行它们。如果 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
过滤
在包含多个包的单一存储库中,你可以使用 --filter
参数一次在多个包中执行脚本。
使用 bun run --filter <name_pattern> <script>
在名称与 <name_pattern>
匹配的所有包中执行 <script>
。 例如,如果你有包含名为 foo
、bar
和 baz
的包的子目录,则运行
bun run --filter 'ba*' <script>
将在 bar
和 baz
中执行 <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
标志,因此这主要适用于您希望使堆大小增长更慢的情况。