先给结论:不要试图用一份“通用组件验收清单”覆盖所有页面,而应为该组件出现的每一类页面环境分别构造最小可复现样例,把页面差异当作验收变量而非噪声。下面用一个假设情境把决策过程走完。
假设你做的网站里有一个“折叠面板”组件,它在文章页正常展开,在列表页却默认全部展开、点不动。新手常见的两种反应是:一是直接改组件代码,让它“更健壮”;二是给列表页单独写一套样式覆盖。两者都可能成立,但前提不同。
先做一次区分性检查:把同一份组件代码分别放进两个最小页面,一个只保留组件本身,一个保留列表页的父容器、栅格和相邻脚本。如果差异只在后者出现,问题大概率来自页面环境(父级样式、脚本执行顺序、容器宽度或事件绑定范围),而不是组件逻辑。这个判断决定你接下来是改组件还是改页面。
做法一:统一到组件层修复。适用条件是差异根源确实在组件内部,比如它依赖某个全局类名、或对父级宽度做了硬编码假设。代价是你要回归所有用到该组件的页面,修改面大,但长期维护成本低。
做法二:在页面层做局部适配。适用条件是差异只出现在个别页面的特殊布局中,且组件本身在多数场景表现一致。代价是同一组件出现多份覆盖规则,后续改组件时要同步检查这些例外,容易积累隐性债务。
选择依据不是“哪个更快”,而是差异出现的页面数量与差异原因是否同源。若三个以上页面出现同类异常,倾向做法一;若仅一个页面因特殊容器导致,做法二可接受,但要写清例外原因。
验收样例的价值在于可复现。每个样例至少包含两部分:
假设情境继续:你为折叠面板写了三个样例——文章页正文内、列表页卡片内、侧边栏窄容器内。运行后发现只有侧边栏样例失败,原因是容器宽度小于组件设定的断点,触发了另一套样式分支。这个结果直接告诉你:下一步不是改组件主逻辑,而是明确该组件在窄容器下的预期行为,并决定是禁止在此容器使用,还是补一个窄屏分支。
当团队里有人报告“这个组件在某个页面不对”,口头描述往往丢失关键环境。更实际的动作是:把出问题的页面裁剪成一个只保留必要父容器和脚本的最小页面,作为验收样例的载体。
这个动作的结果会影响下一步:如果最小页面仍能复现,说明差异来自被保留的那部分环境,可以逐项删除定位;如果最小页面无法复现,说明差异来自被裁掉的部分,需要回到原页面继续排查。它把“猜原因”变成“缩小范围”。
构造样例时,把当前假设写进样例说明,例如“假设差异由父级 flex 布局引起”。每次运行样例后更新假设状态。这样做的原因是:同一组件在不同页面的表现差异,可能来自样式、脚本、数据加载时机或渲染顺序,单次现象不足以证明根因。把假设显式记录,能让后续修改有据可查,也避免把一次偶然的刷新结果当成稳定结论。
当样例全部通过后,再决定是否把其中稳定的环境组合固化为回归样例,供以后改组件时复用。到此,验收样例才真正服务于决策,而不只是走一遍流程。