I2.08.3local failure not whole-page dead设计
局部失败不应导致整页不可用
别名: 局部失败隔离 · 不要一处挂整页 · partial load error
概念解释
一页里常有若干独立的加载:主列、侧栏、评论、推荐、头图。其中一块通道失败,只该让那一块进入失败呈现,其余已成功或仍可操作的部分继续可用。用整页错误屏、整页转圈或整页空态去接一块侧栏的 500,是把失败的范围从通道扩大到了任务。人要读的文章还在,却因为推荐接口挂了而不能滚、不能复制、不能走主按钮。
机制
失败范围默认会沿着最省事的错误处理往上爬:一个未捕获的拒绝变成路由级错误边界,于是整棵树卸掉。对实现这很干净,对任务这很脏。任务通常只依赖其中一块(正文),其余是增强。增强的通道死了,不应剥夺依赖已满足的那部分。隔离把错误边界画在模块边上:主列有自己的失败,侧栏有自己的失败,互不持股。
不隔离的代价是可用面积塌缩。人会把「整页红了」理解成「这件事做不了」,即使日志里正文 200。他们离开、刷新整页、或重复提交已经成功的那部分。范围错误比文案错误更硬,因为文案再准确,控件已经不在了。
边界
主列自己失败、没有它任务就不成立时,整页失败是诚实的范围,不是扩大。共享的认证失效(会话过期)会让所有块同时失去意义,应升到整页,而不是每个模块各画一套过期。布局上互相卡住的块(主列高度靠侧栏才能算)在侧栏失败时可能真的排不出主列,那是结构把范围绑死了,应把布局解耦,而不是因此认为整页失败合理。关键路径上的壳(导航、身份)失败,剩下的内容会失去去处,整页失败可以成立;评论失败不行。
怎么落地
- 按模块设错误边界:一块请求失败只替换那一块,不要卸载路由。
- 已成功的块保持可交互:选择、复制、主操作、滚动,不因邻居失败而禁用。
- 壳(导航、身份)与增强(推荐、评论)分开;只有壳或主任务块失败才升到整页。
- 验证:让推荐接口 500,正文正常。整页若变成错误屏或主按钮消失,范围就扩大了。正确是正文可读可操作,推荐位自己失败并带就近重试。