Guide minification CSS : CSSO, CSS inutilisé, builds

Guide minification CSS : CSSO, CSS inutilisé, builds

Minifier du CSS en 2026 : CSSO, CSS inutilisé, Vite/Webpack, face à un minificateur en ligne. Limites honnêtes avant de chasser les octets.

29.10.2025
12 min de lecture
Partager cet article:
CSSMinificationPerformanceOptimisationCSSOTutoriel

Ce que fait (et ne fait pas) la minification CSS

Minifier du CSS n’est pas la même tâche que supprimer les règles inutilisées, extraire le CSS critique ou activer gzip/Brotli. La minification réécrit sous une forme plus courte la feuille de style que vous servez déjà. Commentaires et espaces disparaissent, couleurs et zéros raccourcissent, les sélecteurs identiques adjacents peuvent fusionner. Les noms de classes restent le contrat avec votre HTML, contrairement au renommage des identifiants en JavaScript. Vous pouvez tester cette étape dans le navigateur avec le minificateur CSS en ligne de FastMinify (CSSO, sans envoi de fichier). Pour une application en production, la minification appartient au build. Ce guide présente CSSO tel qu’il fonctionne, les outils de CSS inutilisé qui ont remplacé PurifyCSS, Webpack et Vite, et les cas où un champ de saisie suffit.

Une feuille écrite à la main perd en général 20 à 40 % de ses octets avant gzip ou Brotli, la fourchette de la documentation de l’outil. Ce n’est pas une garantie de classement.
Un CSS bloquant plus petit peut aider le LCP ; la minification seule ne corrige ni une image d’en-tête de 2 Mo ni une police chargée tard
La suppression du CSS inutilisé (PurgeCSS, analyse des fichiers sources par Tailwind) est un autre levier, souvent plus important sur le CSS d’un framework
CSSO en ligne convient à un fichier ou à quelques fichiers ; le build rejoue la même chaîne à chaque déploiement
La compression sur le réseau reste une couche serveur ou CDN : activez gzip ou Brotli après la minification

Minifier, supprimer le CSS inutilisé ou compresser

Trois couches, trois outils

Une histoire du type « CSS passé de 1,8 Mo à 420 Ko » n’est presque jamais le fait de la minification seule. Une telle baisse combine en général la suppression du CSS inutilisé d’un framework, puis la minification, puis gzip : les chiffres des articles commerciaux mélangent plusieurs étapes. Le minificateur de FastMinify n’analyse pas votre HTML. Pour le même partage côté JavaScript, voir tree shaking vs minification.

Code CSS à l’écran illustrant l’optimisation des performances
Ce qui bouge vraiment les Core Web Vitals

L’INP a remplacé le FID parmi les Core Web Vitals en mars 2024. Un CSS minifié peut réduire le téléchargement et l’analyse des feuilles de style bloquantes, ce qui peut soutenir le LCP. Il ne renomme pas les classes, n’extrait pas les règles du haut de page et ne réserve pas la place des images. Mesurez avec Lighthouse ou CrUX, et ne promettez ni un nombre de millisecondes ni un gain de conversion. Après la minification, activez quand même la compression : voir le guide GZIP/Brotli Apache et Nginx.

LCP : un CSS bloquant plus petit aide si l’élément LCP dépend de ce fichier, mais pas si le goulot est une vidéo ou une image tardive
INP : minifier le CSS est un levier faible, car ce sont surtout des scripts qui bloquent longtemps le fil principal
CLS : la minification ne réserve pas la place des images ni des polices, et la restructuration agressive de CSSO peut même réordonner la cascade
Sur le réseau : gzip ou Brotli s’applique encore après la minification, donc cumulez les deux

Configurer CSSO (le moteur de FastMinify)

Installer et minifier avec les options CSSO réelles

CSSO (CSS Optimizer) analyse la feuille avec CSSTree, puis la nettoie, la compresse et, si vous le demandez, restructure les jeux de règles. La page Minifier CSS de FastMinify exécute CSSO dans votre navigateur. Son niveau de compression décide jusqu’où aller. Conservateur garde chaque règle et refait l’indentation de la sortie. Normal minifie en conservant l’ordre de la cascade. Agressif restructure les jeux de règles, ce qui peut changer l’ordre d’origine. Les extraits qui suivent utilisent l’API publique de CSSO.

Installation

npm install --save-dev csso csso-cli

API (Node)

