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:
CSS
Minification
Performance
Optimisation
CSSO
Tutoriel

Pourquoi minifier le CSS en 2026 ?

Minifier du CSS n’est pas supprimer les règles mortes, extraire le critical CSS, ni activer gzip/Brotli. La minification réécrit la feuille que vous servez déjà : commentaires et espaces disparaissent, couleurs et zéros raccourcissent, les sélecteurs dupliqués adjacents peuvent fusionner. Les noms de classes restent le contrat avec le HTML — contrairement au mangling JavaScript. Vous pouvez tester cette étape dans le navigateur avec le minificateur CSS en ligne FastMinify (CSSO, sans envoi). Les applis de production restent dans le build. Ce guide couvre CSSO tel qu’il fonctionne, les outils de CSS inutilisé qui ont remplacé PurifyCSS, Webpack/Vite, et quand un champ coller suffit.

Feuilles écrites à la main : souvent environ 20–40 % d’octets en moins avant gzip ou Brotli (même ordre de grandeur que la doc de l’outil — pas une garantie de ranking)
Un CSS bloquant plus petit peut aider le LCP ; la minification seule ne corrige pas un hero de 2 Mo ni une police tardive
La suppression du CSS inutilisé (PurgeCSS, scan content Tailwind) est un levier différent, souvent plus gros sur un framework
CSSO en ligne convient à un fichier ou quelques fichiers ; le build répète le pipeline à chaque deploy
La compression sur le fil reste une couche serveur/CDN — gzip/Brotli après la minification

Minifier vs CSS inutilisé vs compression

Trois couches, trois outils

Un récit « CSS passé de 1,8 Mo à 420 Ko » n’est presque jamais du minify-only : c’est d’abord du CSS framework non utilisé, puis minify, puis gzip. Les chiffres marketing mélangent les pipelines. Le minificateur FastMinify ne scanne pas votre HTML. Pour le parallèle JavaScript : tree shaking vs minification.

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

Le signal Google est l’INP, et non plus le FID. Un CSS minifié peut réduire le téléchargement et le parse des feuilles bloquantes, ce qui peut soutenir le LCP. Il ne renomme pas les classes, n’extrait pas le above-the-fold, ni ne réserve la place des images. Mesurez avec Lighthouse ou CrUX — ne promettez pas un gain en millisecondes ni en conversion. Après minify, compresser encore : guide GZIP/Brotli Apache et Nginx.

LCP : un CSS bloquant plus petit aide si l’élément LCP dépend de ce fichier — pas si le goulot est une vidéo ou une image tardive
INP (pas FID) : le minify CSS est un levier faible ; les longues tâches sont surtout du JavaScript
CLS : minify ne réserve pas images/polices ; le restructure agressif CSSO peut même mélanger la cascade
Sur le fil : gzip/Brotli s’applique encore après minify — avec la compression serveur, pas à sa place

Configurer CSSO (le moteur de FastMinify)

Installer et minifier avec les options CSSO réelles

CSSO (CSS Optimizer) parse avec CSSTree, puis nettoie, compresse et restructure éventuellement les rulesets. La page Minifier CSS exécute CSSO dans le navigateur : le niveau de compression correspond à restructure/merge ; Agressif peut changer l’ordre source. Les extraits ci-dessous sont l’API publique — pas des flags inventés.

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
usage est une whitelist, pas PurgeCSS

