Stylelint通过declaration-block-no-duplicate-properties和no-duplicate-selectors检测显性冗余,但无法识别未使用的CSS规则;真正清理死代码需依赖purgecss等构建期工具。

冗余样式检测靠declaration-block-no-duplicate-properties和no-duplicate-selectors
Stylelint本身不直接标出“完全没用的CSS规则”,但能揪出明显重复导致的冗余:同一块声明里写两次color,或者多个.btn规则散落在不同文件里。这类重复大概率是维护遗漏或复制粘贴残留,不处理就会悄悄膨胀。
实操建议:
立即学习“前端免费学习笔记(深入)”;
-
declaration-block-no-duplicate-properties必须开启——它会报Unexpected duplicate property "margin" (declaration-block-no-duplicate-properties)这类错误,连margin: 0; margin: 1rem;这种覆盖写法也算冗余(后一条生效,前一条白占体积) -
no-duplicate-selectors对CSS模块化项目效果有限,因为.header可能在Header.css和Layout.css里各定义一次,Stylelint默认不跨文件查重;真要防这个,得配合stylelint-selector-bem-pattern强制命名约束,或引入postcss-discard-duplicates在构建时清理 - 别依赖
no-unused-vars类规则——那是ESLint的,CSS没变量作用域概念,Stylelint没有等效的“未使用类名”检测能力
真正“没用的样式”得靠unused-css类工具,Stylelint不负责这个
比如删掉了<div class="card-shadow"></div>,但.card-shadow { box-shadow: ... }还留在CSS里,Stylelint完全不会报警。这是静态分析的天然盲区:它不解析HTML/JS中的class绑定,也不运行时收集真实DOM结构。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 想扫出这类死代码,得用
purgecss(配合Webpack/Vite插件)或unused-css(需传入HTML入口路径),它们通过匹配选择器与实际HTML中出现的class来判断 - Stylelint可以配合做“预防”:启用
selector-max-specificity限制选择器复杂度,避免写div.container > ul li.active a:hover这种难以复用、后期大概率被覆盖重写的高权重规则 - 注意
purgecss的whitelist配置——动态拼接的class名(如className={`btn ${type}-theme`})必须显式保留,否则会被误删
stylelint-config-recommended不开冗余检测,得手动加规则
官方推荐配置只保语法正确和基础可维护性,像no-duplicate-selectors这种“查重复”的规则默认关着。很多人配完发现没报冗余问题,其实是规则压根没启用。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 在
.stylelintrc.js里显式写入:module.exports = { extends: ['stylelint-config-recommended'], rules: { 'declaration-block-no-duplicate-properties': true, 'no-duplicate-selectors': true, 'no-empty-source': true } }; - 别用
stylelint-config-standard替代——它只是加了缩进、分号等格式规则,和冗余检测无关 - VS Code里装了Stylelint插件但没反应?检查
editor.codeActionsOnSave是否启用了source.fixAll.stylelint,否则保存时不自动校验
PostCSS插件比Stylelint更适合做构建期冗余清理
Stylelint是开发时提示,而真正压缩体积、移除无用样式的动作,应该放在构建流程里。比如Tailwind用户开content配置后,PurgeCSS会在打包时剔除所有没在模板里出现过的工具类。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- Webpack项目:用
postcss-purgecss,配置content: ['./src/**/*.{js,jsx,ts,tsx,html}'],确保扫描到JSX里的className - Vite项目:直接开
build.cssCodeSplit: false+cssMinify: 'lightningcss',Lightning CSS自带dead code elimination能力,比手写Purge更准(能识别clsx等动态class库) - 警惕
@apply滥用:Tailwind里@apply bg-blue-500 hover:bg-blue-600会把对应工具类CSS内联进来,如果这些工具类本身已被Purge掉,就会报错——得确保@apply用的都是实际用到的变体
Stylelint能拦住人写的重复,但拦不住工程链路里漏掉的死代码。要不要删、删哪些、怎么验证删了不影响UI,这些决策点都在构建配置里,不在linter里。


















