Stylelint 默认不检查 HTML 文件中的样式,需通过 postcss-html 解析器提取 <style> 块并配合 stylelint-config-html 配置 overrides 才能校验,且不支持内联 style 属性;HTMLHint 仅检查 HTML 结构,不校验 CSS 语法。

Stylelint 本身不检查 HTML 文件里的样式,HTMLHint 也不管 CSS 写得对不对——两者职责不同、解析器不同、配置体系独立。想让它们协同工作,不是装上插件就完事,关键在明确分工 + 配置隔离 + 解析器对齐。
Stylelint 怎么扫 HTML 里的 <style> 和 style 属性?
默认情况下,stylelint "**/*.html" 什么都不会报——因为 Stylelint v14+ 只认纯 CSS 文件。它需要靠 postcss-html 把 HTML 中的样式块抽出来,再喂给规则引擎。
- 必须安装
postcss-html和stylelint-config-html:两者缺一不可,前者是解析器,后者提供适配 HTML 场景的基础规则 -
.stylelintrc.cjs中不能只写extends,得用overrides显式指定 HTML 文件走哪套解析逻辑 - 示例配置片段:
module.exports = {
overrides: [
{
files: ["**/*.html", "**/*.htm"],
customSyntax: "postcss-html",
extends: ["stylelint-config-html"]
}
]
};没这个 overrides,哪怕你写了 customSyntax 在顶层,SCSS 或 CSS 文件也会被错误解析,反而崩掉。
HTMLHint 报 Unknown word 或 Cannot parse selector 是什么问题?
这不是 HTMLHint 的错,是它和 Stylelint 配置打架了。典型场景:你在 <div style="display: flex; gap: 8px;"> 里用了现代 CSS 属性,但 HTMLHint 默认不校验 style 值合法性,而 Stylelint 又没启用 postcss-html,结果两个工具都“看不懂”这行内样式,一个静默跳过,一个报错中断。
立即学习“前端免费学习笔记(深入)”;
- HTMLHint 本身不校验 CSS 语法,它的
attr-value-not-empty或attr-unsafe-chars等规则只检查 HTML 属性结构,不校验style值是否合法 - 真正负责校验
style属性值的是 Stylelint +postcss-html,所以这类报错基本等于postcss-html没生效或版本不匹配 - 确认
postcss-html版本兼容当前 Stylelint(v15+ 推荐用postcss-html@^1.5.0)
VS Code 里同时启用 Stylelint 和 HTMLHint 插件,为什么只有一边生效?
VS Code 的语言模式决定了哪个插件响应保存动作。默认 .html 文件走的是 html 语言模式,HTMLHint 能监听到,但 Stylelint 不会自动介入——除非你告诉它“这个 HTML 文件也要走 CSS 校验流程”。
- 在 VS Code 设置中加这条,强制 Stylelint 处理 HTML 文件:
"stylelint.enable": true, "stylelint.validate": ["css", "html", "vue"]
- HTMLHint 插件需单独开启:
htmlhint.enable设为true,且确保工作区根目录有.htmlhintrc - 二者互不干扰,但错误提示会叠在一起显示;如果某条规则重复触发(比如都报
class名大小写问题),得在各自配置里关掉一方
CI/CD 流程里怎么让两个工具不互相拖慢构建?
Stylelint 和 HTMLHint 都支持增量扫描,但默认命令都是全量跑。不加限制的话,一次提交可能触发数百个文件检查,尤其 HTMLHint 对大项目 DOM 结构分析较重。
- 用
git diff提取变更文件再传给对应命令,例如:
stylelint $(git diff --name-only HEAD~1 -- "*.html")
- HTMLHint 不支持通配符增量,建议用
--file逐个传参,配合xargs -n 1 - 别把
stylelint --fix和htmlhint --fix放进同一脚本自动执行——HTMLHint 没--fix功能,强行调用会失败退出
最易被忽略的其实是 postcss-html 的加载时机:它必须在 Stylelint 启动前完成模块注册,否则 override 生效但解析器未就位,照样报语法错误。这点在 CI 容器里尤其容易因 Node.js 版本或缓存机制出问题。



















