The Unreasonable Effectiveness of HTML

与其输出一堆 markdown 让读者在脑中"想象",不如直接用 HTML 渲染出可交互、可扫描、可探索的空间化文档。

9
输出模式
0
外部依赖
1
单文件
∞
浏览器直接打开

模式 1: 对比看板

Comparison Board

将多个选项并排放置,用视觉层次和标签突出差异。悬停卡片查看细节,展开详情获取深度分析。

方案 A: GraphQL + Apollo

灵活查询,精确获取所需字段,减少 over-fetching

+ 精确查询 + 强类型 Schema + 实时订阅 - 学习曲线陡
详细分析
适合数据关系复杂、客户端需求多样的场景。Apollo Client 提供缓存、乐观更新、错误处理开箱即用。社区生态成熟,DevTools 完善。缺点是服务端需要额外的 Schema 设计成本,简单 CRUD 场景收益不明显。

方案 B: REST + React Query

传统 REST API 搭配客户端缓存层

+ 团队熟悉 + 缓存自动管理 - Over-fetching - 多端适配难
详细分析
最稳妥的选择。团队无需额外学习成本,React Query 的 stale-while-revalidate 策略解决了大部分缓存问题。但当多个端(Web、Mobile、Mini Program)对同一 API 有不同字段需求时,维护成本快速上升。

方案 C: tRPC

端到端类型安全,零 Schema 定义

+ 端到端类型安全 + 零 API Schema - 仅限 TS 全栈 - 生态较新
详细分析
TypeScript 全栈项目的理想选择。前后端共享类型定义,IDE 自动补全覆盖 API 调用。但要求前后端都用 TypeScript,且对非 TS 客户端(移动端原生)不友好。适合内部工具、SaaS 后台等单一技术栈项目。

模式 2: 时间线

Annotated Timeline

将事件按时间顺序排列,用颜色区分状态,点击展开详情。适合项目进度、事故复盘、版本发布等场景。

2026-04-28 已完成
需求评审 & 技术选型
确定 GraphQL + Apollo 方案。完成 Schema 设计初稿,定义 3 个核心 Query 和 2 个 Mutation。
2026-05-02 已完成
服务端 Schema 实现
完成 User、Order、Product 三个 Type 的 Resolver。集成 DataLoader 解决 N+1 查询问题,P95 延迟从 320ms 降至 45ms。
2026-05-08 进行中
客户端集成 & 缓存策略
Apollo Client 接入中。已完成 normalized cache 配置,正在处理 optimistic UI updates 和 error boundary。
2026-05-15 待开始
E2E 测试 & 性能压测
计划使用 Playwright 覆盖核心流程,k6 模拟 500 并发用户验证 P99 延迟。
2026-05-22 待开始
灰度发布 & 监控
先开放 5% 流量,观察 48 小时后逐步放量。Grafana 面板已配置,报警阈值: 错误率 > 0.1%, P95 > 200ms。

模式 3: 决策矩阵

Decision Matrix

将选项和评估维度交叉排列,用颜色深浅表示得分。鼠标悬停查看评分依据,表头可排序。

评估维度 权重 GraphQL + Apollo REST + React Query tRPC
开发效率 25% 9/10 7/10 9/10
运行时性能 20% 8/10 7/10 9/10
团队学习成本 20% 5/10 9/10 7/10
生态 & 社区 15% 9/10 10/10 6/10
多端适配 10% 9/10 6/10 4/10
调试体验 10% 9/10 7/10 8/10
加权总分 8.15 7.55 7.35

模式 4: 知识探索器

Knowledge Explorer

用折叠面板组织知识,读者按需展开。支持搜索过滤,标签页切换代码示例。

