--watch模式,当导入的文件发生更改时,硬重启 Bun 的进程。--hot模式,当导入的文件发生更改时,软重载代码(不重启进程)。
--watch 模式
监视模式适用于 bun test 以及运行 TypeScript、JSX 和 JavaScript 文件。
在 --watch 模式下运行文件:
terminal
--watch 模式下运行测试:
terminal
--watch 模式下,Bun 会跟踪所有导入的文件并监视其变化。当文件发生更改时,Bun 会使用与初始运行相同的 CLI 参数和环境变量重启进程。如果 Bun 崩溃,--watch 会尝试重启进程。
⚡️ 重载速度很快。 你可能习惯的文件系统监视器有多层库包装原生 API,更糟糕的是有的依赖轮询。相反,Bun 使用操作系统的原生文件系统监视 API(如 kqueue 或 inotify)来检测文件变化。Bun 还应用了若干优化以扩展到更大项目,例如设置较高的文件描述符限制、静态分配文件路径缓冲区以及尽可能重用文件描述符。
terminal
watchy.tsx

bun test 的监视模式:
terminal

--no-clear-screen 标志与 TypeScript 的 --preserveWatchOutput 类似,可防止 Bun 在监视模式下清除终端。当使用 concurrently 等工具同时运行多个 bun build --watch 命令时使用,因为一个实例清除屏幕可能会隐藏另一个实例的错误:bun build --watch --no-clear-screen。--hot 模式
使用 bun --hot 在 Bun 执行代码时启用热重载。与 --watch 模式不同,Bun 不会硬重启整个进程。它会检测代码变化并用新代码更新内部模块缓存。
这与浏览器中的热重载不同。许多框架提供了”热重载”体验,你可以编辑和保存前端代码(比如 React 组件),并在浏览器中看到更改而无需刷新页面。Bun 的
--hot 是此体验的服务器端等价物。要在浏览器中获得热重载,请使用 Vite 等框架。terminal
server.ts)开始,Bun 会构建所有导入源文件(node_modules 中的除外)的注册表,并监视其变化。当文件变化时,Bun 执行”软重载”。所有文件被重新求值,但全局状态(特别是 globalThis 对象)保持不变。
server.ts
bun --hot server.ts 运行此文件,每次保存文件时都会看到重载计数递增。
terminal
nodemon)会重启整个进程,因此 HTTP 服务器和其他有状态对象会丢失。相比之下,bun --hot 会在不重启进程的情况下反映更新后的代码。
HTTP 服务器
你可以在不关闭服务器的情况下更新 HTTP 请求处理程序:保存文件时,Bun 会用更新后的代码重载服务器而无需重启进程。这带来了极快的刷新速度。server.ts
计划支持 Vite 的
import.meta.hot,以实现更好的热重载生命周期管理并与生态系统对齐。实现细节
实现细节
在热重载时,Bun:
- 重置内部
require缓存和 ES 模块注册表(Loader.registry) - 同步运行垃圾回收器(以最小化内存泄漏,代价是运行时性能)
- 从头开始重新转译所有代码(包括 sourcemaps)
- 使用 JavaScriptCore 重新求值代码