1
0

feat: 迁移前端构建从 Bun fullstack 到 Vite

前端性能问题根因在于 Bun bundler 无法有效 code split、CSS
tree-shake 和产出优化的前端资源。经多轮 Bun 原生优化尝试
均无明显效果后,决定将前端构建迁回 Vite。

主要变更:

- 前端构建:从 Bun HTML import bundling 切换为 Vite build
  (Rolldown code splitting、vendor chunk、CSS 优化)
- 开发模式:从 Bun fullstack 单进程 HMR 切换为 Vite dev
  server + Bun API server 双进程(:5173 + :3000)
- 生产构建:三步流水线(Vite build → code generation →
  Bun compile),通过 `import with { type: "file" }` 嵌入前端资源
- 静态资源服务:从 Bun HTML import manifest 切换为自定义
  serveStaticAsset 函数,支持 SPA fallback 和正确的 Cache-Control
- Server 接口:BootstrapOptions 和 StartServerOptions 增加
  staticAssets? 可选参数
- 文档更新:DEVELOPMENT.md 和 README.md 反映新的开发模式,
  主 specs 同步 delta 变更

新增能力:
- static-asset-embedding: 构建时资源扫描与 code generation、
  运行时静态资源服务
- vite-frontend-bundling: Vite 构建配置、code splitting 策略、
  CSS 处理
This commit is contained in:
2026-05-15 11:26:46 +08:00
parent 28e46b8431
commit d6a77b2c6e
18 changed files with 735 additions and 152 deletions

View File

