html-validate的json schema配置须显式禁用低优先级规则如attr-duplication,仅保留attr-req-alt、attr-req-href、head-script-disabled三条硬性规则,并按文件类型分设配置、独立ci job执行且强制--max-warnings 0。

html-validate 的 JSON Schema 配置必须显式禁用低优先级规则
默认配置里 attr-duplication、attr-name-style 这类规则在大型项目中几乎必误报——尤其当模板里混用 v-if、ng-click 或自定义属性时。它们不是错误,而是上下文缺失导致的误判。
真正该保留的硬性规则只有三条:attr-req-alt(防布局塌陷)、attr-req-href(防空链接跳转失败)、head-script-disabled(防脚本阻塞渲染)。其他全部建议关掉,或按子目录分级启用。
- 在
.htmlvalidate.json中用"extends": ["html-validate:recommended"]基础继承,再用"rules"字段逐条覆盖 - 对 Vue 模板路径(如
src/**/*.vue)单独跑npx html-validate --config .htmlvalidate.vue.json,其中关闭attr-name、开启attr-req-quotes - 别依赖
ignore字段跳过文件——它等于放弃检查;应改用files字段限定扫描范围
htmllint 多类型 HTML 文件必须分配置、分命令调用
一个微前端项目里,public/index.html、src/App.vue 里的 <template></template>、src/templates/*.njk 本质是三类 HTML:纯静态、Vue 模板、Nunjucks 模板。htmllint 不支持 per-file-type 配置,强行共用一套规则必然误报或漏检。
正确做法是构建层隔离:用 htmllint-cli 分批执行,每类传不同配置文件。
- 静态页:
htmllint --config .htmllintrc.static public/**/*.html,启用img-req-alt和attr-quote-style - Vue 模板:
htmllint --config .htmllintrc.vue src/**/*.vue,关闭attr-name,加"attr-bans": ["v-", "data-v-"] - Nunjucks:
htmllint --config .htmllintrc.njk src/templates/**/*.njk,加"attr-bans": ["{{", "{%"]防模板变量被误判为属性值
CI 中 html-lint job 必须独立于 build,且设 --max-warnings 0
常见错误是把 HTML 扫描塞进 build 步骤后,结果构建失败了 lint 根本没跑;或者漏加 --max-warnings 0,导致警告照过、校验形同虚设。
GitHub Actions 中应单独声明 html-lint job,只依赖 checkout,不依赖 build,并强制失败阻断。
- 命令示例:
npx html-validate --config .htmlvalidate.json --max-warnings 0 --format json src/**/*.html - 路径必须匹配实际存放位置——Vue 项目常在
src/**/*.vue,纯静态项目多在public/或src/templates/ - 输出
--format json是为了后续解析问题聚合,别用默认的 CLI 格式,否则无法接入质量看板
eslint-plugin-html 对内联 HTML 的处理必须配 processor + overrides
它不自动识别 *.html 文件,也不直接校验 HTML 结构;本质是把 HTML 提取成字符串,交由 ESLint 解析 JS 逻辑。没配 processor 就会报 ParseError: Unexpected token。
且它只管 <script></script> 和 <style></style> 块里的 JS/CSS,对 <template></template> 或 v-html 内容无效——这部分得靠 eslint-plugin-vue 或 eslint-plugin-react 补位。
- 在
.eslintrc.js的overrides中声明:files: ["*.html"], processor: "html/eslint-plugin" - 它能捕获
innerHTML = "<div onclick="alert(1)">" 这类 XSS 风险,但无法发现 <code><img clss="logo">这种拼写错误——后者仍需htmlhint或html-validate - 若项目含 JSX,
jsx-a11y/alt-text规则比任何 HTML Lint 都早介入,直接在<img src="%7Bx%7D">行标错,修复成本最低
真实项目里最麻烦的从来不是规则多不多,而是动态 HTML 边界——比如
innerHTML、v-html、dangerouslySetInnerHTML。这些地方静态分析工具全部失效,只能靠 no-innerhtml 规则拦截 + DOMPurify.sanitize() 在运行时兜底。











