routes 属性(用于静态路径、参数和通配符)或使用 fetch 方法处理未匹配的请求来向 Bun.serve() 添加路由。
Bun.serve() 的路由器基于 uWebSocket 的基于树的方法 构建,添加了SIMD加速的路由参数解码和JavaScriptCore结构缓存,以推动现代硬件允许的性能极限。
基本设置
Bun.serve() 中的路由接收一个 BunRequest(扩展了 Request)并返回一个 Response 或 Promise<Response>。这使得发送和接收HTTP请求的代码更容易复用。
异步路由
Async/await
您可以在路由处理程序中使用 async/await 来返回Promise<Response>。
Promise
您也可以从路由处理程序返回Promise<Response>。
路由优先级
路由按特异性顺序匹配:- 精确路由 (
/users/all) - 参数路由 (
/users/:id) - 通配符路由 (
/users/*) - 全局通配 (
/*)
类型安全的路由参数
TypeScript 会解析作为字符串字面量传递的路由参数,以便您的编辑器在访问request.params 时显示自动完成。
&0xFFFD; 替换。
静态响应
路由也可以是Response 对象(没有处理函数)。Bun.serve() 对其进行零分配调度优化 - 非常适合健康检查、重定向和固定内容:
Response 对象至少 15% 的性能提升。
静态路由响应在服务器对象的整个生命周期内被缓存。要重新加载静态路由,请调用 server.reload(options)。
文件响应与静态响应
在路由中提供文件时,根据您是缓冲文件内容还是直接提供文件,有两种不同的行为:new Response(await file.bytes())) 在启动时缓冲内容到内存:
- 零文件系统I/O - 请求期间内容完全从内存提供
- ETag 支持 - 自动为缓存生成和验证ETags
- If-None-Match - 当客户端ETag匹配时返回
304 Not Modified - 无 404 处理 - 缺失文件导致启动错误,而不是运行时 404
- 内存使用 - 完整文件内容存储在RAM中
- 最佳用于: 小静态资源、API响应、频繁访问的文件
new Response(Bun.file(path))) 每次请求都从文件系统读取:
- 文件系统读取 - 每次请求检查文件是否存在并读取内容
- 内置 404 处理 - 如果文件不存在或无法访问则返回
404 Not Found - Last-Modified 支持 - 使用文件修改时间处理
If-Modified-Since头部 - If-Modified-Since - 当文件自客户端缓存版本以来未更改时返回
304 Not Modified - 范围请求支持 - 自动使用
Content-Range头部处理部分内容请求 - 流式传输 - 使用带反压处理的缓冲读取器以实现高效的内存使用
- 内存高效 - 只在传输期间缓冲小块,而不是整个文件
- 最佳用于: 大文件、动态内容、用户上传、频繁更改的文件
流式传输文件
要流式传输文件,返回一个以BunFile 对象作为正文的 Response 对象。
⚡️ 速度 — Bun 在可能的情况下自动使用
sendfile(2)
系统调用,实现内核中的零拷贝文件传输 - 这是发送文件的最快方式。Bun.file 对象上的 slice(start, end) 方法发送文件的一部分。这会自动在 Response 对象上设置 Content-Range 和 Content-Length 头部。
fetch 请求处理器
fetch 处理器处理未被任何路由匹配的传入请求。它接收一个 Request 对象并返回一个 Response 或 Promise<Response>。
fetch 处理器支持 async/await:
fetch 处理器访问 Server 对象。它是作为第二个参数传递给 fetch 函数的。