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 模式下运行文件,请使用 --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 中执行脚本命令。在 Linux 和 macOS 上,它按顺序检查以下 shell,使用找到的第一个:bash
、sh
、zsh
。在 Windows 上,它使用 bun shell 来支持类似 bash 的语法和许多常用命令。
⚡️ 在 Linux 上,npm run
的启动时间约为 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 遵循生命周期钩子。例如,如果定义了 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
过滤
在包含多个包的 monorepo 中,您可以使用 --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
标志,因此这主要适用于您希望堆大小增长更慢的情况。
解析顺序
绝对路径和以 ./
或 .\\
开头的路径始终作为源文件执行。除非使用 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