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 打包器入口点,生成针对 JS/TS/TSX/JSX 及 CSS 的优化包,并提供结果。

处理流程

1

1. <script> 处理

  • 转译 <script> 标签中的 TypeScript、JSX 和 TSX
  • 打包导入的依赖
  • 生成用于调试的 sourcemap
  • Bun.serve()developmenttrue 时进行代码压缩
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 可能会发生变化。