const csso = require('csso'); const result = csso.minify(css, { restructure: true, comments: false }); console.log(result.css);

CLI

npx csso src/styles.css --output dist/styles.min.css # Aperçu plus sûr (sans fusion structurelle) : # npx csso src/styles.css --no-restructure -o dist/styles.min.css
L’option usage est une allowlist, pas PurgeCSS

L’option `usage` de CSSO liste les balises, identifiants et classes présents dans votre HTML pour que les sélecteurs inutilisés soient supprimés. C’est à vous de tenir cette liste à jour. Elle n’analyse pas les fichiers `*.html` ou `*.jsx`, et une classe construite en JavaScript disparaît si vous l’omettez. Pour une vraie suppression du CSS inutilisé, utilisez PurgeCSS ou les chemins content de Tailwind, et gardez `usage` pour des cas petits et connus.

Configuration CSSO avec les options minify documentées

Configuration

const cssoConfig = { restructure: true, comments: false, usage: { tags: ['div', 'span', 'a', 'img'], ids: ['header', 'footer', 'main'], classes: ['btn', 'card', 'nav'] } };

Utilisation

const fs = require('fs'); const csso = require('csso'); function minifyCSS(inputPath, outputPath) { const css = fs.readFileSync(inputPath, 'utf8'); const result = csso.minify(css, cssoConfig); fs.writeFileSync(outputPath, result.css); const pct = ((css.length - result.css.length) / css.length * 100).toFixed(1); console.log(`${inputPath} -> ${outputPath} (${pct}% plus petit en source)`); }

Supprimer le CSS inutilisé avec PurgeCSS et Tailwind

PurgeCSS (pas PurifyCSS)

PurifyCSS n’est plus maintenu depuis des années. En 2026, analysez vos fichiers avec PurgeCSS ou avec l’analyse intégrée de Tailwind (chemins content et `@source`). FastMinify ne fait pas cette étape. Après avoir retiré les règles mortes, minifiez le reste avec CSSO ou cssnano, ou collez un fichier dans le minificateur CSS en ligne pour vérifier le résultat.

Installation

npm install --save-dev purgecss

PurgeCSS (API v8)

import { PurgeCSS } from 'purgecss'; const [{ css }] = await new PurgeCSS().purge({ content: ['src/**/*.html', 'src/**/*.{js,jsx,ts,tsx}'], css: ['src/**/*.css'] });

Chemins content de Tailwind, sans purge supplémentaire

// tailwind.config.js (v3) — lister chaque template qui peut émettre des classes module.exports = { content: ['./src/**/*.{html,js,ts,jsx,tsx}'], theme: { extend: {} } }; /* Tailwind v4 : préférer @source dans le CSS plutôt qu’un second PurgeCSS sauf si vous savez pourquoi les deux. Les classes dynamiques restent à safelister. */

Le CSS de production avec Webpack et Vite

Webpack minifie avec cssnano via CssMinimizerPlugin, pas avec CSSO

Un pipeline Webpack de production extrait en général les fichiers avec MiniCssExtractPlugin et les minifie avec css-minimizer-webpack-plugin. Le moteur par défaut de ce plugin est cssnano, pas CSSO, même si vous pouvez toujours lancer CSSO dans un script npm ou un minificateur personnalisé. Vite minifie le CSS en production via build.cssMinify : Lightning CSS par défaut dans les versions récentes, esbuild dans les précédentes. Lisez la documentation de Vite pour votre version plutôt que de reprendre un « minificateur par défaut » cité pour une autre version majeure. Pour un thème WordPress sans build JavaScript, voir les plugins de minification WordPress.

Configuration Webpack

