Skip to main content
首先,导入 HTML 文件并将其传递给 Bun.serve()routes 选项。
app.ts
terminal

HTML 路由

HTML 导入作为路由

要指定前端入口点,将 HTML 文件导入到你的 JavaScript/TypeScript/TSX/JSX 文件中。
app.ts
将导入的 HTML 文件作为路由传递给 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

开发模式特性

developmenttrue 时,Bun:
  • 在响应中包含 SourceMap 头,以便开发者工具显示原始源代码
  • 禁用压缩
  • 在每次请求 .html 文件时重新打包资源
  • 启用热模块重载(除非设置了 hmr: false

高级开发配置

要将浏览器的控制台日志回显到终端,在 Bun.serve()development 对象中传入 console: true
src/backend.ts
Bun 通过现有的 HMR WebSocket 连接发送日志。

开发 vs 生产

生产模式

热重载和 development: true 帮助你在开发中快速迭代,但在生产环境中,你的服务器应该尽可能快且外部依赖尽可能少。

预先打包(推荐)

从 Bun v1.2.17 开始,你可以使用 Bun.buildbun build 预先打包你的全栈应用。
terminal
当 Bun 的打包器在服务器端代码中看到 HTML 导入时,它会将引用的 JavaScript/TypeScript/TSX/JSX 和 CSS 文件打包到一个清单对象中,Bun.serve() 可以使用该对象来提供资源。
src/backend.ts

运行时打包

如果你不想添加构建步骤,在 Bun.serve() 中设置 development: false 这会:
  • 启用已打包资源的内存缓存。Bun 在首次请求 .html 文件时惰性打包资源,并将结果缓存在内存中,直到服务器重启。
  • 启用 Cache-ControlETag
  • 压缩 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
现在你可以在 HTML 和 CSS 文件中使用 TailwindCSS 实用类。在你的项目中的某个地方导入 tailwindcss
index.html
或者,你也可以在 CSS 文件中导入 TailwindCSS:
style.css
index.html

自定义插件

任何导出有效打包器插件对象(一个带有 namesetup 字段的对象)的 JS 文件或模块都可以放在 plugins 数组中:
bunfig.toml
my-plugin-implementation.ts
Bun 惰性解析并加载每个插件,并使用它们来打包你的路由。
插件位于 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 等运行时错误。
请参阅HTML 和静态站点了解构建时配置和示例。

工作原理

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 可能会变化。