standard-html 不适合 monorepo 的 html 规范统一,因其基于全局配置无法按子项目差异化启用/禁用规则,不支持 workspace-aware 路径解析,且不兼容 vite、webpack、astro 等现代构建流程。

HTML 代码质量在 monorepo 中无法靠 eslint 或 gts 自动覆盖,因为它们默认不处理 HTML 文件。必须额外引入专用工具链,并明确约束作用范围——否则子项目各自为政,index.html、template.html、iframe.html 等文件会迅速出现格式混乱、可访问性缺失、SEO 元素遗漏等问题。
为什么 standard-html 不适合 monorepo 的 HTML 规范统一?
standard-html 基于全局配置,无法按子项目差异化启用/禁用规则(比如 apps/web 需要严格校验 <meta name="viewport">,而 packages/ui 的 demo 页面可放宽);它也不支持 workspace-aware 路径解析,在 pnpm workspaces 下常报 Cannot find module 'standard-html',尤其当依赖安装在根 node_modules 而命令在子包目录执行时。
更关键的是,它不兼容现代构建流程:Vite 插件、Webpack loader、Astro 预处理器均无法直接接入其校验结果,CI 中失败后难以定位是模板语法错误还是 lint 配置路径错位。
用 html-validate + root-level 配置实现跨项目共享
推荐使用 html-validate,它支持 ESLint 式插件生态、可继承的配置文件、以及精确的 glob 匹配能力,适配 monorepo 的分层结构。
- 在 monorepo 根目录创建
.htmlvalidate.json,内容包含基础可访问性、语义化和 SEO 规则,例如:{ "extends": ["html-validate:recommended"], "rules": { "element-permitted-content": "error", "no-inline-style": "warn", "require-lang": "error", "valid-href": "error" } } - 所有子项目无需重复配置,只需在各自
package.json中添加脚本:"lint:html": "html-validate \"apps/*/index.html\" \"packages/*/demo/*.html\"" - 若某子项目需例外规则(如 legacy app 允许内联样式),可在其目录下放
.htmlvalidate.json并设置"extends": "../../.htmlvalidate.json",再覆盖局部规则
如何避免 HTML lint 在 CI 中误报或漏报?
常见陷阱不是规则本身,而是路径和上下文缺失:
-
html-validate默认不解析<script type="module"></script>中的动态模板字符串,若子项目用lit或htm写模板,需显式启用parserOptions.parser插件(如@html-validate/htm) - 路径通配符必须写全:用
"apps/**/index.html"会匹配到apps/mobile/dist/index.html(构建产物),应在 CI 脚本中加--ignore "**/dist/**" - Turbo / Nx 运行时不会自动继承根目录的
node_modules/.bin/html-validate,建议统一用 npx:npx html-validate --config ../../.htmlvalidate.json "apps/web/index.html" - 某些框架生成的 HTML(如 Next.js 的
_document.tsx输出)本质是 JSX,应排除在 HTML lint 范围外,加--ignore "**/_document.*"
真正难的不是配置工具,而是定义「哪些 HTML 文件算作源码」——是只管手写的 index.html,还是包括构建产物中的 404.html?是否纳入 Storybook 的 iframe 模板?这些边界一旦模糊,规范就变成摆设。每个团队必须在 .htmlvalidate.json 顶部加注释,写明适用范围和例外条款,而不是指望工具自动理解业务语义。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