L’option `usage` de CSSO liste tags, ids et classes présents dans le markup pour supprimer des sélecteurs. Vous devez maintenir cette liste. Ce n’est pas un scan de `*.html` / `*.jsx`. Une classe construite en JavaScript disparaît si elle est omise. Pour le vrai unused-CSS : PurgeCSS ou les content paths Tailwind ; gardez `usage` pour des surfaces petites et connues.

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)`); }

CSS inutilisé : PurgeCSS, Tailwind, usage CSSO

PurgeCSS (pas PurifyCSS)

PurifyCSS est un projet stagnant. En 2026, scannez le contenu avec PurgeCSS (ou le scan content / `@source` de Tailwind). 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.

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'] });

Tailwind : content paths, pas de double purge

// 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. */

CSS de production : Webpack et Vite

Webpack : cssnano via CssMinimizerPlugin (pas CSSO par défaut)

Un pipeline Webpack prod extrait souvent avec MiniCssExtractPlugin et minifie avec css-minimizer-webpack-plugin. Le moteur par défaut est cssnano, pas CSSO. Vous pouvez toujours lancer CSSO en script npm ou via un minimizer custom. Vite minifie le CSS en production via build.cssMinify — historiquement esbuild, Lightning CSS sur les majeurs plus récents. Lisez la doc Vite de votre version. Thème WordPress sans build JS : 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" } }

Critical CSS, sélecteurs, en ligne vs build

Le critical CSS est un autre workflow

Inliner le above-the-fold et charger le reste en async n’est pas le travail d’un minificateur. Extraire d’abord, puis minifier le bloc critique. Guide : Critical CSS : extraire, minifier, inliner.

Extraire les règles above-the-fold (critical, Penthouse, ou un subset du design system)
Minifier ce bloc (CSSO en ligne ou le même moteur que le build) avant l’inline
Charger le reste avec un motif non bloquant que vous avez testé
Sur WordPress, « optimize CSS delivery » est cette couche — pas FastMinify
Profondeur des sélecteurs vs poids fichier

Les sélecteurs profonds coûtent surtout en maintenance et spécificité, pas seulement en kilo-octets. Minify n’aplatira pas `.container .row .card .title` pour vous. Moins de classes, plus stables — puis minify.

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-minifier convient à une surcharge de thème enfant, un CSS de landing ponctuel, ou pour voir ce que CSSO fait d’un snippet avant de changer le build. Ce n’est pas le seul pipeline d’une appli qui ship à chaque commit. Arbitrages : minificateurs en ligne vs outils de build. Compiler SCSS/LESS d’abord — hub préprocesseurs CSS — puis minifier le CSS.

Utilisez Minifier CSS pour les fichiers collables ; concaténez sur cette page si vous fusionnez quelques feuilles
Laissez Agressif éteint si la cascade dépend de l’ordre source
Garder les commentaires n’a de sens que si vous acceptez un moins bon gain de poids
Verrouillez la même étape dans Webpack, Vite ou la CI pour que la prod ne saute pas minify

Mesurer le CSS, ne pas deviner

Quoi regarder

La taille sur disque n’est pas les octets sur le fil. Vérifiez la taille compressée dans l’onglet Réseau, Coverage pour les octets inutilisés, et le LCP de champ — pas un « score CSS » inventé.

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 LCP — pas une note CSS seule
WebPageTest : filmstrip + waterfall de la feuille de style
CI : échouer sur les régressions que vous avez définies

Un score Lighthouse « page entière » n’est pas un budget CSS. Préférez une taille max sur l’artefact CSS extrait, puis éventuellement une assertion perf 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 que vous maîtrisez déjà. Retirez les règles mortes avec PurgeCSS ou le scan Tailwind — pas avec PurifyCSS, et pas avec le champ coller FastMinify. Utilisez le minificateur CSS en ligne pour inspecter un fichier ou un snippet custom. Si le site est WordPress sans build front, commencez par la minification plugin en staging plutôt que d’inventer un plugin FastMinify.

Garder CSSO (ou cssnano / Lightning CSS) dans les builds de production, pas seulement dans un onglet
Traiter unused CSS et critical CSS comme des pipelines à part, avec leurs tests
Ne pas activer le restructure CSSO sur une cascade non régression-testée
Mesurer la taille transférée compressée et le LCP, pas le folklore du taux de rebond
WordPress : un seul stack minify, CSS avant JS, excludes avant le combine
Partager cet article
Partager cet article: