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 模式下运行文件,请使用 --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,使用找到的第一个:bashshzsh。在 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 遵循生命周期钩子。例如,如果定义了 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

过滤

在包含多个包的 monorepo 中,您可以使用 --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 标志,因此这主要适用于您希望堆大小增长更慢的情况。

解析顺序

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

CLI 用法

$bun run <file or script>

标志

执行

--silent
不要打印脚本命令
-b,--bun
强制脚本或包使用 Bun 的运行时而不是 Node.js(通过符号链接节点)
--watch
在文件更改时自动重启进程
--hot
在 Bun 运行时、测试运行器或 bundler 中启用自动重新加载
--no-clear-screen
当启用 --hot 或 --watch 时,禁用在重新加载时清除终端屏幕
-e,--eval=<val>
将参数评估为脚本
-p,--print=<val>
将参数评估为脚本并打印结果

包管理

--no-install
在 Bun 运行时禁用自动安装
--install=<val>
配置自动安装行为。“auto”(默认,当没有 node_modules 时自动安装)、“fallback”(仅缺少包)、“force”(始终)之一。
-i
在执行期间自动安装依赖项。等同于 --install=fallback。
--prefer-offline
跳过 Bun 运行时中包的陈旧性检查并从磁盘解析
--prefer-latest
在 Bun 运行时中使用包的最新匹配版本,始终检查 npm

调试

--inspect=<val>
激活 Bun 的调试器
--inspect-wait=<val>
激活 Bun 的调试器,在执行前等待连接
--inspect-brk=<val>
激活 Bun 的调试器,在代码第一行设置断点并等待

环境

--shell=<val>
控制用于 package.json 脚本的 shell。支持 'bun' 或 'system'。
--smol
使用更少的内存,但更频繁地运行垃圾回收
--expose-gc
在全局对象上公开 gc()。对 Bun.gc() 没有影响。
--no-deprecation
抑制所有自定义弃用报告。
--throw-deprecation
确定弃用警告是否会导致错误。
--title=<val>
设置进程标题
--zero-fill-buffers
布尔值,强制 Buffer.allocUnsafe(size) 填充为零。
--main-fields=<val>
在 package.json 中查找的主要字段。默认为 --target dependent。
--extension-order=<val>
默认为:.tsx,.ts,.jsx,.js,.json

配置

--if-present
如果入口点不存在,则无错误退出
--port=<val>
设置 Bun.serve 的默认端口
--conditions=<val>
传递自定义条件以解析
--fetch-preconnect=<val>
在代码加载时预连接到 URL
--max-http-header-size=<val>
设置 HTTP 标头的最大大小(以字节为单位)。默认为 16KiB。
--dns-result-order=<val>
设置 DNS 查找结果的默认顺序。有效顺序:verbatim(默认)、ipv4first、ipv6first
--tsconfig-override=<val>
指定自定义 tsconfig.json。默认 $cwd/tsconfig.json
-c,--config=<val>
指定 Bun 配置文件路径。默认 $cwd/bunfig.toml

过滤器和执行范围

--elide-lines=<val>
使用 --filter 时显示的脚本输出行数(默认:10)。设置为 0 以显示所有行。
-F,--filter=<val>
在与模式匹配的所有工作区包中运行脚本
-r,--preload=<val>
在加载其他模块之前导入模块

转译和捆绑

-d,--define=<val>
在解析时替换 K:V,例如 --define process.env.NODE_ENV:"development"。值解析为 JSON。
--drop=<val>
删除函数调用,例如 --drop=console 删除所有 console.* 调用。
-l,--loader=<val>
使用 .ext:loader 解析文件,例如 --loader .js:jsx。有效 loaders:js、jsx、ts、tsx、json、toml、text、file、wasm、napi
--no-macros
禁用在 bundler、转译器和运行时中执行宏
--jsx-factory=<val>
使用经典 JSX 运行时编译 JSX 元素时更改调用的函数
--jsx-fragment=<val>
更改编译 JSX 片段时调用的函数
--jsx-import-source=<val>
声明用于导入 jsx 和 jsxs 工厂函数的模块说明符。默认值:“react”。
--jsx-runtime=<val>
“automatic”(默认)或“classic”
--ignore-dce-annotations
忽略 tree-shaking 注释,例如 @__PURE__

环境变量

--env-file=<val>
从指定文件加载环境变量
--cwd=<val>
用于解析文件和入口点的绝对路径。这只会更改进程的 cwd。

帮助和错误

-h,--help
显示此菜单并退出
--verbose-error-trace
转储错误返回跟踪

其他选项

--breakpoint-print=<val>
调试模式:当打印包含此字符串的内容时设置断点

示例

运行 JavaScript 或 TypeScript 文件
bun run ./index.js
bun run ./index.tsx
运行 package.json 脚本
bun run dev
bun run lint
完整文档可在 https://bun.net.cn/docs/cli/run 找到。