必须开启tag-pair规则,因为它默认启用且能精准捕获文本等嵌套错位或漏闭合问题,定位到具体行列号,避免浏览器自动修复掩盖dom结构错误,防止js选不到元素、css作用域失效及ssr不一致。

htmlhint 的 tag-pair 规则为什么必须开
它直接捕获 <div><p>文本</p></div> 这类嵌套错位,而不是靠浏览器“自动修复”蒙混过关。DOM 结构一旦错乱,JS 选不到元素、CSS 作用域失效、甚至 SSR 渲染结果不一致。
关键点:
-
tag-pair默认启用,不用额外配置;但若项目含.ejs或.vue模板片段,得在.htmlhintrc里加"ignore": ["**/*.vue", "**/*.ejs"],否则误报 - 它不管
<img>写不写斜杠,只管“有开无闭”或“闭多于开”——比如<p>hello</p>后面没,后续所有内容都会被包进这个p里 - 错误输出带精确行列号:
index.html:12:5: Tag must be paired.,比肉眼扫快得多
attr-lowercase 和 attr-value-double-quotes 怎么配才不翻车
这两个规则看似琐碎,实际是 CI/CD 流水线里最常爆红的点。不是语法错,而是工具链对大小写和引号敏感。
常见踩坑:
-
attr-lowercase会把<div class="foo"> 当错误,哪怕只是临时调试——团队统一用小写是底线 <li> <code>attr-value-double-quotes在 Vue 模板里容易报错:v-bind:class="{'active': isActive}"中的单引号会被当成违规;此时应设"attr-value-quote-style": "double"(需 HTMLHint v1.0+),或干脆关掉 - 内联 JSON 属性如
data-config='{"key":"val"}',双引号嵌套极易出错,建议关掉该规则,改用data-config='{"key":"val"}'+ 单引号包裹整个值 - 命令行临时关闭:
npx htmlhint --rules attr-value-double-quotes:false index.html - 文件名必须是
.htmlhintrc(带点开头),后缀只能是.json或.js(后者需module.exports = {...}) - 运行
npx htmlhint src/**/*.html时,.htmlhintrc必须在项目根目录,不能在src/下 - 路径含
**时,命令参数必须用双引号包裹:npx htmlhint "src/**/*.html",否则 shell 提前展开失败 - 子目录单独配置?只能用
--config显式指定:npx htmlhint --config src/pages/.htmlhintrc src/pages/*.html - 右下角状态栏确认是
HTML,不是HTML (Vue)或Plain Text;files.associations若把*.html关联到php,HTML 设置完全不加载 - 检查
"html.autoClosingTag": true(默认开启,但可能被工作区设置覆盖) - 禁用干扰插件:Prettier 的
prettier.bracketSameLine或prettier.htmlWhitespaceSensitivity会劫持闭合逻辑 -
Auto Rename Tag只在光标落在开始标签名上(如div在<div> 中)且有对应闭合标签时才触发;<code><img>这类 void element 不支持重命名真正难搞的是模板混合场景:.vue 文件里的
<template></template>块,闭合行为由 Volar 控制,VSCode 原生设置基本无效。这时候得看 Volar 的配置优先级,而不是狂调 VSCode 设置。
.htmlhintrc 放错位置就等于没配
HTMLHint 只向上查一级父目录找 .htmlhintrc,不会递归扫描。放错地方,规则全失效。
实操要点:
VSCode 自动闭合和重命名为什么有时不生效
不是插件坏了,大概率是语言模式或设置冲突。它只在纯 HTML 模式下工作,且依赖底层开关没被覆盖。
排查顺序:











