html语义化缺失导致自愈失败,因自愈依赖原生语义标签(如)作为锚点;伪自愈(正则替换)不可靠,需基于ast解析;必须运行期守护+可审计回滚,避免干扰业务逻辑。

HTML语义化缺失会直接触发自愈失败
自愈机制不是万能的“兜底开关”,它依赖原始HTML具备基本结构信号。如果整页都是 <div class="header">、<code><div class="content"> 这类无语义容器,自愈系统无法识别导航区、主内容、时间信息等意图,也就无从注入语义修复或无障碍树补全逻辑。
<p>常见错误现象包括:自愈日志中反复出现 <code>"no semantic anchor found";生成的 ARIA 属性被忽略;屏幕阅读器仍读作 “group” 而非 “navigation”。
- 必须保留至少一级原生语义标签(如
<header></header>、<main></main>、<nav></nav>、<time></time>)作为自愈锚点 - 避免用
<div role="banner"> 替代 <code><header></header>—— 前者需手动维护aria-*,后者自动进入无障碍树 - 对存量页面做最小干预:用正则批量替换
<div class="footer"> → <code><footer class="footer"></footer>,保留 class 不影响样式自愈规则需绑定 HTML 解析上下文而非字符串匹配
很多团队尝试用 ESLint 插件或正则脚本做“伪自愈”,比如全局替换
<img src="x">为<img src="x" alt="">。这种做法在多层嵌套、模板插值、SSR 渲染场景下极易误伤,且无法区分真实缺失与故意留空(如装饰性 SVG)。真正可靠的自愈必须运行在完整 DOM 解析后阶段,依赖浏览器或服务端解析器输出的节点树。
- 推荐使用
parse5(Node.js)或DOMParser(浏览器)构建 AST,再基于节点类型+属性存在性做判断 - 对
<img>自愈:仅当src存在且alt完全缺失(非空字符串)时才注入默认占位文本,如alt="image" - 对
<a></a>自愈:检测href但无文字内容或仅含空白时,不强行塞文字,而是标记为data-heal="link-empty"并告警,交由人工确认
自愈不是一次性的 lint 修复,而是运行期持续校验
把自愈当成构建时的一次性检查,等于放弃 80% 的真实风险场景。用户交互、动态加载、第三方脚本注入都可能在运行时破坏语义结构 —— 比如某个埋点 SDK 动态插入
<div id="tracker-overlay"> 遮盖了 <code><main></main>,导致无障碍树断裂。高可靠机制必须包含运行期守护层。
- 在
window.addEventListener('DOMContentLoaded', ...)后启动首次语义快照校验 - 监听
MutationObserver,对新增节点实时触发轻量级语义检查(仅限<img>、<button></button>、<a></a>等高风险标签) - 对关键区域(如
<main></main>)设置存活断言:若其childElementCount === 0或被display: none覆盖超 3 秒,触发降级提示而非静默修复
自愈输出必须可审计、可回滚、不可覆盖人工决策
最常被忽略的是:自愈行为本身可能成为新的故障源。曾有团队因自愈系统自动给所有
<button></button>加上type="button",结果意外中断了表单默认提交逻辑,线上支付按钮集体失灵。任何自愈动作都应满足“三可”底线:可查谁改的、可退到前一版、不可绕过人工 review。
- 所有自愈操作必须写入
document.documentElement.dataset.healLog,格式如"img-alt-20260630-1422:fixed" - 禁止直接修改
innerHTML,一律使用setAttribute()或insertAdjacentHTML()并打上data-healed="true"标记 - 在 DevTools Console 输出带堆栈的修复日志,例如:
[HEAL] <img> missing alt → added alt="decorative" (src: app.js:123)
- 推荐使用











