《互联网产品的客户端架构·端形态与体验基础》13.3 质量属性场景与风险清单
把弱网打开、进程回收恢复、支付回调重复、包体超限四个质量属性场景转成可评分风险条目,用影响、概率、发现难度三维打分并排序,给出阈值、结论判定与固定输出格式,附一次基线评审记录、风险关闭过程,以及清单如何进入下一轮迭代并转化为可执行的发布条件。
tag
把弱网打开、进程回收恢复、支付回调重复、包体超限四个质量属性场景转成可评分风险条目,用影响、概率、发现难度三维打分并排序,给出阈值、结论判定与固定输出格式,附一次基线评审记录、风险关闭过程,以及清单如何进入下一轮迭代并转化为可执行的发布条件。
收口卷一的模块依赖:把各章实验整理成带层级的模块清单,构建依赖图、Kahn 拓扑排序、回路检测与方向校验,输出可直接写入评审记录的文本。附卷一真实依赖图的结论,说明 summary 组合根为什么允许向下穿透多层,以及依赖图与架构图之间仍缺的那部分证据。
把页面栈、共享状态、缓存数据层与离线写队列串成一条可运行的端到端基线:用注入适配器在进程内复现冷启动、缓存命中、弱网兜底与进程重启后的队列续传,给出 TypeScript 实现、五个测试的真实输出,并说明 L2 基线能证明与不能证明的边界。
埋点质量决定端上观测的上限。本节把事件命名、必填字段、类型校验、时间戳与 session 规则写成可运行的注册表与校验器,解释如何用发送数与接收数检测丢失,并用 schema 对比管理口径变更,避免一次字段改动静默破坏历史数据与下游报表口径。
崩溃与卡顿的难点不是采集,而是把海量原始样本收敛成可行动的少数分组。本节给出崩溃消息归一化与签名聚合、卡顿阈值与样本字段设计、归因顺序(布局抖动、主线程阻塞、长任务),以及上报事件应携带的最小证据字段,并用可运行的 TypeScript 与真实测试输出验证每一步判断与取舍。
性能指标最容易在口径上失焦:同一个 LCP,均值、p75 与 p95 会讲出不同故事。本节把指标定义、采样边界、窗口聚合与主口径选择写进一个可运行的 TypeScript 指标字典,说明何时用分位、何时看均值,并用真实测试输出验证聚合结果与取舍。
埋点失败后直接丢弃,会让故障现场永远缺一块。本节实现一个带 TTL、容量上限、优先级淘汰与跨批次去重的补报队列,说明 p0 事件如何避免被噪声挤掉,以及补报失败后重试、稍后、返回三种用户可恢复操作的分工,最后复盘一次埋点风暴的全过程与容量参数。
弱网下只有成功与失败两态是不够的,超时、失败、半成功需要不同兜底。本节给出缓存年龄、关键字段缺失与重试预算共同参与的决策函数,解释为什么超时先看缓存、失败先重试,并用注入时钟验证滑动窗口预算与降级内容展示,说明缓存写回与手动重试的风险边界。
白屏往往不是某个组件写错,而是错误没有被分类、边界没有被放置。本节把端上错误分成可恢复、可降级、致命三类,给出不依赖 DOM 的分类器与嵌套边界模型,用注入时钟验证恢复预算与升级路径,并复盘一次局部兜底反而扩大故障的白屏事故,最后整理成可执行的评审清单。
渲染模式不是一次选型就结束,而是持续核对前提的决策;本节给出退出判定函数、迁移成本矩阵与一次完整决策记录,用九组测试验证 SSR 何时退回 CSR、CSR 何时升级 SSG,并说明为什么没有触发条件时也要留下复核日期,判定不追求先进模式,只追问前提是否仍然成立。
服务端与客户端首帧不一致通常来自时钟、随机数、本地状态与权限四个来源,本节用字段级帧对比把它们分开,给出可运行的 TypeScript 差异检测器与八组测试,检测器不依赖浏览器,只在进程内比较两棵字段树并标出可延后项,所有结论都由测试固定,方便照搬到自己的组件树。
把 CSR、SSR、SSG 与流式放回成本与页面类型的约束里,用七项页面特征推导渲染模式,给出可运行的 TypeScript 选择器与七组测试,逐条说明每种模式被拒绝的理由,并复盘一次把商品详情页从 SSR 改成 SSG 的收益与回退边界,所有结论都用本机测试固定。
从内容哈希、缓存头语义、版本兼容窗口和旧资源退役四条线,给出可运行的 TypeScript 缓存决策函数与八组测试,解释 immutable 的前提、HTML 与 Service Worker 为什么必须回源校验,以及灰度窗口内旧哈希文件应该保留多久。
把构建产物的体积拆成产物、模块与包装开销三个口径,给出按模块归因、按预算阈值判定 pass/warn/fail 的 TypeScript 检查器与八组测试,讨论重复模块、贡献榜和超限后的处理顺序,并说明为什么抬高预算通常是最后而不是最先做的动作。
从「回声」首包翻倍的发布事故出发,把模块依赖图、静态闭包、懒加载边界与共享模块提升写成可运行的 TypeScript 分包算法,给出按路由与按交互分包的判定表、六组真实测试输出,并说明首包大小为什么必须和任务路径一起判断,而不能只看一个总数。
可访问性不是上线前的一次性检查,而是可以被数据描述的交互边界。本节把「回声」的焦点顺序、键盘可达、角色与标签、触摸目标尺寸写成纯数据规则,用 TypeScript 实现不依赖 DOM 的检查器,并用真实测试说明正 tabIndex、图标按钮缺名称、小触摸目标分别怎样被拦住。
受控与非受控不是二选一,而是同一条状态转移链上的三种模式。本节以「回声」搜索框为例,用纯函数实现 value 接管、defaultValue 作为种子、受控移除后的回退,以及状态提升的四个判据,并用真实测试说明切换模式时哪些值会保留、哪些警告必须记录。
组件契约不是一份文档,而是可以被校验的数据结构:props、事件、插槽、状态与可访问性各有明确边界。本节把「回声」搜索框的契约写成 TypeScript 结构,给出契约自检与调用校验两套规则,并用真实测试输出说明重复属性、必填默认值、受控缺处理器等问题如何在编码前被拦住。
从「回声」在地铁里发出的一条消息出发,把离线写入拆成落盘队列、严格重放、幂等键与冲突合并四步,给出可运行的 TypeScript 队列与九个真实测试,逐条说明 last-write-wins 的边界、字段级合并的判据,并复盘一次超时重试造成重复下单的事故。
把端上缓存拆成键设计、新鲜窗口、可陈旧窗口与离线回退四件事,给出「回声」四类资源的策略表和一个可运行的 TypeScript 读缓存实现,用九个不依赖真实时钟的测试验证 stale-while-revalidate、单飞刷新、持久化与淘汰,并复盘一次把订单状态缓存过久的事故。