purgecss、purify-css、uncss は、すべて Web アプリケーションから使用されていない CSS を削除し、バンドルサイズを削減するためのツールです。これらは最終的な CSS ファイルを最適化し、読み込みパフォーマンスを向上させることを目的としていますが、内部のアプローチ(静的解析 vs ヘッドレスブラウザ)とメンテナンス状況に大きな違いがあります。現在、業界標準として広く採用されているのは purgecss であり、他の 2 つはレガシーまたはメンテナンスが停止している可能性があります。
Web パフォーマンス最適化において、使用されていない CSS を削除(Tree Shaking)することは不可欠です。purgecss、purify-css、uncss はこの課題を解決する代表的なツールですが、その内部動作と現状には明確な差があります。本稿では、現役のフロントエンドアーキテクトの視点から、これら 3 つのツールを技術的に深掘りし、なぜ purgecss が現在のデファクトスタンダードなのかを解説します。
ツール選定で最も重要なのは、どのように「使用されている CSS」を判定するかです。
purgecss は、ファイルの内容を静的に解析します。
// purgecss: 静的ファイルパスを指定して実行
const purgeCSS = require('purgecss');
const result = purgeCSS({
content: ['./src/**/*.html', './src/**/*.js'],
css: ['./src/assets/css/main.css']
});
// result[0].css に最適化された CSS が含まれる
purify-css は、ヘッドレスブラウザ(PhantomJS)を使用します。
// purify-css: URL または HTML 文字列を指定
const Purify = require('purify-css');
Purify.purify(['./src/**/*.js'], './src/css/*.css', {
info: true,
minify: true
}, function(result) {
console.log(result); // 最適化された CSS 文字列
});
uncss もヘッドレスブラウザ(jsdom/PhantomJS)に依存します。
// uncss: URL を指定して実行
const uncss = require('uncss');
uncss(['http://localhost:3000'], {
css: './src/css/main.css',
ignore: ['.js-enabled'] // 動的クラスを無視
}, function(error, output) {
console.log(output); // 最適化された CSS
});
現代のフロントエンド開発では、Webpack、PostCSS、Vite などとの連携が必須です。
purgecss は、主要なエコシステムに公式プラグインを提供しています。
@fullhuman/postcss-purgecss や purgecss-webpack-plugin を使うことで、設定ファイルに数行追加するだけで導入できます。// purgecss: PostCSS プラグインとして設定
// postcss.config.js
module.exports = {
plugins: {
purgecss: {
content: ['./public/**/*.html'],
defaultExtractor: content => content.match(/[\w-/:]+(?<!:)/g) || []
}
}
}
purify-css は、Webpack プラグインが存在しますが、更新頻度は低いです。
// purify-css: Webpack プラグイン例
const PurifyCSSPlugin = require('purifycss-webpack');
module.exports = {
plugins: [
new PurifyCSSPlugin({
paths: glob.sync(path.join(__dirname, 'src/*.html'))
})
]
}
uncss は、Grunt や Gulp との相性が良く設計されていました。
// uncss: Gulp タスク例
const gulp = require('gulp');
const uncss = require('gulp-uncss');
gulp.task('css', function () {
return gulp.src('src/css/*.css')
.pipe(uncss({ html: ['src/**/*.html'] }))
.pipe(gulp.dest('dist'));
});
パッケージの長期的な安定性は、アーキテクチャ選定において最も重要な要素の一つです。
purgecss は活発にメンテナンスされています。
purify-css はメンテナンスが停滞しています。
uncss は事実上開発が終了しています。
| 機能 | purgecss | purify-css | uncss |
|---|---|---|---|
| 解析手法 | 静的解析(高速) | ヘッドレスブラウザ(低速) | ヘッドレスブラウザ(低速) |
| メンテナンス | ✅ 活発 | ⚠️ 停滞 | ❌ 終了推奨 |
| Webpack 統合 | ✅ 公式プラグイン | ⚠️ コミュニティ製 | ⚠️ 限定的 |
| PostCSS 統合 | ✅ 対応 | ❌ 非対応 | ❌ 非対応 |
| 動的クラス検出 | ⚠️ 設定が必要 | ✅ 自動(レンダリングベース) | ✅ 自動(レンダリングベース) |
| 推奨度 | 強く推奨 | 非推奨 | 非推奨 |
purgecss が唯一の現実的な選択肢です。
ヘッドレスブラウザに依存する purify-css や uncss は、理論的には JavaScript で生成されるクラスを捉えやすいという利点がありました。しかし、実際の開発現場では、ビルド時間の増大と環境構築の複雑さというコストの方が大きすぎます。また、PhantomJS の開発終了により、これらのツールは基盤技術を失っています。
一方、purgecss は静的解析の限界を、safelist(除外リスト)機能で補っています。これにより、動的なクラス名も設定ファイルで明示的に守ることができ、結果としてビルドの再現性と速度が担保されます。
最終的なアドバイス:
新規プロジェクトでは迷わず purgecss を採用してください。既存プロジェクトで uncss や purify-css を使用している場合は、技術的負債として認識し、段階的に purgecss への移行計画を立てるべきです。パフォーマンスとメンテナンス性の両面で、それが最善のアーキテクチャ判断となります。
新しいプロジェクトでは常に purgecss を選択すべきです。これは現在も活発にメンテナンスされており、PostCSS、Webpack、Vite などの主要なビルドツールと公式に統合されています。静的解析に基づく高速な処理と、SPA(シングルページアプリケーション)に対応した柔軟な設定が可能です。
既存のレガシープロジェクトで既に導入されている場合を除き、新規採用は推奨しません。ヘッドレスブラウザ(PhantomJS)に依存するアーキテクチャは古く、メンテナンス頻度が低いため、現代的なビルドパイプラインとの相性に課題があります。
新規プロジェクトでの使用は避けるべきです。公式に非推奨(deprecated)またはメンテナンスが停止しており、ヘッドレスブラウザによるレンダリングが必要となるため処理が遅く、動的なコンテンツの扱いも困難です。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.
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.