const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); module.exports = { mode: 'production', module: { rules: [ { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader' ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: 'styles.[contenthash].min.css' }) ], optimization: { minimizer: [ '...', new CssMinimizerPlugin() ] } };

package.json

{ "scripts": { "build": "webpack --mode=production", "minify:css": "csso src/styles.css --output dist/styles.min.css" }, "devDependencies": { "css-minimizer-webpack-plugin": "^8.0.0", "mini-css-extract-plugin": "^2.9.0", "csso-cli": "^4.0.0" } }

CSS critique, sélecteurs, en ligne ou dans le build

Le CSS critique est une chaîne à part

Un minificateur n’intègre pas dans le HTML le CSS du haut de page et ne charge pas le reste en asynchrone. Extrayez d’abord les règles critiques, puis minifiez ce bloc. Le guide complet se trouve dans Critical CSS : extraire, minifier, inliner.

Extrayez les règles du haut de page (`critical`, Penthouse ou un sous-ensemble de votre design system)
Minifiez ce bloc (CSSO en ligne ou le même moteur que votre build) avant de l’intégrer au HTML
Chargez le reste avec un motif non bloquant que vous avez testé
Sur WordPress, l’option « optimize CSS delivery » d’un plugin couvre cette couche, pas FastMinify
Profondeur des sélecteurs et poids du fichier

Les sélecteurs profonds coûtent surtout en maintenance et en conflits de spécificité, plus qu’en kilo-octets. La minification n’aplatira pas `.container .row .card .title` à votre place : préférez moins de classes, plus stables, puis minifiez.

Avant

/* Pénible à maintenir, pas seulement « lent à parser » */ .container .row .col-md-6 .card .card-body .card-title { color: #333; } .btn-primary, .btn.btn-primary, button.btn-primary { background: blue; }

Après

.card-title { color: #333; } .btn-primary { background: blue; }
Quand le minificateur en ligne suffit

Coller puis minifier convient à une surcharge de thème enfant ou à une feuille de style ponctuelle pour une page d’atterrissage. C’est aussi un moyen de voir ce que CSSO fait d’un extrait avant de changer le build. Ce n’est pas le bon outil comme seule chaîne de production d’une application publiée à chaque commit. Les arbitrages sont décrits dans minificateurs en ligne vs outils de build. Si vous écrivez du SCSS ou du Less, compilez d’abord avec le hub préprocesseurs CSS, puis minifiez le CSS.

Utilisez Minifier CSS pour les fichiers que vous pouvez coller, et concaténez sur cette page si vous fusionnez quelques feuilles
Laissez le niveau Agressif désactivé si votre cascade dépend de l’ordre d’origine
Ne conservez les commentaires que si un gain moindre vous convient. Sans suppression des commentaires, la page se contente de réduire les espaces et n’applique pas les réécritures de CSSO
Verrouillez la même étape dans Webpack, Vite ou la CI pour que la production ne saute pas la minification

Mesurer le CSS, ne pas deviner

Quoi regarder

La taille sur disque n’est pas le nombre d’octets transférés. Vérifiez la taille compressée dans l’onglet Réseau, les octets inutilisés dans Coverage et le LCP mesuré sur le terrain. Ne vous fiez pas à un « score de performance CSS » qui n’existe pas.

Tableau d’analyse de performance CSS : métriques et réduction de taille
Chrome Coverage : octets CSS inutilisés sur la page réellement chargée
DevTools Réseau : taille encodée vs décodée après gzip/Brotli
Lighthouse : CSS bloquant et détail du LCP, pas une note réservée au CSS
WebPageTest : le filmstrip et le waterfall des requêtes pour la feuille de style
Faire échouer le build sur les régressions que vous définissez

Un score Lighthouse de « la page entière » n’est pas un budget CSS. Fixez plutôt une taille maximale pour le fichier CSS extrait. Vous pouvez y ajouter une assertion de performance sur une URL stable.

Configuration GitHub Actions

name: CSS size check on: [push] jobs: css-budget: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - run: npm ci && npm run build - name: Fail if production CSS exceeds budget run: node scripts/check-css-size.js

Et ensuite

Minifiez le CSS avec CSSO ou cssnano dans le build auquel vous faites déjà confiance. Retirez les règles mortes avec PurgeCSS ou l’analyse de contenu de Tailwind, pas avec PurifyCSS et pas avec le champ de saisie de FastMinify. Utilisez le minificateur CSS en ligne pour inspecter un fichier ou un extrait particulier. Si le site est un WordPress sans build côté front, commencez par la minification plugin en staging plutôt que de chercher un plugin FastMinify.

Gardez CSSO (ou cssnano ou Lightning CSS) dans le build de production, et réservez l’onglet du navigateur aux vérifications ponctuelles
Traitez le CSS inutilisé et le CSS critique comme des chaînes à part, avec leurs propres tests
N’activez pas la restructuration de CSSO sur une cascade dont vous n’avez pas testé les régressions
Mesurez la taille transférée compressée et le LCP plutôt que de croire aux légendes sur le taux de rebond
WordPress : une seule pile de plugins de minification, le CSS avant le JS, les exclusions avant la concaténation
Partager cet article
Partager cet article: