Skip to main content

基本设置

index.ts

HTML 导入

直接将 HTML 文件导入服务器代码,以构建同时包含服务器端和客户端代码的全栈应用。HTML 导入支持两种模式: 开发环境(bun --hot): Bun 会在运行时按需打包资源,并启用热模块替换(HMR):当你修改前端代码时,浏览器会更新,而无需完整重新加载页面。 生产环境(bun build): 使用 bun build --target=bun 构建时,import index from "./index.html" 语句会解析为一个预构建的清单对象,其中包含所有已打包的客户端资源。Bun.serve 会从此清单提供资源,无需在运行时进行打包。
HTML 导入的功能不止是提供 HTML:它们还会运行 Bun 的 打包器、JavaScript 转译器和 CSS 解析器,因此你可以使用 React、TypeScript 和 Tailwind CSS 构建前端。 如需了解使用 HTML 导入构建全栈应用的完整指南,请参阅全栈开发服务器。

配置

更改 port 和 hostname

要配置服务器监听的端口和主机名,请在选项对象中设置 port 和 hostname。
设置 port 为 0 来随机选择一个可用端口。
从服务器的 port 或 url 属性中读取所选端口。

配置默认端口

有多个标志和环境变量可以设置默认端口,当未设置 port 选项时,Bun 会使用该端口。
  • --port 命令行参数
  • BUN_PORT 环境变量
  • PORT 环境变量
terminal
  • NODE_PORT 环境变量
terminal

Unix 域套接字

要监听 Unix 域套接字,请传入 unix 选项并指定套接字路径。

抽象命名空间套接字

在 Linux 上,Bun 还支持抽象命名空间套接字:在 unix 路径前加上一个空字节。
与 Unix 域套接字不同,抽象命名空间套接字不绑定到文件系统,并且在最后一个引用关闭时会自动删除。

HTTP/3 (QUIC)

Bun.serve 对 HTTP/3 的支持是实验性的,未来版本中可能会更改。
Bun.serve 也可以通过 QUIC 监听 HTTP/3。将 http3: true 与 tls 一起设置;HTTP/3 需要 TLS。
启用 http3 后,服务器会在同一端口上同时通过 TCP(HTTP/1.1)和 UDP(HTTP/3)监听。HTTP/1.1 响应会包含一个 Alt-Svc 标头,声明 HTTP/3 端点,以便支持的客户端可以自动升级。 若要仅提供 HTTP/3 服务而完全不启用 TCP 监听,请设置 http1: false:
http3 不支持 Unix 域套接字:QUIC 需要 UDP 端口。http1: false 需要同时设置 http2: true 或 http3: true。

HTTP/2

Bun.serve 对 HTTP/2 的支持是实验性的,未来版本中可能会更改。
设置 http2: true,即可在同一端口上使用与 HTTP/1.1 相同的路由和 fetch 处理程序提供 HTTP/2 服务。
使用 tls 时,Bun 会通过 ALPN 为每个连接选择协议。提供 h2 的客户端(浏览器、curl、node:http2)会使用 HTTP/2。其他客户端则使用 HTTP/1.1。 不使用 tls 时,Bun 会为使用 HTTP/2 前言(“先验知识”)建立连接的客户端提供 HTTP/2 服务,例如 curl --http2-prior-knowledge 或来自 node:http2 的 http2.connect("http://...")。其他连接则使用 HTTP/1.1。 设置 http1: false 可拒绝 HTTP/1.x 客户端。使用 TLS 时,提供 ALPN 但不包含 h2 的客户端会在握手时失败;完全不发送 ALPN 的客户端,以及未以该前言开头的明文连接,会收到 505 HTTP Version Not Supported。设置 http1: false 后,服务器无法接受 WebSocket 连接,因为 server.upgrade() 仅适用于 HTTP/1.1。 server.upgrade() 仅适用于 HTTP/1.1 请求。不支持 HTTP/2 上的 WebSocket、服务器推送和响应尾部标头(gRPC 所需)。

idleTimeout

默认情况下,Bun.serve 会在连接空闲 10 秒后将其关闭。没有数据正在发送或接收时,连接即为空闲。这也包括正在处理中的请求:处理程序仍在运行,但尚未向响应写入任何字节。浏览器和 fetch() 客户端会将其视为连接重置。 要进行配置,请设置 idleTimeout 字段(单位为秒)。最大值为 255,设置为 0 则完全禁用超时。
流式传输和服务器发送事件 — 响应进行流式传输时,空闲计时器仍然生效。如果流的静默时间超过 idleTimeout,Bun 会在响应传输过程中关闭连接。对于长连接流,请使用 server.timeout(req, 0) 为该请求禁用超时。

export default 语法

无需将服务器选项传入 Bun.serve,你可以直接 export default 这些选项。
server.ts
类型参数 <undefined> 是 WebSocket 数据类型。如果你添加了一个 WebSocket 处理程序,并通过 server.upgrade(req, { data: ... }) 附加自定义数据,请将 undefined 替换为你的数据类型。 可以直接运行此文件:当 Bun 检测到某个文件的 default 导出中包含 fetch 处理程序时,就会将该导出传入 Bun.serve。

热路由重载

使用 server.reload() 无需重启服务器即可更新路由:

服务器生命周期方法

server.stop()

停止服务器接受新连接:
默认情况下,stop() 会允许正在处理的请求和 WebSocket 连接完成。服务器会立即关闭空闲的 keep-alive 连接。正在处理请求的连接会在服务器发送响应后关闭。传入 true 则会立即终止所有连接。每当所有连接都关闭后,返回的 Promise 就会解析。

server.closeIdleConnections()

在不停止服务器的情况下,关闭当前未处理请求的 keep-alive 连接:
它会返回已关闭的连接数量。正在处理请求的连接和已打开的 WebSocket 不受影响,服务器仍会接受新连接。此方法与 node:http 的 server.closeIdleConnections() 行为一致,后者不返回任何内容。

server.ref() 和 server.unref()

控制服务器是否保持 Bun 进程存活:

server.reload()

无需重启即可更新服务器处理器:
可将此方法用于开发和热重载。你只能更新 fetch、error、routes 和 websocket。

每请求控制

server.timeout(Request, seconds)

覆盖单个请求的空闲超时时间。传递 0 可以完全禁用该请求的超时时间。
使用 server.timeout(req, 0) 可让长时间运行的流式响应(例如服务器发送事件)保持连接,而无需为每个请求调高全局 idleTimeout。在 HTTP/2 上,超时作用于连接,因此其打开的请求中最宽松的超时值会生效:

server.requestIP(Request)

获取客户端 IP 和端口信息:
对于已关闭的请求或 Unix 域套接字,返回 null。

服务器指标

server.pendingRequests 和 server.pendingWebSockets

使用内置计数器监控服务器活动:

server.subscriberCount(topic)

获取某个 WebSocket 主题的订阅者数量:

性能基准

以下 Bun 和 Node.js 服务器会对每个传入的 Request 响应 Bun!。
Bun
在 Linux 上,Bun.serve 服务器每秒可处理请求数大约是 Node.js 的 2.5 倍。
图像

实例示范:REST API

这是使用 Bun 路由的基本数据库驱动 REST API,无任何依赖:

参考

See TypeScript Definitions