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 打包器的入口点,为 JavaScript/TypeScript/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> 和资源处理
- 资源的链接被重写,在 URL 中包含内容可寻址哈希
- CSS 文件中的小资源被内联为
data:URL,减少网络传输的 HTTP 请求总数
4
4. HTML 重写
- 将所有
<script>标签合并为单个带有内容可寻址哈希 URL 的<script>标签 - 将所有
<link>标签合并为单个带有内容可寻址哈希 URL 的<link>标签 - 输出新的 HTML 文件
5
5. 提供服务
- 打包器输出的所有文件都被暴露为静态路由,内部使用与在
Bun.serve()中将 Response 对象传递给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 可能会变化。