1
0
Files
DiAL/openspec/specs/fullstack-app-runtime/spec.md
lanyuanxiaoyao 3f477d1b57 feat: 完善全栈打包质量门禁
在业务开发前补齐 lint、format、verify 与生产运行时契约,确保开发联调和 executable 打包链路可重复验证。
2026-05-09 14:48:49 +08:00

6.3 KiB
Raw Blame History

Purpose

定义 Bun 全栈应用运行时的 HTTP server、API 命名空间、健康检查、生产静态资源服务和 SPA fallback 行为。

Requirements

Requirement: Bun HTTP 运行时

系统 SHALL 运行一个 Bun HTTP server由单个进程提供后端 API、健康检查、生产静态资源和 SPA fallback 行为。

Scenario: 启动运行时服务器

  • WHEN server 进程成功启动
  • THEN 它 SHALL 监听配置的 host 和 port并记录实际 server URL

Scenario: 提供运行时配置

  • WHEN 通过支持的运行时配置提供 host 或 port
  • THEN server SHALL 使用该值,且不需要重新构建

Requirement: HTTP method 语义

系统 SHALL 为运行时端点提供明确的 HTTP method 语义,避免不支持的 method 被错误地当作成功请求处理。

Scenario: GET 请求访问运行时端点

  • WHEN 客户端使用 GET 请求 /health/api/demo
  • THEN Bun server SHALL 返回对应端点的成功响应

Scenario: HEAD 请求访问运行时端点

  • WHEN 客户端使用 HEAD 请求 /health/api/demo
  • THEN Bun server SHALL 返回与 GET 相同的成功状态和 headers但 MUST NOT 返回响应体

Scenario: 不支持的 method 访问运行时端点

  • WHEN 客户端使用不支持的 method 请求 /health/api/demo
  • THEN Bun server MUST 返回 JSON 405 响应,并带有描述允许 method 的 Allow header

Requirement: 运行配置校验

系统 SHALL 对运行时 host 和 port 配置提供稳定、可测试的解析与校验行为。

Scenario: 使用默认运行配置

  • WHEN 未提供 host 或 port 覆盖
  • THEN server SHALL 使用 README 文档化的默认 host 和 port

Scenario: CLI 参数优先于环境变量

  • WHEN CLI 参数和环境变量同时提供同一项运行配置
  • THEN server SHALL 使用 CLI 参数中的值

Scenario: 拒绝无效端口

  • WHEN port 配置不是整数、小于 0 或大于 65535
  • THEN server MUST 拒绝启动并报告无效端口

Scenario: 接受端口边界值

  • WHEN port 配置为 0 或 65535
  • THEN server SHALL 将其作为有效端口配置处理

Requirement: API 路由命名空间

系统 MUST 将 /api/* 保留给后端 API 路由。

Scenario: API 路由匹配

  • WHEN 请求匹配已注册的 /api/* 路由
  • THEN Bun server SHALL 返回 API handler 的响应

Scenario: API 路由未命中

  • WHEN 请求访问未注册的 /api/* 路由
  • THEN Bun server MUST 返回 JSON 404 响应,而不是前端 HTML 文档

Requirement: API 错误响应一致性

系统 SHALL 为 API 命名空间内的错误返回机器可读 JSON 响应。

Scenario: 未知 API 路由

  • WHEN 客户端请求未知的 /api/* 路由
  • THEN Bun server MUST 返回包含 errorstatus 字段的 JSON 404 响应,而不是前端 HTML 文档

Scenario: API method 不允许

  • WHEN 客户端使用不支持的 method 请求已存在的 API 路由
  • THEN Bun server MUST 返回包含 errorstatus 字段的 JSON 405 响应

Requirement: Demo API 端点

系统 SHALL 暴露 /api/demo 作为稳定 demo 端点,用于证明前后端集成可用。

Scenario: Demo API 成功响应

  • WHEN 客户端请求 /api/demo
  • THEN Bun server SHALL 返回包含可读 message 和 runtime metadata 的 JSON 响应

Scenario: Demo API 内容类型

  • WHEN 客户端请求 /api/demo
  • THEN Bun server SHALL 返回 JSON content type 的响应

Requirement: 健康检查端点

系统 SHALL 在前端 SPA fallback 之外暴露健康检查端点。

Scenario: 健康检查成功

  • WHEN 客户端请求 /health
  • THEN Bun server SHALL 返回成功的、机器可读的健康检查响应

Requirement: 生产静态资源服务

系统 SHALL 在生产模式下由 Bun runtime 服务 Vite 生产资源。

Scenario: 请求构建后的资源

  • WHEN 客户端请求构建后的前端资源,例如 /assets/app.js
  • THEN Bun server SHALL 返回该资源并带有适当的 content type

Scenario: 请求前端根路径

  • WHEN 客户端请求 /
  • THEN Bun server SHALL 返回前端入口 HTML 文档

Scenario: 生产 demo 页面调用 API

  • WHEN 客户端从生产 Bun runtime 打开前端页面
  • THEN demo 页面 SHALL 能够从同源调用 /api/demo 并展示后端响应

Requirement: 生产缓存策略

系统 SHALL 为生产静态资源和前端入口 HTML 使用明确的缓存策略。

Scenario: 请求前端入口 HTML

  • WHEN 生产 Bun server 返回前端入口 HTML 文档
  • THEN 响应 SHALL 使用 Cache-Control: no-cache

Scenario: 请求构建后的静态资源

  • WHEN 生产 Bun server 返回 Vite 构建后的静态资源
  • THEN 响应 SHALL 使用长缓存策略 public, max-age=31536000, immutable

Scenario: 请求未知静态资源

  • WHEN 客户端请求不存在的 /assets/* 资源或带文件扩展名的未知路径
  • THEN Bun server MUST 返回 404且 MUST NOT 返回前端入口 HTML 文档

Requirement: 低风险安全响应头

系统 SHALL 在生产运行时响应中附加低风险安全响应头,提升基础安全性且不提前约束未来前端资源策略。

Scenario: 生产 HTML 响应包含安全头

  • WHEN 生产 Bun server 返回前端 HTML 文档
  • THEN 响应 SHALL 包含 X-Content-Type-Options: nosniffReferrer-Policy headers

Scenario: 生产 JSON 响应包含安全头

  • WHEN 生产 Bun server 返回 /health/api/* JSON 响应
  • THEN 响应 SHALL 包含 X-Content-Type-Options: nosniffReferrer-Policy headers

Scenario: 生产静态资源响应包含安全头

  • WHEN 生产 Bun server 返回 Vite 构建后的静态资源
  • THEN 响应 SHALL 包含 X-Content-Type-Options: nosniffReferrer-Policy headers

Requirement: SPA fallback 行为

系统 SHALL 在生产环境中为非 API、非静态资源的前端路由返回前端入口 HTML 文档。

Scenario: 刷新前端路由

  • WHEN 客户端请求前端路由,例如 /dashboard
  • THEN Bun server SHALL 返回前端入口 HTML 文档

Scenario: 保留 API 错误语义

  • WHEN 客户端请求未知的 /api/* 路由
  • THEN Bun server MUST NOT 返回前端入口 HTML 文档