《互联网产品的客户端架构·交易、增长与平台化》3.1 购物车归属:本地车、服务端车与合并
游客购物车与服务端购物车合并,是交易端最容易被低估的一次状态冲突。本节把同 SKU 的数量策略、下架与删除的处理、时间戳与多端并发写成可测试的纯函数,验证合并顺序、上限截断与本地未同步修改的保留,并复盘一次登录合并把失效商品带进结算的事故。
tag
游客购物车与服务端购物车合并,是交易端最容易被低估的一次状态冲突。本节把同 SKU 的数量策略、下架与删除的处理、时间戳与多端并发写成可测试的纯函数,验证合并顺序、上限截断与本地未同步修改的保留,并复盘一次登录合并把失效商品带进结算的事故。
库存展示的核心不是「有货/无货」两个状态,而是可售、锁定、预售、区域限制与数据降级五件事。本节把端上的库存判断写成纯函数,明确它只能决定「是否允许尝试」、不能承诺有货,说明取不到库存时如何安全降级,并复盘一次把区域不可售误显示成售罄的展示问题。
规格选择看起来只是几个按钮,实际是一组组合约束:哪些组合存在、哪些组合缺货、切换一个维度后哪些已选值必须失效。本节把规格目录、可选值、默认选中、价格库存联动与提交前校验写成可测试的纯函数,并复盘一次「切换颜色后仍带着旧尺码下单」的典型问题。
商详页的价格、库存、时效常来自三个接口、三种新鲜度,端上拼页面时很容易拼出一个「不存在的商品」。本节用字段级来源标记、年龄标注、版本一致性与库存时效校验,给出一个可运行的合并视图与下单闸门,并复盘一次价格和库存来自不同快照的典型接口与展示问题。
交易端的测试最容易「全绿但线上出错」,因为很多问题只在进程边界与真实回调里出现。本节把 trade-lab 的验证分成 L1 纯计算、L2 进程内下单、L3 真实支付回调三级,给出每级的判定条件、命令与证据要求,并用一个可运行的分类函数把「这条逻辑该在哪一级验证」变成可执行的规则。
交易端的第一条约束不是选框架,而是给每个字段标注所有者:金额、库存、订单状态与支付结果归服务端,勾选与草稿归端上。本节把这条约束写成一个可测试的所有权模型,用 amountView 处理过期与预览、用 reconcileOrder 让服务端覆盖本地并记录差异,并复盘一次端上预演价覆盖服务端金额的事故。
交易端不是「商品页加一个购买按钮」,而是浏览、下单、支付、售后四条失败边界完全不同的链路。本节逐条说明每条链路需要哪些数据、哪些字段必须由服务端裁决、失败时用户能退到哪里,并给出一个把四条链路的依赖写成常量与校验函数的 TypeScript 模型,作为 trade-lab 的起点。
一份可以直接带进评审会的内容社交客户端清单:按面与状态归属、读路径、写路径、实时连接、降级、安全审核、可观测七组展开,每条给出判据、需要的证据与常见反模式,并附评审记录模板与一次完整评审示例,适合方案评审、版本复核、风险台账与评审前证据准备。
按用户症状组织的内容与实时排查手册:重复卡片、位置跳动、详情白屏、图片灰块、点赞回退、评论失败、上传卡住、消息丢失、未读数不准、审核态闪现、联想串结果。每条给出可观察信号、常见根因、验证步骤与修复方向,最后附一张总表,便于值班时按症状快速定位。
把短轮询、长轮询、SSE 与 WebSocket 放在同一张表里逐项对照:通信方向、成本、断线语义、鉴权方式与典型故障。附录给出每种通道的最小实现、Last-Event-ID 与心跳的处理方式,以及一张按产品约束与项目阶段选择通道的判定表。
把首屏、弱网、断线、内存、审核与多端一致写成六条质量属性场景,每条给出刺激、响应、度量口径、预算与证据等级,用风险分级函数排出优先级,明确本卷只验证到 L2、哪些结论必须留给卷三的交易一致性与真机基线,并复盘一次把测试全绿当成质量结论的教训。
用可控网络适配器与假时钟注入断网、慢网、乱序和断线,验证离线排队不产生副作用、重连后按高水位补拉、补拉与实时消息去重、部分响应保留剩余空洞,并复盘一次离线连点把点赞翻回原状的事故,说明每个故障场景的断言,以及为什么 L2 适配器不能替代真实 socket 与真机弱网。
把发内容、信息流出现、点赞、评论与实时回复串成一条 L2 端到端流程,用内存服务端与真实模块组合,逐步断言信息流、互动关系、评论时间线与未读角标的状态归属,并复盘一次刷新只插新条目、不覆盖旧计数导致的双计事故,说明组合验证能证明什么、不能证明什么。
卷三《交易、增长与平台化》的完整目录与学习路径:13 章 39 节,从交易端四条链路与 trade-lab 开始,依次覆盖商品库存、购物车、下单、支付、对账、优惠、会员、增长、实验、客服、埋点,最后以端到端收口;附章节依赖、三条阅读路径与读完应能回答的六个问题。
卷三前言:交代四卷分工与本卷十三章的结构、写作顺序、贯穿案例「回声」的轻交易、trade-lab 的目录与三级可运行性、代码与命名约定、错误处理口径、读者对象与自检方法;附三个动手练习与勘误反馈渠道,说明为什么用 Node 26 与零第三方依赖。
卷三的序:从卷一的结构、卷二的流动,走到交易端的「可信」。交代为什么交易不能沿用内容的容错策略,四条核心判断、判断之间的互相约束、贯穿案例「回声」的轻交易场景与一笔订单的完整路径,以及本卷边界、与十三章的关系和为什么把「不确定」当成一等状态。
发现页不是换皮的信息流:运营位、榜单、专题与普通内容来自不同契约。本节用纯函数组合器实现固定槽位、跨源去重、占位与曝光 key,讲清位置为什么不能塌陷、去重优先级如何显式表达,给出可复用的布局校验规则,并复盘一次运营位为空导致整页错位的事故。
搜索结果页最容易丢的不是数据,而是状态:本节用纯函数 reducer 管理查询词、筛选条件、游标与版本号,讲清条件变化为什么必须重置游标、筛选如何安全放进 URL、返回时恢复什么,以及空结果与「没有更多」的区别,并复盘一次筛选后仍用旧游标翻页的事故。
联想框的难点在输入与响应之间:本节用可注入调度器的 TypeScript 控制器实现防抖、输入法组合抑制、取消在途请求与 latest-wins 版本号,解释缓存 key 为什么必须包含完整查询词,并复盘一次慢请求后到覆盖新结果的线上故障。
举报不是把一段文字发给服务端。本节用内存队列和假时钟实现举报负载、离线排队、去重、退避与成功回执,把举报时的内容快照冻结成不可覆盖的证据,给出快照、去重与退避共 8 条测试,并复盘一次作者编辑后证据被悄悄改写、举报被驳回的真实申诉失败事故。