能,但默认不开启;需显式启用a11y-aria-allowed-attr、a11y-lang、a11y-img-alt等规则,否则不校验aria-*属性和lang缺失或非法值。

html-validate 能否校验 aria-* 和 lang 属性缺失?
能,但默认不开启。它默认只检查基础语法,aria-* 属性、lang 值有效性、alt 文本语义质量等可访问性(a11y)规则必须显式启用。否则即使写了 <img src="x">,也不会报错。
关键配置项包括:
-
"a11y-aria-allowed-attr": true:拦截非法aria-属性(如aria-role) -
"a11y-lang": true:要求标签带合法lang值,且不能是空字符串或xx -
"a11y-img-alt": { "severity": "error" }:不只是检查有没有alt,还会拒绝alt=""(除非明确标记为装饰性) -
"a11y-heading-levels": true:防止跳级(如<h2></h2>后直接<h4></h4>),影响屏幕阅读器导航
为什么模板引擎注入的 HTML 会绕过 html-validate 校验?
因为 html-validate 默认只扫描物理文件(如 src/**/*.html),而模板引擎(Pug、Nunjucks、Vue SFC)生成的 HTML 是运行时拼接的——校验器根本看不到最终结构。
真实风险点:
-
#{title}或{{ title }}插入空值,导致<h1></h1>或<img alt="{{desc}}">渲染出空alt - 条件块中漏写
lang,例如if userLang:,但userLang为undefined时变成 - 构建插件自动注入
<meta name="viewport">到,但没加lang,导致根节点缺失
解决办法不是“等构建完再扫”,而是把模板编译步骤接入校验流程:用 pug-cli --pretty 输出静态 HTML 到临时目录,再让 html-validate 扫描该目录 —— 注意排除 node_modules 和构建产物路径。
如何让校验器识别模板语法并跳过误报?
直接禁用整行或整块最稳妥。html-validate 支持注释指令,比全局忽略更精准:
- 跳过单行:
<!-- html-validate-disable-next-line a11y-lang -->放在行上方 - 跳过某段模板逻辑:
<!-- html-validate-disable -->...<!-- html-validate-enable --> - 对 Pug 模板,在编译前用正则预处理:把
if user替换为// html-validate-disable-next-line a11y-img-alt\nif user,再交给校验器
切忌用 "ignore": ["*.pug"] 一关了之——这等于放弃对模板源码的可访问性控制。
CI 中自动拦截失败的关键配置陷阱
很多团队配了 html-validate 却没真正拦住低 a11y 代码,问题常出在三个地方:
- 配置文件名错误:必须叫
.htmlvalidate.json或html-validate.config.js,.htmlvalidaterc不被识别 - 规则 severity 设为
"warning":CI 默认只对"error"失败,警告不会中断 PR 流程 - 没覆盖全部入口:只校验
src/index.html,但项目有多个页面模板(src/pages/**.html),漏掉的文件完全不参与检查
最易被忽略的是:某些构建工具(如 Vite)会在 index.html 开头注入 <!-- built with vite -->,这会导致 doctype-first 规则失败,而该规则默认是 error 级别 —— 你得决定是删注释,还是把 doctype-first 降级为 warning 并人工复核。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











