Lighthouse 建议移除未使用的 CSS,但我不知道哪些能删? UX-一涵 提问于 2026-03-12 20:20:24 阅读 43 工具 我用 Lighthouse 跑分时总提示“移除未使用的 CSS”,可项目里样式是通过 @import 拆分的,手动删怕出问题。有没有办法自动识别哪些 CSS 真的没用到? 试过 PurgeCSS,但配置完页面样式直接乱了,怀疑它把动态添加的 class 也删了。比如下面这种写法: document.body.classList.add('theme-dark'); 这种运行时动态切换的类名,工具能识别吗?还是得靠人工判断? 优化流程 我来解答 赞 11 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 司空溢洋 Lv1 遇到这个问题挺头疼的,不过有办法解决。PurgeCSS 配置不当确实可能导致动态添加的类被误删。你可以通过配置 safelist 来防止这种情况。具体来说,你可以把动态添加的类名列入 safelist,这样 PurgeCSS 就不会删掉这些类了。 配置示例如下: const purgecss = new PurgeCSS({ content: ['./src/**/*.html', './src/**/*.js'], css: ['./src/**/*.css'], safelist: { standard: [/^theme-/] } }) 这里的关键是 safelist,我用正则 /^theme-/ 来匹配所有以 theme- 开头的类名。如果你的动态类名有其他规则,可以调整正则表达式。 另外,为了确保准确性和完整性,建议在生产环境中缓存起来,避免每次构建都重新处理 CSS。这样可以节省时间,也能减少出错的可能性。 希望这能帮到你,如果有更多问题再聊。 回复 点赞 2026-03-23 13:07 艺菲酱~ Lv1 PurgeCSS 把你动态加的 class 删掉是正常的,它只分析源码里的静态字符串。你写的 document.body.classList.add('theme-dark') 这种,PurgeCSS 扫不到 theme-dark 这个字符串出现的 HTML 标签上,所以直接给你干掉了。 解决方法很简单,在 PurgeCSS 配置里加个 safelist: // purgecss.config.jsmodule.exports = { content: ['./src/**/*.{html,js,ts,jsx,tsx}'], css: ['./src/**/*.css'], safelist: { standard: [/^theme-/, /^is-/, /^has-/], // 正则匹配所有以这些开头的class deep: [ // 或者精确指定某些动态class 'theme-dark', 'theme-light', 'is-active', 'is-loading' ] } } 复制这个配置,根据你的实际情况改一下正则规则。常用的做法是把项目里所有动态切换 class 的前缀都列出来,比如 theme-、is-、has- 这类命名规范的。 如果你用的是 PostCSS 或者 webpack 的 purgecss-webpack-plugin,配置也都类似,在插件选项里加上 safelist。 还有一个思路是把动态 class 统一放在一个文件里,然后手动维护白名单列表,别让工具去猜。动态样式本来就不是工具能推断出来的,只能靠人肉保平安。 回复 点赞 2026-03-12 21:03 加载更多 相关推荐 2 回答 45 浏览 Lighthouse建议移除未使用的CSS,但我这段代码明明在用啊? 我用Lighthouse跑分时提示“移除未使用的CSS”,但下面这段样式我在页面里确实用到了,比如 .hero-banner 类在首页首屏就有。是不是Lighthouse判断有误?还是我哪里理解错了?... 博主泉润 工具 2026-03-16 09:53:21 1 回答 91 浏览 Lighthouse建议移除未使用的JavaScript,但我不知道哪些能删? 我用 Lighthouse 跑分,Performance 得分很低,提示“移除未使用的 JavaScript”,但我项目里引用了好几个第三方库,比如 lodash 和 moment.js,只用了其中一... UE丶红娟 工具 2026-02-26 15:37:22 1 回答 41 浏览 Lighthouse 建议移除未使用的 JavaScript,但我的 Vue 组件是动态加载的怎么办? 我在跑 Lighthouse 时总被提示“移除未使用的 JavaScript”,但我用的是 Vue 的异步组件,按路由懒加载的,这些代码其实不是首屏用不到吗?为啥还被算作“未使用”? 比如下面这个写法... 程序员统赫 工具 2026-03-27 10:23:21 1 回答 30 浏览 关键渲染路径阻塞,CSS和JS到底该怎么放? 我在优化页面首屏加载时,发现即使把CSS放在head里、JS放底部,Lighthouse还是提示“阻塞渲染”。明明已经按教程做了啊,是不是还有其他坑? 比如我现在的结构是这样: <!DOCTYP... Prog.丹丹 优化 2026-03-30 16:55:14 1 回答 24 浏览 为什么我的页面FCP这么高,明明CSS已经内联了? 我用 Lighthouse 测速发现 FCP(首次内容绘制)高达 4 秒多,但首页关键 CSS 已经内联在 HTML 里了,按理说不应该阻塞渲染啊?是不是哪里写错了? 这是我的关键 CSS 部分: b... 程序猿露宜 工具 2026-03-26 22:49:21 2 回答 45 浏览 预加载图片时为什么会阻塞关键CSS加载? 我在电商详情页用预加载商品轮播图,但发现首屏渲染变慢了。用Lighthouse检查发现关键CSS的加载时间被图片占用了,这是为什么? 尝试过这样写: <link rel="preload" hr... 极客清梅 优化 2026-02-19 16:29:24 1 回答 68 浏览 Webpack打包后CSS体积过大,怎么分析具体是哪些样式占空间? 我用 Webpack 打包项目时发现生成的 CSS 文件特别大,想搞清楚到底是哪些样式规则占了这么多体积。试过用 webpack-bundle-analyzer,但它好像只分析 JS,对 CSS 没啥... 慧娜 工具 2026-03-20 20:17:26 2 回答 60 浏览 Lighthouse 报告里“未使用 JavaScript”是怎么回事? 我在用 Lighthouse 做性能审计时,发现报告里提示“未使用的 JavaScript”,但这些脚本明明是我页面必需的啊。比如下面这段代码: import { initMap } from ... 司马翌喆 工具 2026-02-25 22:10:18 2 回答 38 浏览 为什么Coverage显示未使用的CSS在代码中明明被引用了? 在Vue组件里写了一个带scoped的CSS类,Coverage报告显示这个类未被使用,但代码里明明在DOM元素上加了这个class。我刷新了页面还清除了缓存,问题还是存在... <templa... 令狐依甜 工具 2026-02-16 22:19:22 2 回答 48 浏览 Rollup打包后文件包含未使用的CSS类名怎么办? 在用Rollup打包Vue组件库时发现,即使组件未使用某些CSS类名,打包后的dist文件里还是包含了所有类名,导致体积变大。我尝试过动态导入CSS文件,但这样会导致样式无法按需加载: <tem... ___荣荣 优化 2026-02-16 18:25:24
safelist来防止这种情况。具体来说,你可以把动态添加的类名列入safelist,这样 PurgeCSS 就不会删掉这些类了。配置示例如下:
这里的关键是
safelist,我用正则/^theme-/来匹配所有以theme-开头的类名。如果你的动态类名有其他规则,可以调整正则表达式。另外,为了确保准确性和完整性,建议在生产环境中缓存起来,避免每次构建都重新处理 CSS。这样可以节省时间,也能减少出错的可能性。
希望这能帮到你,如果有更多问题再聊。
document.body.classList.add('theme-dark')这种,PurgeCSS 扫不到theme-dark这个字符串出现的 HTML 标签上,所以直接给你干掉了。解决方法很简单,在 PurgeCSS 配置里加个 safelist:
复制这个配置,根据你的实际情况改一下正则规则。常用的做法是把项目里所有动态切换 class 的前缀都列出来,比如
theme-、is-、has-这类命名规范的。如果你用的是 PostCSS 或者 webpack 的 purgecss-webpack-plugin,配置也都类似,在插件选项里加上 safelist。
还有一个思路是把动态 class 统一放在一个文件里,然后手动维护白名单列表,别让工具去猜。动态样式本来就不是工具能推断出来的,只能靠人肉保平安。