Monorepo下HTML模板质量规范需统一配置、工具版本和执行时机,根目录.prettierrc不生效因Prettier默认不递归查找,VS Code插件也以当前目录为上下文;须在各子包package.json中显式引用根配置、禁用子包独立配置,并通过pnpm exec实现中心化Git Hooks与分布式执行。

多 Repo 组件库架构下,HTML 模板质量规范无法靠单点配置自动同步——每个子仓库独立运行 prettier 或 htmlhint 时,若配置分散、版本不一、触发时机不同,很快就会出现 button 标签缩进不一致、class 引号风格混用、自闭合标签写法( vs )等“视觉污染”。统一不是加个配置文件就行,关键在于让所有子仓库在相同规则、相同工具版本、相同执行时机下落地。
为什么 .prettierrc 放根目录不管用
Monorepo 场景下,.prettierrc 放在 workspace 根目录,但多数 HTML 模板实际存在于各子包的 src/ 或 templates/ 下。Prettier 默认只读取当前工作目录下的配置,不会向上递归查找;而 pnpm run format 若未显式指定 --recursive 或未在子包 package.json 中声明脚本,就只会作用于当前包。更隐蔽的问题是:VS Code 的 Prettier 插件默认以打开文件所在目录为上下文,如果开发者直接在子包里编辑 HTML,插件就看不到根目录的 .prettierrc。
- 必须在每个子包的
package.json中显式定义"format:html": "prettier --write \"**/*.html\" --config ../../.prettierrc",路径用相对引用确保指向统一配置 - 禁止在子包内新建
.prettierrc—— 即使内容完全一样,也等于开了一个配置分支,后续修改极易遗漏 - 检查 VS Code 是否启用了
prettier.resolveConfigFromEditorText,该选项会绕过文件系统配置,导致本地格式化行为与 CI 不一致
HTMLHint 规则如何跨仓库强制生效
用 最易被忽略的一点:HTML 模板常嵌在 htmlhint 不像 Prettier 那样有强格式化能力,它只报错不修复,但恰恰适合做“守门人”:把语义错误(如 )、缺失属性(alt)、大小写混用等风格问题卡在提交前。问题在于,htmlhint 默认不支持共享配置继承,.htmlhintrc 必须被每个子包直接加载。
configs/htmlhint.config.js,导出配置对象,而非 JSON —— JS 文件可动态注入环境变量或条件逻辑.htmlhintrc 只保留一行:{"extends": "../../configs/htmlhint.config.js"}
htmlhint --config ../../configs/htmlhint.config.js \"src/**/*.html\",避免依赖子包本地配置文件是否存在htmlhint 的 attr-lowercase 和 attr-no-unsafe-char 规则对 Vue/JSX 模板中绑定语法(如 :class)可能误报,需在配置中显式排除 vue 或 jsx 扩展名Git Hooks 怎么避免子仓库各自为政
husky 在每个子包里单独装、单独配钩子,等于把维护成本翻了 N 倍。一旦要升级 prettier 版本或调整校验范围,就得手动改 N 个地方。真正可行的是“中心化钩子 + 分布式执行”。
husky 和 lint-staged,配置 package.json 的 "prepare": "husky install"
lint-staged 的配置写成函数形式,根据文件路径动态分发任务:"*.html": ["prettier --write", "htmlhint --config ../../configs/htmlhint.config.js"]
husky/pre-commit 脚本中先运行 pnpm exec -- pnpm run format:html,利用 pnpm exec 确保命令在所有已启用的子包中并行执行,而不是只跑当前目录husky 相关脚本和 .husky/ 目录 —— 它们会干扰根级钩子的统一控制流.vue、.tsx 或 .md 文件里,这些文件里的 HTML 片段不会被 prettier 的 **/*.html 匹配到。必须在 .prettierrc 中显式启用 plugins 并配置对应解析器,否则所谓“统一”只是幻觉。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











