Bun.serve() 的 routes 选项。
app.ts
terminal
HTML 路由
将 HTML 导入作为路由
要为前端指定入口点,请将 HTML 文件导入 JavaScript/TypeScript/TSX/JSX 文件。app.ts
Bun.serve()。
app.ts
/dashboard 或 / 时,Bun 会自动打包 HTML 文件中的 <script> 和 <link> 标签,将它们暴露为静态路由并提供结果。
HTML 处理示例
一个index.html 文件如下:
index.html
index.html
React 集成
要在客户端代码中使用 React,导入react-dom/client 并渲染你的应用。
开发模式
本地开发时,通过在Bun.serve() 中设置 development: true 启用开发模式。
src/backend.ts
开发模式功能
当development 为 true 时,Bun:
- 在响应中包含 SourceMap 标头,以便开发者工具显示原始源代码
- 禁用代码压缩
- 每次请求
.html文件时重新打包资源 - 启用热模块重载(除非设置了
hmr: false)
高级开发配置
要将浏览器中的控制台日志回显到终端,请在Bun.serve() 的 development 对象中传入 console: true。
src/backend.ts
开发 vs 生产
生产模式
热重载和development: true 有助于快速迭代,但在生产环境中,你的服务器应尽可能快速,并尽量减少外部依赖。
预构建打包(推荐)
从 Bun v1.2.17 开始,你可以使用Bun.build 或 bun build 提前打包完整的全栈应用。
terminal
Bun.serve() 用于提供资源。
src/backend.ts
运行时打包
如果你不想添加构建步骤,可以在Bun.serve() 中设置 development: false。
这将:
- 启用打包资源的内存缓存。Bun 会在首次请求
.html文件时延迟打包资源,并将结果缓存到内存中,直到服务器重启。 - 启用
Cache-Control和ETag响应头 - 压缩 JavaScript/TypeScript/TSX/JSX 文件
src/backend.ts
API 路由
HTTP 方法处理器
通过 HTTP 方法处理器定义 API 端点:src/backend.ts
动态路由
路由中使用 URL 参数:src/backend.ts
请求处理
src/backend.ts
插件
Bun 的打包器插件在打包静态路由时同样支持。 要为Bun.serve 配置插件,在 bunfig.toml 的 [serve.static] 部分添加 plugins 数组。
TailwindCSS 插件
要使用 TailwindCSS,请安装tailwindcss 包和 bun-plugin-tailwind 插件。
terminal
bunfig.toml
tailwindcss:
index.html
style.css
index.html
自定义插件
任何导出有效打包器插件对象(包含name 和 setup 字段的对象)的 JS 文件或模块都可以放置在 plugins 数组中:
bunfig.toml
my-plugin-implementation.ts
插件位于
bunfig.toml 中,这样一来,bun build CLI 在支持插件后,就能静态确定正在使用哪些插件。
这些插件可在 Bun.build() 的 JS API 中使用,但目前还不能在 CLI 中使用。内联环境变量
Bun 可以在构建时将前端 JavaScript 和 TypeScript 中的process.env.* 引用替换为其值。在 bunfig.toml 中配置 env 选项:
bunfig.toml
仅适用于字面量
process.env.FOO 引用,不支持 import.meta.env 或间接访问如 const env = process.env; env.FOO。如果环境变量未设置,浏览器可能会报错,如 ReferenceError: process is not defined。工作原理
Bun 使用HTMLRewriter 扫描 HTML 文件中的 <script> 和 <link> 标签,作为 Bun 打包器入口点,生成针对 JS/TS/TSX/JSX 及 CSS 的优化包,并提供结果。
处理流程
1
1. <script> 处理
- 转译
<script>标签中的 TypeScript、JSX 和 TSX - 打包导入的依赖
- 生成用于调试的 sourcemap
- 在
Bun.serve()中development非true时进行代码压缩
index.html
2
2. <link> 处理
- 处理 CSS 导入及
<link>标签 - 合并 CSS 文件
- 重写 url 及资源路径,在 URL 中加入内容寻址哈希
index.html
3
3. <img> 与资源处理
- 资源链接被重写以包含内容寻址哈希
- CSS 文件中的小资源被内联为
data:URL,减少 HTTP 请求数量
4
4. HTML 重写
- 合并所有
<script>标签为一个带内容寻址哈希的<script>标签 - 合并所有
<link>标签为一个带内容寻址哈希的<link>标签 - 输出新的 HTML 文件
5
5. 提供服务
- 所有打包输出的文件都作为静态路由暴露,内部使用与传递 Response 对象给
Bun.serve()中static相同机制 - 行为类似于
Bun.build对 HTML 文件的处理方式
完整示例
server.ts
public/index.html
src/main.tsx
src/App.tsx
src/styles.css
最佳实践
项目结构
基于环境的配置
server/config.ts
错误处理
server/middleware.ts
API 响应辅助函数
server/utils.ts
类型安全
types/api.ts
部署
生产构建
terminal
Docker 部署
Dockerfile
环境变量
.env.production
从其他框架迁移
从 Express + Webpack
server.ts
从 Next.js API 路由
server.ts
限制与未来计划
当前限制
- 尚未实现 API 路由的自动发现
- 未内置服务端渲染(SSR)
规划功能
- 基于文件的 API 端点路由
- 内置 SSR 支持
- 更完善的插件生态系统
这项工作仍在进行中。功能和 API 可能会发生变化。