CSS代码审计与优化引入_移除未使用的CSS样式

4次阅读

应采用「运行时检测+静态分析」双路验证:用puppeteer/playwright抓取实际生效样式,再以purgecss/uncss静态扫描交叉比对;需配置safelist应对动态类名、框架指令及tailwind等场景,并结合chrome coverage工具多状态验证,ci中通过diff增量拦截新增无用css。

CSS代码审计与优化引入_移除未使用的CSS样式

怎么快速找出项目里没用的CSS规则

靠人眼扫文件基本无效,尤其当CSS分散在多个style标签、.css文件、styled-components甚至内联style属性里时。真正可行的是「运行时检测」+「静态分析辅助」双路验证。

推荐组合:puppeteer驱动真实页面交互,配合playwrightchrome-devtools-protocol抓取实际生效的样式;再用uncsspurgecss做静态扫描作交叉比对。

  • uncss适合传统HTML+CSS项目,但无法处理动态类名(比如class="btn btn--{type}"
  • purgecss必须配好content路径,漏写.html.js会导致大量误删——它只看字符串匹配,不解析JS逻辑
  • 如果用了CSS Modulestailwind,得额外配置safelist,否则is-activemd:hidden这类运行时添加的类会被干掉

为什么purgecss删完后页面样式崩了

不是工具错了,是它根本不知道你JS里怎么拼类名。比如element.classList.add('text-' + color)purgecss看不到color可能等于red,就直接把所有text-red当死代码删了。

更隐蔽的是:某些框架(如Vue)的v-showv-if切换会动态挂载/卸载dom,但purgecss静态扫描时根本没触发这些分支。

立即学习前端免费学习笔记(深入)”;

  • 必须在safelist里加正则,比如/^text-.*$//^is-.+$/
  • 若用tailwind,别直接跑purgecss,改用tailwind.config.js里的content字段——它内置了更鲁棒的AST解析
  • 检查purgecss输出的removedSelectors日志,重点盯那些明显在用却被删的类名,反向补漏

chrome devtools里怎么手动验证某条CSS是否真没用

别只看「Styles」面板里灰掉的属性——那只是当前元素没匹配上,不代表全局无用。得用Coverage工具实时看加载的CSS里哪些字节压根没执行过。

打开DevTools → More Tools → Coverage,刷新页面,它会标出每行CSS的使用率。红色=0%,绿色=100%。但注意:这个统计只覆盖当前页面路径和当前交互状态。

  • 必须点遍所有可交互区域(菜单展开、表单校验、错误态、loading态),否则覆盖率数据严重偏低
  • 单页应用(SPA)要手动跳转到各路由再点「Reload coverage」,否则只统计首页
  • Coverage显示某规则未使用,不代表能删——可能是JS动态insertRule注入的,或者媒体查询在当前视口没命中

CI流程里自动拦截新增无用CSS

靠人工审计注定漏,得让机器在合并前卡住。核心思路是:对比PR前后purgecss识别的「待删列表」增量,如果有新增未使用的规则,就报错。

关键不在删,而在“发现即阻断”。否则每次发版都带冗余,越积越多。

  • git diff提取本次改动涉及的CSS文件,只对它们跑purgecss --dry-run
  • 把结果和基线(如main分支最新构建产物)的已知无用规则做差集,输出新增项
  • 注意排除@keyframes@font-face——它们不会出现在DOM里,但purgecss默认会标记为未使用

真正麻烦的是那些“看起来没用,但其实被Web Component Shadow DOM 或 iframe 隔离使用”的规则——工具扫不到,只能靠文档约定或人工标注/* purgecss ignore */。这点容易被忽略,一删就出生产问题。

text=ZqhQzanResources