调试 JavaScript 和 TypeScript
server.ts
--inspect
要在运行 Bun 代码时启用调试,请使用 --inspect 标志。这会在可用端口上启动一个 WebSocket 服务器,用于检查正在运行的 Bun 进程。
terminal
--inspect-brk
--inspect-brk 标志与 --inspect 行为完全相同,只是它会在执行的脚本的第一行注入一个断点。用于调试那些运行速度快且立即退出的脚本。
--inspect-wait
--inspect-wait 标志与 --inspect 行为完全相同,只是代码在调试器附加到运行进程之前不会执行。
为调试器设置端口或 URL
无论使用哪个标志,你都可以指定端口号、URL 前缀或两者。terminal
调试器
多种调试工具可以连接到该服务器。debug.bun.sh
Bun 在 debug.bun.sh 上托管了一个基于 Web 的调试器。它是 WebKit 的 Web Inspector Interface 的修改版本,对 Safari 用户来说很熟悉。
在浏览器中打开提供的 debug.bun.sh URL 以启动调试会话。在这个界面中,你可以查看运行文件的源代码、查看和设置断点,以及使用内置控制台执行代码。
3,在 console.log(req.url) 语句上设置断点。
http://localhost:3000。页面永远不会完成加载,因为程序已在断点处暂停。
注意 UI 的变化。
req)以查看其属性和方法。
- 继续脚本执行 — 运行到下一个断点或异常。
- 单步跳过 — 前进到下一行。
- 单步进入 — 如果当前语句包含函数调用,则进入被调用的函数。
- 单步退出 — 如果当前语句是一个函数调用,完成其执行,然后返回到调用它的位置。

Visual Studio Code 调试器
Visual Studio Code 对调试 Bun 脚本的支持是实验性的。要使用它,请安装 Bun VSCode 扩展。调试网络请求
设置BUN_CONFIG_VERBOSE_FETCH 环境变量以记录使用 fetch() 或 node:http 发起的网络请求。
将 fetch 和 node:http 请求打印为 curl 命令
将BUN_CONFIG_VERBOSE_FETCH 设置为 curl,以将每个 fetch() 和 node:http 请求打印为单行 curl 命令,你可以复制粘贴到终端中重放该请求。
index.ts
[fetch] > 开头的行是本地代码发出的请求,以 [fetch] < 开头的行是远程服务器的响应。
要打印时不带 curl 命令,请将 BUN_CONFIG_VERBOSE_FETCH 设置为 true。
index.ts
堆栈跟踪与 source maps
Bun 会转译每个文件,这可能导致堆栈跟踪指向转译后的输出。为避免这种情况,Bun 为其转译的每个文件生成并提供 sourcemapped 文件。当你在控制台中看到堆栈跟踪时,可以点击文件路径跳转到原始源代码,即使该文件是用 TypeScript 或 JSX 编写的,或者经过了其他转换。 Bun 在两种情况下都会加载 sourcemaps:一是在运行时按需转译文件时,二是在使用bun build 提前预编译文件时。
语法高亮的源代码预览
当发生未处理的异常或拒绝时,Bun 会打印一个简短的源代码预览。要自行生成相同的输出,请调用Bun.inspect(error):
V8 堆栈跟踪
Bun 使用 JavaScriptCore 作为其引擎,但 Node.js 生态系统和 npm 中的很多包期望 V8 的行为,而不同的 JavaScript 引擎在格式化error.stack 方面存在差异。由于 Bun 旨在成为 Node.js 的直接替代品,它使用与 V8 相同的方式格式化 error.stack。这对那些期望 V8 堆栈跟踪的库尤为重要。
V8 Stack Trace API
Bun 实现了 V8 Stack Trace API,这是一组用于操作堆栈跟踪的函数。Error.prepareStackTrace
定义一个全局的 Error.prepareStackTrace 函数来自定义堆栈跟踪输出。它接收错误对象和 CallSite 对象数组,其返回值将成为 error.stack。
CallSite 对象具有以下方法:
如果
Function 对象已被垃圾回收,其中一些方法可能会返回 undefined。
Error.captureStackTrace(error, startFn)
Error.captureStackTrace 在代码中的特定点捕获堆栈跟踪,而不是在错误被抛出的点。
这在回调或异步代码使得难以确定错误来源时很有帮助。Error.captureStackTrace 的第二个参数是你希望堆栈跟踪开始的函数。
在以下示例中,err.stack 指向调用 fn() 的代码,即使错误是在 myInner 中抛出的。
index.ts