purgecss vs purify-css vs uncss
CSS 无用代码清理工具架构对比与选型指南
purgecsspurify-cssuncss类似的npm包:

CSS 无用代码清理工具架构对比与选型指南

purgecss、purify-css 和 uncss 都是用于移除 CSS 文件中未使用选择器的工具,旨在减小最终打包体积。purgecss 是目前社区主流选择,通过静态分析内容文件来匹配 CSS 选择器,支持广泛的构建工具集成。purify-css 是早期的类似工具,但目前已停止维护。uncss 曾经通过 PhantomJS 运行时分析 DOM 来确定样式使用情况,但因依赖已过时的技术而不再推荐。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
purgecss08,048137 kB348 个月前MIT
purify-css09,836-809 年前MIT
uncss09,398-587 年前MIT

CSS 无用代码清理工具深度对比:PurgeCSS vs Purify-css vs UnCSS

在前端工程化体系中,移除未使用的 CSS 是优化加载性能的关键步骤。purgecss、purify-css 和 uncss 都致力于解决同一问题,但它们的实现原理、维护状态和适用场景截然不同。本文将从架构师视角深入分析这三者的技术细节,帮助你在构建流程中做出正确选择。

🚦 维护状态与生命周期

选择工具的首要标准是项目的活跃度。依赖已停止维护的库会给项目带来安全隐患和构建失败风险。

purgecss 是目前唯一活跃维护的项目。

  • 定期发布更新,修复 Bug 并适配新 CSS 语法。
  • 拥有完善的插件生态(Webpack, PostCSS, CLI)。
# 安装最新稳定版
npm install -D purgecss

purify-css 已处于事实上的废弃状态。

  • 最后一次主要更新已是多年前。
  • 无法处理现代框架(如 Vue 3, React 18)生成的动态类名。
# 不推荐安装,仅用于理解旧代码
npm install purify-css

uncss 依赖已死亡的技术栈。

  • 核心依赖 PhantomJS,该项目已于 2018 年停止维护。
  • 在现代 Node.js 版本中安装极易失败。
# 强烈避免使用
npm install uncss

⚙️ 工作原理:静态分析 vs 运行时 DOM

理解工具如何判断 CSS 是否被使用,有助于配置正确的策略。

purgecss 基于静态文件分析。

  • 扫描 HTML、JS、模板文件中的类名字符串。
  • 速度快,不依赖浏览器环境。
  • 缺点:无法检测动态拼接的类名(除非配置安全名单)。
// purgecss: 静态分析配置
const PurgeCSS = require('purgecss').PurgeCSS;
const purgeCSSResults = await new PurgeCSS().purge({
  content: ['./src/**/*.html', './src/**/*.js'],
  css: ['./src/**/*.css']
});

purify-css 同样基于静态分析。

  • 原理与 PurgeCSS 类似,但算法较旧。
  • 对复杂选择器的识别率较低。
// purify-css: 静态分析配置
const purify = require('purify-css');
purify(['src/**/*.js'], ['src/**/*.css'], {
  minify: true
}, function(result) {
  console.log(result); 
});

uncss 基于运行时 DOM 分析。

  • 启动 headless 浏览器加载页面,检查实际渲染的节点。
  • 能准确识别动态生成的类名。
  • 缺点:极慢,配置复杂,依赖重。
// uncss: 运行时分析配置
const uncss = require('uncss');
uncss(['http://localhost:3000'], {
  css: ['src/**/*.css']
}, function(error, output) {
  console.log(output);
});

🛡️ 安全性与白名单机制

误删 CSS 是此类工具最大的风险。完善的白名单(Safelist)机制至关重要。

purgecss 提供灵活的白名单配置。

  • 支持正则表达式匹配动态类名。
  • 支持在 CSS 注释中直接标记保留。
/* 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, PostCSS, Gulp, CLI。
  • 配置简单,文档清晰。
// webpack.config.js (PurgeCSS)
const { PurgecssPlugin } = require('purgecss-webpack-plugin');
module.exports = {
  plugins: [
    new PurgecssPlugin({
      paths: glob.sync(`${PATHS.src}/**/*`,  { nodir: true })
    })
  ]
};

purify-css 集成较为陈旧。

  • 缺乏对新版 Webpack 的官方支持。
  • 通常需要自定义 loader 或脚本。
// 旧式集成示例
const PurifyCSSPlugin = require('purifycss-webpack');
// 注意:此插件可能不兼容 webpack 5+

uncss 集成成本最高。

  • 需要启动本地服务器供其抓取。
  • 在 CI/CD 流水线中配置繁琐。
// uncss-webpack-plugin 示例
const UnCssPlugin = require('uncss-webpack-plugin');
// 需要配置 server 选项,增加了构建复杂度

📊 核心特性对比总结

特性purgecsspurify-cssuncss
维护状态✅ 活跃维护❌ 已停止❌ 已停止
分析方式静态文件扫描静态文件扫描运行时 DOM 分析
构建速度⚡ 极快⚡ 快🐢 慢
动态类名⚠️ 需配置白名单⚠️ 支持较差✅ 自动识别
依赖环境Node.jsNode.jsPhantomJS (已死)
推荐指数⭐⭐⭐⭐⭐⭐⭐

💡 架构师建议

purgecss 是现代前端工程的唯一理性选择。它平衡了性能、安全性和易用性。对于动态类名问题,应通过规范代码风格(避免过度动态拼接类名)配合白名单解决,而不是退回到使用过时的运行时分析工具。

purify-css 和 uncss 应被视为技术债务。如果你的项目正在使用它们,建议制定迁移计划,逐步替换为 purgecss。特别是 uncss,其依赖的 PhantomJS 存在已知安全漏洞,不应出现在任何生产环境中。

最终结论:在新项目中,请直接锁定 purgecss。它不仅是工具,更是社区公认的标准实践。

如何选择: purgecss vs purify-css vs uncss

  • purgecss:

    选择 purgecss 用于所有新的前端项目,它是目前唯一活跃维护且社区支持最好的工具。它提供强大的安全名单(safelist)机制,能有效防止误删动态类名,且兼容 PostCSS、Webpack 等现代构建流程。

  • purify-css:

    仅在维护遗留旧项目时考虑 purify-css,新项目切勿使用。该库已长期未更新,缺乏对现代 CSS 特性(如 CSS 变量、新选择器)的支持,且社区已全面转向 purgecss。

  • uncss:

    避免在任何场景下使用 uncss,除非你被困在无法升级的古老技术栈中。它依赖已死亡的 PhantomJS 引擎,安装困难且无法处理现代 JavaScript 渲染的动态内容,存在严重的安全和维护风险。

purgecss的README

PurgeCSS

npm npm GitHub Dependabot Coverage Status

PurgeCSS logo

What is PurgeCSS?

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.

Sponsors 🥰

Documentation

You can find the PurgeCSS documentation on this website.

Table of Contents

PurgeCSS

Plugins

Guides

Getting Started

Installation

npm i --save-dev purgecss

Usage

import PurgeCSS from "purgecss";
const purgeCSSResults = await new PurgeCSS().purge({
  content: ["**/*.html"],
  css: ["**/*.css"],
});

Contributing

Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.

Versioning

PurgeCSS use SemVer for versioning.

License

This project is licensed under the MIT License - see the LICENSE file for details.