什么是 GraphQL?
GraphQL 是一种 API 查询语言,由 Facebook 于 2012 年内部开发,2015 年开源。它的核心思想是:让客户端精确描述需要什么数据。
query {
  user(id: "u_01") {
    name
    orders(first: 3) {
      items { productName price }
      total
    }
  }
}
与 REST 的区别:REST 每个端点返回固定结构,GraphQL 一个端点返回客户端指定的结构。
Apollo Client 缓存机制
Apollo Client 使用 normalized cache(归一化缓存):每个对象按 __typename:id 作为唯一键存储。当多个 Query 返回同一个对象时,它们共享同一份缓存,一处更新全局生效。
// 缓存结构示意
{
  "User:u_01": { "name": "Alice", "email": "alice@example.com" },
  "Order:o_99": { "total": 299, "user": { "__ref": "User:u_01" } }
}
这意味着:修改 User:u_01 的 name,所有引用该用户的 Order 也会自动更新。
什么是 N+1 查询问题?
当 Resolver 嵌套时,外层查 N 条记录,内层每条再查一次,产生 N+1 次数据库查询。
// 问题示例
users() → SELECT * FROM users (1次)
  user.orders() → SELECT * FROM orders WHERE user_id = ? (N次)
    order.items() → SELECT * FROM items WHERE order_id = ? (N*M次)
解决方案:使用 DataLoader 将同一 tick 内的多个查询合并为一次批量查询。效果:320ms → 45ms。
乐观更新 (Optimistic UI)
用户操作后立即更新界面,不等待服务端响应。如果服务端失败则回滚。关键在于给每次操作一个临时 ID。
const [addTodo] = useMutation(ADD_TODO, {
  optimisticResponse: {
    addTodo: { id: 'temp-' + Date.now(), text: input, done: false }
  },
  update(cache, { data }) {
    // 成功: 用真实 ID 替换临时 ID
    // 失败: 自动回滚到操作前状态
  }
});
用户体感:点击 = 立即生效,延迟 = 0ms。
Fragment 共享模式
将组件需要的字段定义为 Fragment,避免 props drilling 和字段遗漏。
fragment UserAvatar on User {
  id name avatarUrl
}

fragment OrderSummary on Order {
  id total createdAt
  user { ...UserAvatar }
}

# 任何组件都可以声明自己依赖哪个 Fragment
好处:组件自描述需要什么数据,修改字段不会影响其他组件。
查询复杂度分析
GraphQL 允许客户端构造深度嵌套查询,可能造成服务端资源耗尽。解决方案:设置查询复杂度上限。
// 每个字段分配 cost
const costMap = {
  users: 1,        // 基础列表
  user: 1,         // 单条查询
  orders: 5,       // 关联查询 cost 更高
  items: 10,       // 深层嵌套 cost 最高
};
// 限制: 单次查询 cost ≤ 1000
超限查询直接拒绝,返回 400 + 明确的错误信息。
持久化查询 (Persisted Queries)
客户端发送查询的 hash 而非完整 query string,服务端从缓存中查找对应的查询。好处:减少网络传输体积,防止恶意查询注入。
// 客户端: 只发送 hash
{ "hash": "a1b2c3d4e5f6...", "variables": { "id": "u_01" } }

// 服务端: hash → 缓存中找到完整 query → 执行
APQ (Automatic Persisted Queries) 可以自动完成这个过程,无需手动注册。

模式 5: 交互报告

Interactive Report

用过滤按钮分类查看,卡片展示详情。适合项目状态、系统监控、代码审查结果等。

API Gateway

健康

P95: 38ms | QPS: 12,400 | 错误率: 0.01% | 上次部署: 2h ago

User Service

健康

P95: 22ms | QPS: 8,200 | 错误率: 0.00% | 上次部署: 1d ago

Order Service

警告

P95: 180ms (阈值 150ms) | QPS: 3,100 | GC 暂停: 12ms | 需要优化

Payment Service

健康

P95: 95ms | QPS: 1,800 | 错误率: 0.02% | 上次部署: 3d ago

Notification Service

警告

消息积压: 2,400 条 | 消费速率下降 30% | 需扩容 worker

Search Service

异常

ElasticSearch 集群 RED | 2 个 shard 未分配 | 磁盘使用率: 92%