eslint-plugin-jsx-a11y与html-validate须协同使用,覆盖JSX动态逻辑与纯HTML片段。重构时绑定构建和CI检查可避免90%退化。自定义data-属性应限定前缀白名单,嵌套section或div无标题时须加aria-labelledby。质量跃迁关键在于将校验规则绑定到具体角色,并纳入代码审查。
eslint-plugin-jsx-a11y与html-validate必须协同使用:前者专检JSX动态逻辑(如aria-hidden={isMenuOpen 'false' : 'true'}),后者覆盖纯HTML片段(如SSR模板、CMS输出),二者互补缺一不可,共同构成全链路无障碍质量门禁。

HTML 代码质量不会靠“重写一遍”自动提升,关键在约束机制和渐进式落地路径。没有统一语义规范、不绑定构建流程、不接入 CI 检查的重构,90% 会退化回老样子。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
eslint-plugin-jsx-a11y 和 html-validate 必须同时使用仅依赖 eslint-plugin-jsx-a11y 无法覆盖纯 HTML 片段——例如服务端渲染模板、CMS 输出块、遗留的 innerHTML 注入。反之,只靠 html-validate 又无法检测 JSX 层面的动态属性逻辑,典型场景如 aria-hidden={isMenuOpen 'false' : 'true'} 写反了,这类错误在纯 HTML 扫描中根本不会暴露。
在实际操作中,可以这样搭建:
html-validate 的 CLI 模式扫描 src/**/*.html 和 public/**/*.html,配置 "valid-lang": "error"、"require-skip-link": "warn" 等强规则jsx-a11y/aria-props、jsx-a11y/heading-has-content,同时将 rulesDirectory 指向团队自定义规则——例如禁止 div[role="button"] 但未绑定 onKeyDown 的情况aria-required-child 错误,另一个报 duplicate-id,任一个不通过就直接阻断 PR 合并data-* 属性不成为新的混乱源重构时常见的做法是将旧 class 名批量替换为 data-component 或 data-track-id,结果几个月后满屏 data-xxx,语义比 class 还难读。要避免这种局面,关键在于提前限定好规则。
实操建议:
data-ui-(仅用于组件边界识别)、data-track-(仅埋点)、data-test-(仅测试定位),其他一律禁止data-ui-* 必须在设计系统文档中注册,例如 data-ui-tabs-container 对应 Tabs 组件根节点,该值不可由业务层覆盖data-,匹配正则 /^data-(!ui|track|test)/ 并直接报错 和 时,什么情况下必须加 aria-labelledby当 不包含标题元素(),或者标题是视觉隐藏但未用 –
aria-label / aria-labelledby 关联时,屏幕阅读器无法建立内容层级,整块区域会被直接跳过。
常见错误场景:
包裹,内部只有 用户统计——没有 heading 标签 用 CSS 隐藏了标题文字,仅靠图标示意实操建议:
–
的 或 ,必须有 aria-labelledby 指向页面内真实存在的 ID,且该 ID 所在元素需有可读文本(不能是空的 )html-validate 规则 "require-valid-alt" 扩展为自定义规则 "require-section-label",在 CI 中检查Section 组件默认渲染 ,id 由组件自动生成并注入对应 ,业务方不可绕过真正决定 HTML 质量跃迁的,从来不是语法对错,而是“谁有权改”和“改错谁负责”——所有校验规则必须绑定到具体角色(设计师提交 PR 时触发无障碍扫描,前端提交时触发语义结构检查),否则再好的规则也只是一份 PDF。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述