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

开发模式功能

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

高级开发配置

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

开发与生产

生产模式

热重载和 development: true 有助于快速迭代,但在生产环境中,你的服务器应尽可能快速,并尽量减少外部依赖。

预构建打包(推荐)

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

运行时打包

如果你不想添加构建步骤,可以在 Bun.serve() 中设置 development: false。 使用此设置时,Bun 会:
  • 启用打包资源的内存缓存。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
现在,你可以在 HTML 和 CSS 文件中使用 TailwindCSS 工具类。在项目中的某个位置导入 tailwindcss:
index.html
或者在 CSS 文件中导入 TailwindCSS:
style.css
index.html

自定义插件

plugins 数组接受任何导出有效打包器插件对象的 JS 文件或模块(包含 name 和 setup 字段的对象):
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
Bun 只会替换字面的 process.env.FOO 引用,不会替换 import.meta.env 或 const env = process.env; env.FOO 这类间接访问。如果环境变量未设置,浏览器可能会报错,如 ReferenceError: process is not defined。
有关构建时配置和示例,请参阅 HTML 和静态网站。

源映射

在开发环境中,Bun 会为打包后的路由生成关联的源映射,并与 JavaScript 和 CSS 分块一起提供。在生产环境中(development: false),默认禁用源映射,以免服务器暴露原始源代码。 要覆盖默认设置,请在 bunfig.toml 中设置 sourcemap 选项:
bunfig.toml

工作原理

Bun 使用 HTMLRewriter 扫描 HTML 文件中的 <script> 和 <link> 标签,并将它们作为 Bun 打包器的入口点。然后,Bun 为 JavaScript/TypeScript/TSX/JSX 和 CSS 文件生成优化后的打包结果,并提供该结果。

处理流程

1

1. <script> 处理

  • 转译 <script> 标签中的 TypeScript、JSX 和 TSX
  • 打包导入的依赖
  • 在开发环境中生成用于调试的 sourcemaps
  • 当 Bun.serve() 中的 development 不为 true 时进行压缩
index.html
2

2. <link> 处理

  • 处理 CSS 导入及 <link> 标签
  • 合并 CSS 文件
  • 重写 url 及资源路径,在 URL 中加入内容寻址哈希
index.html
3

3. <img> 和资源处理

  • 重写资源链接,在 URL 中加入内容寻址哈希
  • 将 CSS 文件中的小型资源内联为 data: URL,减少网络请求总数
4

4. HTML 重写

  • 合并所有 <script> 标签为一个带内容寻址哈希的 <script> 标签
  • 合并所有 <link> 标签为一个带内容寻址哈希的 <link> 标签
  • 输出新的 HTML 文件
5

5. 提供服务

  • 将打包器生成的所有输出文件暴露为静态路由,其内部使用的机制与将 Response 对象传递给 Bun.serve() 中的 routes 时相同。
  • 此流程与 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 可能会发生变化。