与其输出一堆 markdown 让读者在脑中"想象",不如直接用 HTML 渲染出可交互、可扫描、可探索的空间化文档。
将多个选项并排放置,用视觉层次和标签突出差异。悬停卡片查看细节,展开详情获取深度分析。
灵活查询,精确获取所需字段,减少 over-fetching
传统 REST API 搭配客户端缓存层
端到端类型安全,零 Schema 定义
将事件按时间顺序排列,用颜色区分状态,点击展开详情。适合项目进度、事故复盘、版本发布等场景。
将选项和评估维度交叉排列,用颜色深浅表示得分。鼠标悬停查看评分依据,表头可排序。
| 评估维度 | 权重 | 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 | |
用折叠面板组织知识,读者按需展开。支持搜索过滤,标签页切换代码示例。
query {
user(id: "u_01") {
name
orders(first: 3) {
items { productName price }
total
}
}
}
与 REST 的区别:REST 每个端点返回固定结构,GraphQL 一个端点返回客户端指定的结构。
__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 也会自动更新。
// 问题示例
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。
const [addTodo] = useMutation(ADD_TODO, {
optimisticResponse: {
addTodo: { id: 'temp-' + Date.now(), text: input, done: false }
},
update(cache, { data }) {
// 成功: 用真实 ID 替换临时 ID
// 失败: 自动回滚到操作前状态
}
});
用户体感:点击 = 立即生效,延迟 = 0ms。
fragment UserAvatar on User {
id name avatarUrl
}
fragment OrderSummary on Order {
id total createdAt
user { ...UserAvatar }
}
# 任何组件都可以声明自己依赖哪个 Fragment
好处:组件自描述需要什么数据,修改字段不会影响其他组件。
// 每个字段分配 cost
const costMap = {
users: 1, // 基础列表
user: 1, // 单条查询
orders: 5, // 关联查询 cost 更高
items: 10, // 深层嵌套 cost 最高
};
// 限制: 单次查询 cost ≤ 1000
超限查询直接拒绝,返回 400 + 明确的错误信息。
// 客户端: 只发送 hash
{ "hash": "a1b2c3d4e5f6...", "variables": { "id": "u_01" } }
// 服务端: hash → 缓存中找到完整 query → 执行
APQ (Automatic Persisted Queries) 可以自动完成这个过程,无需手动注册。
用过滤按钮分类查看,卡片展示详情。适合项目状态、系统监控、代码审查结果等。
P95: 38ms | QPS: 12,400 | 错误率: 0.01% | 上次部署: 2h ago
P95: 22ms | QPS: 8,200 | 错误率: 0.00% | 上次部署: 1d ago
P95: 180ms (阈值 150ms) | QPS: 3,100 | GC 暂停: 12ms | 需要优化
P95: 95ms | QPS: 1,800 | 错误率: 0.02% | 上次部署: 3d ago
消息积压: 2,400 条 | 消费速率下降 30% | 需扩容 worker
ElasticSearch 集群 RED | 2 个 shard 未分配 | 磁盘使用率: 92%