purgecss 会误删 data-bs-* 类和动态 class,因其仅扫描静态文件中的字面量类名,无法识别 js 动态注入、模板字符串(如 bg-${color})或框架运行时生成的类(如 ant-collapse-item),必须通过 safelist 正则(如 /^data-bs-/)显式保留,否则导致交互失效。

为什么 PurgeCSS 会删掉 data-bs-* 类和动态生成的 class
PurgeCSS 删除的是 CSS 选择器,不是 HTML 属性。像 data-bs-toggle 这类属性本身不触发样式,但如果你写了 [data-bs-toggle="modal"] 这样的选择器,它就进入了 PurgeCSS 的扫描范围——而默认配置根本不会识别这种字符串拼接或 JS 动态注入的模式,直接判定为“未使用”,一并清掉。
同理,ant-collapse-item、js-dropdown-open 这类由 JS 框架运行时生成的 class,也不会出现在 .html 或 .js 文件的静态文本中,除非你显式告诉 PurgeCSS 它们存在。
- 默认只扫描
.html和.js文件内容,Vue/React 的模板、JSX、服务端渲染 HTML 都不在范围内 -
bg-${color}、text-${size}这种模板字符串里的动态类名,PurgeCSS 无法解析变量值,直接忽略 - Bootstrap 5 的
data-bs-*属性虽不产样式,但你自定义的[data-bs-*]选择器会被误删,导致 JS 行为失效(比如模态框点不动)
safeList 不是可选项,是必须项
safeList 不是用来“兜底”的,是防止功能崩溃的救命配置。尤其对 Bootstrap,漏配等于线上白屏。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 硬编码类必须加:如
container、row、col-6—— 它们常出现在 JS 字符串拼接里,比如el.innerHTML = '<div class="container">...</div>' - 正则保活更可靠:
/^data-bs-/、/^bg-/、/^text-/,避免漏掉data-bs-target或bg-gradient - 第三方组件类也得列:
/^ant-/、/^js-/,否则ant-table渲染后样式全无 - 别只写字符串数组,用对象形式启用正则:
{ pattern: /^data-bs-/ },否则/^data-bs-/会被当成字面量字符串处理
content 和 extractors 必须匹配框架实际输出路径
Webpack/Vite 构建后,CSS 类名真正出现的位置,和你源码写的不一定一致。PurgeCSS 扫不到,就等于没配。
- Vue 用户必须配
extractors处理<template></template>块,否则<button class="btn btn-primary"></button>完全不被识别 - React/TSX 用户的
content至少要包含:src/**/*.{ts,tsx,js,jsx},不能只写src/**/*.js - 路径多一个
src/少一个**都会导致漏扫 —— 比如 Vite 默认输出到dist/index.html,但 PurgeCSS 默认不读构建产物,只读源码 - mini-css-extract-plugin 输出的 CSS 文件路径,必须和
purgecss.content中的 glob 匹配,否则扫描目标根本不存在
rejected: true 是唯一能快速定位误删的开关
开启 rejected: true 后,构建日志会输出所有被删掉的选择器。这不是为了炫技,是帮你肉眼确认关键类是否幸存。
- 搜索日志里有没有
.modal、.dropdown-menu、[data-bs-toggle]—— 出现即危险 - 对比本地开发(未启用 PurgeCSS)和 CI 构建后的 CSS 文件体积差异,若删减量异常大(比如少了 80%),大概率有保活遗漏
- 不要依赖“看起来还行”:有些类删了不影响布局,但会让
new bootstrap.Modal()初始化失败,页面交互直接卡死 - 注意插件执行顺序:如果
cssnano在purgecss前运行,它可能把.btn.btn-primary合并成.btn-primary,导致原始类名消失,PurgeCSS 扫不到匹配项
真正难的不是配对参数,而是判断哪些类“看起来没用,其实动不得”。data-bs-toggle 不是装饰属性,它是 Bootstrap JS 组件的控制开关;col-6 不只是栅格,它可能被 JS 动态插入 DOM;rejected: true 日志里每一条被删记录,都该对应一行人工核验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










