purgecss、purify-css 和 uncss 都是用于移除 CSS 文件中未使用选择器的工具,旨在减小最终打包体积。purgecss 是目前社区主流选择,通过静态分析内容文件来匹配 CSS 选择器,支持广泛的构建工具集成。purify-css 是早期的类似工具,但目前已停止维护。uncss 曾经通过 PhantomJS 运行时分析 DOM 来确定样式使用情况,但因依赖已过时的技术而不再推荐。
在前端工程化体系中,移除未使用的 CSS 是优化加载性能的关键步骤。purgecss、purify-css 和 uncss 都致力于解决同一问题,但它们的实现原理、维护状态和适用场景截然不同。本文将从架构师视角深入分析这三者的技术细节,帮助你在构建流程中做出正确选择。
选择工具的首要标准是项目的活跃度。依赖已停止维护的库会给项目带来安全隐患和构建失败风险。
purgecss 是目前唯一活跃维护的项目。
# 安装最新稳定版
npm install -D purgecss
purify-css 已处于事实上的废弃状态。
# 不推荐安装,仅用于理解旧代码
npm install purify-css
uncss 依赖已死亡的技术栈。
# 强烈避免使用
npm install uncss
理解工具如何判断 CSS 是否被使用,有助于配置正确的策略。
purgecss 基于静态文件分析。
// purgecss: 静态分析配置
const PurgeCSS = require('purgecss').PurgeCSS;
const purgeCSSResults = await new PurgeCSS().purge({
content: ['./src/**/*.html', './src/**/*.js'],
css: ['./src/**/*.css']
});
purify-css 同样基于静态分析。
// purify-css: 静态分析配置
const purify = require('purify-css');
purify(['src/**/*.js'], ['src/**/*.css'], {
minify: true
}, function(result) {
console.log(result);
});
uncss 基于运行时 DOM 分析。
// uncss: 运行时分析配置
const uncss = require('uncss');
uncss(['http://localhost:3000'], {
css: ['src/**/*.css']
}, function(error, output) {
console.log(output);
});
误删 CSS 是此类工具最大的风险。完善的白名单(Safelist)机制至关重要。
purgecss 提供灵活的白名单配置。
/* purgecss start ignore */
.no-remove {
color: red;
}
/* purgecss end ignore */
// purgecss: 配置白名单
await new PurgeCSS().purge({
content: ['./src/**/*.html'],
css: ['./src/**/*.css'],
safelist: [/^btn-/, 'active'] // 保留 btn- 开头和 active 类
});
purify-css 白名单功能有限。
// purify-css: 简单白名单
purify(files, css, {
whitelist: ['active', 'modal']
}, callback);
uncss 依赖页面覆盖度。
// uncss: 依赖 URL 覆盖
uncss(['http://localhost/home', 'http://localhost/about'], options, callback);
// 如果没访问 /contact 路由,该页面样式可能被误删
现代开发离不开构建工具集成。集成难度直接影响开发效率。
purgecss 拥有官方维护的插件。
// webpack.config.js (PurgeCSS)
const { PurgecssPlugin } = require('purgecss-webpack-plugin');
module.exports = {
plugins: [
new PurgecssPlugin({
paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true })
})
]
};
purify-css 集成较为陈旧。
// 旧式集成示例
const PurifyCSSPlugin = require('purifycss-webpack');
// 注意:此插件可能不兼容 webpack 5+
uncss 集成成本最高。
// uncss-webpack-plugin 示例
const UnCssPlugin = require('uncss-webpack-plugin');
// 需要配置 server 选项,增加了构建复杂度
| 特性 | purgecss | purify-css | uncss |
|---|---|---|---|
| 维护状态 | ✅ 活跃维护 | ❌ 已停止 | ❌ 已停止 |
| 分析方式 | 静态文件扫描 | 静态文件扫描 | 运行时 DOM 分析 |
| 构建速度 | ⚡ 极快 | ⚡ 快 | 🐢 慢 |
| 动态类名 | ⚠️ 需配置白名单 | ⚠️ 支持较差 | ✅ 自动识别 |
| 依赖环境 | Node.js | Node.js | PhantomJS (已死) |
| 推荐指数 | ⭐⭐⭐⭐⭐ | ⭐ | ⭐ |
purgecss 是现代前端工程的唯一理性选择。它平衡了性能、安全性和易用性。对于动态类名问题,应通过规范代码风格(避免过度动态拼接类名)配合白名单解决,而不是退回到使用过时的运行时分析工具。
purify-css 和 uncss 应被视为技术债务。如果你的项目正在使用它们,建议制定迁移计划,逐步替换为 purgecss。特别是 uncss,其依赖的 PhantomJS 存在已知安全漏洞,不应出现在任何生产环境中。
最终结论:在新项目中,请直接锁定 purgecss。它不仅是工具,更是社区公认的标准实践。
选择 purgecss 用于所有新的前端项目,它是目前唯一活跃维护且社区支持最好的工具。它提供强大的安全名单(safelist)机制,能有效防止误删动态类名,且兼容 PostCSS、Webpack 等现代构建流程。
仅在维护遗留旧项目时考虑 purify-css,新项目切勿使用。该库已长期未更新,缺乏对现代 CSS 特性(如 CSS 变量、新选择器)的支持,且社区已全面转向 purgecss。
避免在任何场景下使用 uncss,除非你被困在无法升级的古老技术栈中。它依赖已死亡的 PhantomJS 引擎,安装困难且无法处理现代 JavaScript 渲染的动态内容,存在严重的安全和维护风险。
When you are building a website, chances are that you are using a css framework like Bootstrap, Materializecss, Foundation, etc... But you will only use a small set of the framework and a lot of unused css styles will be included.
This is where PurgeCSS comes into play. PurgeCSS analyzes your content and your css files. Then it matches the selectors used in your files with the one in your content files. It removes unused selectors from your css, resulting in smaller css files.
You can find the PurgeCSS documentation on this website.
npm i --save-dev purgecss
import PurgeCSS from "purgecss";
const purgeCSSResults = await new PurgeCSS().purge({
content: ["**/*.html"],
css: ["**/*.css"],
});
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
PurgeCSS use SemVer for versioning.
This project is licensed under the MIT License - see the LICENSE file for details.