必须在 vite build 的 buildStart 钩子中用 execSync 调用 htmlhint 并失败退出,才能真正拦截 HTML 问题;它不依赖 vite-plugin-html,避免事后审计,确保缺失 alt、重复 id 等语义错误在构建早期阻断。

HTML 代码质量校验不能靠肉眼或“构建完再看”,必须在构建流程中卡住。直接集成 htmlhint 是最轻量、最可控的方式,它不依赖 Vite 官方插件,也不需要改写 HTML 模板语法,就能在 vite build 阶段自动失败并报错。
为什么不用 vite-plugin-html 做校验?
vite-plugin-html 的核心是模板渲染与注入,不是静态分析。它能压缩、能插标签、能动态填 ,但对 alt-require、id-unique、meta-charset-require 这类语义规则完全无感知。你配了 minify: true,它照样把缺 alt 的 压缩进去 —— 校验环节根本没发生。
常见错误现象:vite build 成功,但生成的 HTML 里有重复 id、缺失 title、src 属性为空,CI 环境里才被 QA 发现。
- 它不读取
.htmlhintrc,也不触发规则检查 - 即使你手动调用
htmlhint,若没和构建流程绑定,开发时很容易跳过 - 它的 EJS 渲染发生在构建中后期,此时 HTML 已生成,校验只能当“事后审计”
如何让 htmlhint 在 vite build 中真正生效?
关键不是“能不能跑”,而是“能不能阻断”。推荐用 buildStart 钩子 + execSync 强制校验,失败即 process.exit(1)。
在 vite.config.ts 中加入这个插件:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
import { execSync } from 'child_process'
<p>export default defineConfig({
plugins: [
{
name: 'htmlhint-check',
buildStart() {
try {
execSync('npx htmlhint src/*<em>/</em>.html', { stdio: 'inherit' })
} catch (error) {
console.error('❌ HTMLHint 检查失败,请修复 HTML 问题')
process.exit(1)
}
}
}
]
})
</p>
- 必须用
buildStart,不是buildEnd:否则压缩后 HTML 已写入磁盘,错误无法拦截 -
stdio: 'inherit'能把htmlhint的原始报错(含行号、规则名)直接打到终端,比如src/index.html:12:5 error tagname-lowercase Expected tagto be lowercase.
- 不要用
npm run lint:html && vite build这种脚本链:CI 环境里一旦前半段失败,后半段不会执行,但本地开发容易误点vite build绕过校验
配置 .htmlhintrc 要避开哪些坑?
规则不是越多越好。开太多会把历史遗留 HTML 或第三方组件模板(如某些 UI 库的 demo 页面)直接干掉,反而阻碍落地。
建议从这 5 条基础规则起步,覆盖 80% 易出错场景:
{
"tagname-lowercase": true,
"attr-lowercase": true,
"attr-value-double-quotes": true,
"id-unique": true,
"alt-require": true
}
-
doctype-first和title-require看似合理,但如果你用vite-plugin-html动态注入,校验时模板还没渲染,会误报 -
src-not-empty对懒加载图片(data-src)、占位图(src="")不友好,建议关掉 - 规则名必须全小写、连字符分隔,写成
"TagnameLowercase"或"tagname_lowercase"都无效
真正难的不是加一行 execSync,而是让团队习惯在保存 HTML 后立刻看到报错 —— 不是等打包失败,也不是靠 PR 评论提醒。校验必须快、必须准、必须拦得住,否则就只是个装饰。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










