发布检查:这个页面准备好了吗?
发布日带来了页面的大部分受众,而第二天的修复会错过大部分人。在帖子发布之前把它做好。
此检查清单适用于任何页面。**请勿包含页面名称和页面数据:**在这里写一条新的通用规则,并将页面及其数字保留在项目自己的笔记中。
如何运行
- 命名页面。 它的类型(文章或故事、工具或游戏、中心页面),一句话概括其工作,以及它的步骤:到达 → 可用 → 首次使用 → 主要操作 → 成功了 → 下一步。折叠不适用的步骤。不要仅仅为了满足检查而添加输入、数字或操作。
- 提供本地构建(
dist/或开发服务器)并阻止分析。切勿打开线上页面。 - 在下面四个屏幕上进行每一项检查。 将每个结果标记为通过、失败、未验证或不适用,并附上原因。对于需要判断的检查,写下你看到的内容(你复述的句子,你查看的截图),而不仅仅是“通过”。
- 阻塞器: 修复它或获得用户的明确豁免,如果未验证则进行验证。建议: 报告它;它不会阻止发布。
- 将结果写入项目笔记或任务板, 统计全部 29 项检查:
发布检查:25 通过,1 失败,1 未验证,2 不适用;阻塞器:U1 失败;建议:S3 未验证;不适用:U2(无输入),U3(无等待)。
屏幕: 手机 390×844,平板 820×1180,笔记本电脑 1366×768,大桌面 1920×1080。检查每一个;宽布局和窄布局一样会移动内容。确认布局失败时使用截图,因为仅凭源代码无法显示它们。
浏览器: 无头 Chromium(Playwright)就足够了,因为本地构建不需要登录。在加载页面之前,在该标签页上阻止你的分析主机(page.route(/your-analytics-host/, r => r.abort())),以便检查永远不会计为访问。
按页面类型:
- 文章或故事: 继续滚动是下一步操作,因此 U2 为不适用,如果无等待则 U3 也为不适用。
- 工具或游戏: T2 涵盖页面上的任何文本;首次使用必须给出真实结果。
- 中心页面: 回报是找到正确的东西,因此 T1 意味着每个链接都履行其承诺。
钩子
- H1 · 阻塞器。仅从首屏,在任何尺寸下,你可以用一句话说出访客能得到什么。 回报,而不是主题。写下那句话。如果你写不出来,或者它只命名了主题,则此项失败。
- H2 · 建议。首屏给陌生人一个继续的理由: 一个具体的发现、数字、结果或问题,并且是真实的。即使有人从没有上下文的帖子到达,它也应该有效。
- H3 · 建议。链接预览做出相同的承诺。
og:image、标题和描述说明回报。在构建中检查标签和图像。 - H4 · 阻塞器。第一个操作在任何尺寸下无需滚动即可看到,并且明显看起来像一个操作, 具有足够的对比度。在滚动故事中,第一个操作是滚动:可见的滚动提示通过。
主体
- T1 · 阻塞器。主体兑现了钩子的承诺,并且要早。 回报不要等到最后。如果页面很长,先提供一个简短版本,其余是访客的选择。
- T2 · 阻塞器。从头到尾读起来不错。 按顺序阅读所有内容,像一个陌生人一样。每个部分都承接前一部分并有所增加,没有填充内容,你可以用一句话复述整个内容。
- T3 · 建议。每屏一个主要点或数字。 其余部分放在表格或“更多”后面。如果页面没有数字或发现,则不适用。
- T4 · 阻塞器。每个数字和声明都有来源,并且所有隐藏的内容都有效。 打开每个抽屉、标签和手风琴,并遵循每个来源链接。关闭的部分仍然是页面的一部分。
- T5 · 建议。文案通过了作者的风格规则和 AI 写作痕迹检查, 没有留下占位符、草稿或调试文本。页面文案以用户名义发布,所以报告问题并询问;不要独自改写。
屏幕
- S1 · 阻塞器。在所有四个屏幕上,每一步看起来都正确。 在每一步之后截取屏幕截图,并检查每一个:没有内容被截断、重叠或未设置样式(脚本创建的元素可能缺少作用域 CSS),没有侧向滚动。在进行搜索或选择移动地图后,检查结果是否落在未被面板覆盖的部分,在所有尺寸下。
- S2 · 阻塞器。所有文本在其渲染尺寸下可读。 测量它,不要凭眼力判断,目标是 12 px 或更大。对于 SVG 图表:字体大小 × 渲染宽度 ÷ viewBox 宽度。
- S3 · 建议。在手机上 2 秒内可用。 可用意味着第一个操作生效的最早时间点。从加载开始计时,使用冷缓存和指定的手机 CPU 和网络配置文件。未节流的桌面运行不能显示手机通过。
- S4 · 阻塞器。慢速加载和失败加载看起来都正确。 测试节流网络(CDP
Network.emulateNetworkConditions,9 / 1.6 / 0.75 / 0.4 Mbps)和失败加载。像 CDN 一样使用压缩进行计时;未压缩的本地服务器会夸大每个等待时间。从冷启动开始,每 0.5 秒截取一次加载交接过程中的屏幕截图,并检查帧。保持最后一张良好的图片并显示加载标签;回退仅用于失败。在加载期间和失败之后,标签必须正确。如果没有内容加载较晚,则不适用。
使用
- U1 · 阻塞器。在每一步之后,下一个控件在页面离开访客的位置,在所有尺寸下都显示在屏幕上。 分别测试进入每一步的每种方式(示例、输入、点击)。检查每个滚动目标、固定标题和折线。
- U2 · 建议。存在一种一键进入的方式(示例或预设)位于任何自由格式输入旁边,并且事件说明了使用哪种方式。没有自由格式输入则不适用。
- U3 · 阻塞器。任何超过 2 秒的等待都会显示进度,并以清晰的结果或清晰的错误结束。 本地驱动延迟响应和失败响应。永不结束的微调器失败。如果没有操作等待,则不适用。在其脚本加载之前显示的控件(用于延迟加载地图的表单)必须工作或排队:在加载期间和失败加载后使用它。未处理的表单提交会重新加载页面。
下一步
- N1 · 建议。在成功的那一刻有一个清晰的下一步: 相关页面、尝试另一个、再玩一次。把它放在成功发生的地方,而不是在页脚。
- N2 · 建议。发送发现的分享按钮: WhatsApp、Facebook、X 和复制链接,每个都附带一句包含发现的句子,而不仅仅是标题,放置在结果出现的位置。这句话是公开文案,所以由用户措辞:询问。没有发现的中心页面仍然需要用户提供一个句子。不要独自编造或将其标记为不适用。
share事件仅发送网络信息,绝不发送文本或 URL。
搜索
谷歌的 AI 答案(AI Overviews、AI Mode)从普通搜索索引中获取页面:带有摘要排名的页面可以被引用,并且不需要 AI 专用文件或标记。结构化数据必须与页面显示的内容匹配。
- F1 · 阻塞器。页面可以被索引: 一个规范地址,没有杂乱的
noindex,列在站点地图中。过于薄弱无法排名的页面(仅链接到其他地方的存根页面、空列表)则应排除在搜索之外:使用noindex并从站点地图中移除,没有其他语言版本指向它。 - F2 · 建议。标题说明页面内容, 而不仅仅是站点名称,名称放在末尾;描述是页面独有的,并且不出现在任何其他页面上。
- F3 · 建议。可见的行说明谁制作了它、何时发布以及数据有多新, 结构化数据中具有相同的发布日期。只有在内容真正改变时才更改修改日期。中心页面不适用。
- F4 · 阻塞器。HTML 中的每个图像都有来源和真实的替换文本, 包括仅在没有 JavaScript 时显示的图形。空白的
<img>失败。 - F5 · 建议。基于数据构建的页面提供数据: 经隐私检查后的 CSV(仅限页面已显示的字段),下载旁边的许可证行,以及
Dataset标记。视频获得带有海报的VideoObject标记。如果页面两者都没有,则不适用。
发布后:在 Search Console 中请求页面索引(用户的账户,所以询问),如果项目维护 AI 答案问题列表,则将页面回答的问题添加到其中。
衡量
检查假设使用隐私友好的事件跟踪器(Umami、Plausible 或类似工具)以及自定义事件。
- M1 · 阻塞器。事件位于发布的构建中。 每个适用步骤一个事件,每个操作一个事件,成功是效果而不是点击,
*-leave事件给出最远的步骤和停留时间。 - M2 · 阻塞器。事件通过真实的跟踪器触发。 存根跟踪器函数可能隐藏丢失的事件。在生产主机名上运行真实跟踪器,使用
context.route提供本地构建并捕获跟踪器的发送端点,以便没有任何内容离开机器。驱动每个控件,跳转链接也是:每个事件描述其操作,失败不发送成功,跳过内容不发送阅读事件。在同一标签页中跟踪一个出站链接并检查*-leave事件仍然到达:在页面卸载时启动的请求可能会丢失,因此此类链接在新标签页中打开。 - M3 · 阻塞器。事件列在项目的
docs/analytics.md中,包含上线时间,并且漏斗规范位于docs/funnels/中(将其保存在分析工具中需要用户的同意)。 - M4 · 阻塞器。访客输入或选择的任何内容都不会发送到分析: 页面浏览量中不包含哈希(排除哈希),没有查询文本,没有地点。仅限固定标签和桶。
- M5 · 阻塞器。在发布前写下目标(你期望达到的每步数字),以便发布后的审查有东西可以比较。
- M6 · 阻塞器。代理远离线上页面, 因为它们的访问计为真实流量。可以指向线上页面的检查脚本必须自身阻止分析。