Husky不能原生识别HTML,pre-commit钩子须限定暂存区文件并加--ignore-unknown容错:git diff --cached --name-only --diff-filter=ACM | grep '.html$' | xargs -r prettier --write --ignore-unknown。

HTML模板格式化工具在Git Hooks中能起作用,但必须绕开两个常见误区:一是误以为Husky能“识别HTML”,二是直接全量格式化所有.html文件而不区分暂存区。真正有效的配置,只处理已暂存、可解析、符合项目约定的HTML文件。
pre-commit钩子怎么安全调用Prettier格式化HTML
直接运行prettier --write "**/*.html"会扫到node_modules、构建产物甚至服务端模板(如index.ejs),导致报错或破坏逻辑。关键在于限定作用域和容错。
- 只操作暂存区文件:
git diff --cached --name-only --diff-filter=ACM | grep '\.html$'确保只处理新添加、修改或重命名的HTML文件 - 加
--ignore-unknown参数:跳过含非标准语法(如)的模板,避免中断提交流程 - 确保Prettier支持HTML:v2.0+默认支持,无需额外插件;若用ESLint检查内联JS,才需
eslint-plugin-html - 示例命令(放入
.husky/pre-commit):git diff --cached --name-only --diff-filter=ACM | grep '\.html$' | xargs -r prettier --write --ignore-unknown
为什么不能用lint-staged直接配**/*.html
lint-staged默认只传入匹配文件路径,但Prettier对HTML的解析依赖上下文——比如是否启用htmlWhitespaceSensitivity,而该选项无法通过命令行覆盖,只能靠.prettierrc生效。若配置写成"*.html": ["prettier --write"],容易因缺失配置导致格式不一致。
- 正确做法:在
.lintstagedrc.js中显式调用Pretterrc:"*.html": ["prettier --write --config .prettierrc"] - 更稳妥方式:把HTML单独拆出脚本,例如
"format:html": "prettier --write --config .prettierrc \"src/**/*.html\"",再在Husky中调用 - 注意
lint-staged的glob匹配是相对于git root的,若HTML分散在public/和src/views/,需明确路径
EditorConfig和Prettier配置冲突怎么办
.editorconfig控制缩进、换行符等基础编辑行为,.prettierrc控制标签嵌套、属性换行等语义化格式。两者叠加时,VS Code可能优先应用EditorConfig的indent_style,导致Prettier格式化后又回退。
立即学习“前端免费学习笔记(深入)”;
- 统一以Prettier为准:在
.editorconfig中设indent_style = space且indent_size = 2,与.prettierrc的tabWidth: 2和useTabs: false保持一致 - 禁用VS Code内置HTML格式化:
"html.format.enable": false,防止和Prettier打架 - 检查
htmlWhitespaceSensitivity值:"css"适合多数项目,"strict"会导致被删,"ignore"则可能破坏CSS布局
最易被忽略的一点:HTML格式化不是“越严格越好”。团队若混用多种模板引擎(EJS、Handlebars、Vue SFC),强行用Prettier统一处理反而引发解析失败。与其堵,不如疏——用--ignore-unknown兜底,靠.prettierrc约束纯静态HTML,把动态模板交给对应引擎的linter处理。



