@@ -22,9 +22,9 @@ src/
server/
bootstrap.ts 后端统一启动引导loadConfig → store → engine → startServer → shutdown
config.ts CLI 参数解析(仅提取配置文件路径)
dev.ts 开发模式启动入口mode: "development"HMR 自动注入
dev.ts 开发模式启动入口mode: "development"仅 API server
main.ts 生产模式启动入口mode: "production",安全头启用)
server.ts HTTP server 启动工厂Bun.serve routes 声明式路由 + HTML import
server.ts HTTP server 启动工厂Bun.serve routes 声明式路由 + fetch fallback 静态资源服务
helpers.ts 共享响应格式化工具(见下方函数清单)
middleware.ts API 参数校验中间件validateTargetId、validateTimeRange、validatePagination
routes/ API 路由 handler按端点拆分
@@ -113,7 +113,7 @@ probe-config.schema.json 用户配置 JSON Schema 导出物(用于 IDE 自动
HTTP 请求:
Request → Bun.serve routes 声明式匹配 → routes/*.ts(handler)
→ middleware.ts(参数校验) → helpers.ts(响应格式化) → Response
前端: "/*": homepage (HTML import) → SPA fallback + HMR(开发模式)
前端: fetch fallback → serveStaticAsset (生产) / Vite proxy (开发)
```
### 1.2 库使用优先级
@@ -748,44 +748,58 @@ export function TargetGroup({ name, targets, onTargetClick }: TargetGroupProps)
bun run dev probes.yaml
```
`bun --watch src/server/dev.ts` 启动单进程 fullstack 开发服务器
`scripts/dev.ts` 同时启动两个进程
- 后端 API + 前端 SPA 在同一端口(默认 3000
- `development` 模式自动注入 HMR前端修改即时热更新
- `--watch` 监听后端文件变更自动重启
- 访问 `http://127.0.0.1:3000` 即可使用完整应用
- **Bun API server**(端口 3000后端 API 服务,`--watch` 监听后端文件变更自动重启
- **Vite dev server**(端口 5173前端 SPA + HMR 热更新
开发时访问 `http://127.0.0.1:5173`Vite 自动将 `/api``/health` 请求代理到后端。
也可以单独启动:
```bash
bun run dev:server probes.yaml # 仅启动后端 API server
bun run dev:web # 仅启动 Vite dev server
```
### 3.2 前后端集成方式
#### 统一进程架构
#### 双进程开发架构
前后端通过 Bun 的 HTML import 机制集成为单进程应用
开发模式下前后端分别由 Vite 和 Bun 服务
- Vite dev server 负责前端 SPA、HMR、模块热替换
- Bun API server 负责后端 API 路由
- Vite 通过 proxy 配置将 `/api/*``/health` 转发到 Bun
#### 生产模式架构
生产模式下前端通过 Vite 构建为静态资源,通过 `import with { type: "file" }` 嵌入 Bun 可执行文件:
```typescript
// server.ts
import homepage from "../web/index.html";
const server = Bun.serve({
development: mode === "development" ? { hmr: true, console: true } : false,
fetch(req) {
// staticAssets 存在时服务嵌入的前端资源
return serveStaticAsset(new URL(req.url).pathname, staticAssets);
},
routes: {
"/*": homepage, // SPA fallback开发模式自动注入 HMR
"/api/*": () => ..., // API 通配符(未匹配路由返回 404
"/api/dashboard": { GET: (req) => handleDashboard(new URL(req.url), store, mode) },
"/api/dashboard": { GET: (req) => handleDashboard(...) },
"/health": { GET: () => handleHealth(mode) },
// ...
},
});
```
- 开发模式(`development: { hmr: true, console: true }`Bun 自动为 HTML import 注入 HMR client前端修改无需手动刷新并将浏览器 console 回显到终端
- 生产模式HTML 及其引用的 JS/CSS 资源在 `bun build --compile` 时自动打包进可执行文件
#### 路由优先级
Bun routes 的匹配规则:具体路径 > 通配符。`/api/dashboard` 优先于 `/api/*``/health` 优先于 `/*`
未匹配 method 的请求(如 POST /api/dashboard会落入 `/api/*` 通配符返回 404。
非 API 路径由 fetch fallback 处理:有文件扩展名的返回对应静态资源或 404无扩展名的返回 SPA index.html。
### 3.3 构建打包
#### 构建命令
@@ -796,26 +810,25 @@ bun run build
#### 构建流程
`scripts/build.ts` 执行单步构建
`scripts/build.ts` 执行三步流水线
```
Bun.build({
compile: { outfile: "dist/dial-server" },
entrypoints: ["src/server/main.ts"],
minify: true,
sourcemap: "linked",
})
1. Vite build → dist/web/ (前端静态资源,含 code splitting)
2. Code generation → .build/static-assets.ts + .build/server-entry.ts
3. Bun compile → dist/dial-server (单可执行文件)
```
- 入口为 `src/server/main.ts``mode: "production"`,启用安全头
- HTML import 的前端资源自动打包进可执行文件Bun 自动生成 manifest
- 无需中间产物目录,一步生成最终 binary
- Vite 构建前端资源到 `dist/web/`,自动 code splittingvendor-react、vendor-tdesign、vendor-chart
- Code generation 扫描 `dist/web/` 生成 `import with { type: "file" }` 声明,将资源嵌入 binary
- Bun compile 以 `.build/server-entry.ts` 为入口编译最终可执行文件
- `.build/` 临时目录在构建完成后自动清理
#### 产物
| 产物 | 用途 |
| ------------------ | ---------------------------------------- |
| `dist/dial-server` | 生产可执行文件(含前端资源,单文件部署) |
| `dist/web/` | Vite 构建的前端资源(构建中间产物) |
#### 构建参数
@@ -839,7 +852,7 @@ Bun.build({
```bash
bun run clean
# 清理 dist/ 构建产物和 *.bun-build 临时文件
# 清理 dist/ 构建产物和 .build/ 临时文件
```
### 3.4 开发工作流
@@ -847,8 +860,9 @@ bun run clean
#### 日常开发循环
```bash
bun run dev probes.yaml # 启动开发环境(单进程,含 HMR
# 修改前端代码 → HMR 热更新 / 修改后端代码 → --watch 自动重启
bun run dev probes.yaml # 启动双进程开发环境(Vite + API server
# 访问 http://127.0.0.1:5173
# 修改前端代码 → Vite HMR 热更新 / 修改后端代码 → --watch 自动重启
bun run check # 提交前运行完整质量检查
```
@@ -863,17 +877,19 @@ bun run verify
### 3.5 Executable/E2E 验证
`scripts/smoke.ts` 覆盖过薄,已从当前工作流移除。后续如需验证 production executable 的 API、HTML import manifest、SPA fallback 和静态资源行为,应重新设计独立的 executable/E2E 测试。
`scripts/smoke.ts` 覆盖过薄,已从当前工作流移除。后续如需验证 production executable 的 API、静态资源服务、SPA fallback 行为,应重新设计独立的 executable/E2E 测试。
### 3.6 脚本说明
| 脚本 | 文件 | 说明 |
| ---------------------- | ----------------------------------- | ----------------------------------- |
| `bun run dev` | `src/server/dev.ts` | 进程 fullstack 开发服务(含 HMR |
| `bun run build` | `scripts/build.ts` | Bun 编译可执行文件(含前端资源) |
| `bun run schema` | `scripts/generate-config-schema.ts` | 生成 `probe-config.schema.json` |
| `bun run schema:check` | `scripts/generate-config-schema.ts` | 检查配置 schema 导出物是否同步 |
| `bun run clean` | `scripts/clean.ts` | 清理构建缓存与临时文件 |
| 脚本 | 文件 | 说明 |
| ---------------------- | ----------------------------------- | ---------------------------------------- |
| `bun run dev` | `scripts/dev.ts` | 进程开发服务Vite :5173 + API :3000 |
| `bun run dev:server` | `src/server/dev.ts` | 仅启动后端 API server |
| `bun run dev:web` | Vite CLI | 仅启动 Vite dev server |
| `bun run build` | `scripts/build.ts` | Vite → codegen → Bun compile 三步构建 |
| `bun run schema` | `scripts/generate-config-schema.ts` | 生成 `probe-config.schema.json` |
| `bun run schema:check` | `scripts/generate-config-schema.ts` | 检查配置 schema 导出物是否同步 |
| `bun run clean` | `scripts/clean.ts` | 清理构建缓存与临时文件 |
### 3.7 环境变量