close icon
close icon

    Remplacer SCSS par PostCSS, sus à l'usine à gaz


    Pourquoi cet article

    J'utilise peu de fonctionnalités de scss, même pour des projets de grande taille. Je trouve que le css scopé ou a minima les imports suffisent à organiser les feuilles de style. Parmis les fonctionnalités non disponibles dans le CSS natif et qui me servent souvent, il y a les variables (e.g. $button-color=#eeeeee) et les styles imbriqués. C'est vraiment sous exploiter scss.

    En fouillant sur la façon de porter mon css sur des navigateurs qui datent, je suis tombé sur PostCSS. PostCSS transforme le code CSS incompatible avec du Javascript. C'est tout. Et si on en veut plus, on ajoute des plugins. Très léger, extensible, et déjà bien fourni par sa communauté, c'était l'outil idéal pour moi. Et si comme moi vous utilisez peu de fonctionnalités SCSS, porter le code ne demandera que d'ajouter une poignée de plugins qui resteront plus légers que d'utiliser node-sass. Pour comparaison, mes fichiers sont près de deux fois moins lourds avec PostCSS qu'avec node-sass, et je gagne une poignée de secondes au temps de build.

    Au passage, pour ceux qui utilisent Vue, sachez que PostCSS est déjà embarqué notamment pour permettre d'utiliser le mot clé scoped qui isole les feuilles de style entre composant. Vous pouvez donc déjà tirer parti de sa puissance en lui ajoutant des plugins.

    Au revoir npm rebuild node-sass.

    Webpack et PostCSS

    J'utilise Webpack sur mes projets, je ne fournirai donc pas d'exemple avec yarn ou autre, mais utiliser PostCSS devrait être très simple quel que soit l'outil.

    Voilà ce dont vous avez besoin

    Installer les paquets de PostCSS et des plugins qui vous intéressent

    La base, les deux premiers paquets sont certainement déjà présents si vous utilisiez scss :

    npm install --save style-loader css-loader postcss-loader
    

    Pour ne plus s'embêter avec les préfixes spécifiques à chaque navigateur :

    npm install --save autoprefixer
    

    Pour pouvoir importer des fichiers css dans d'autres fichiers css :

    npm install --save postcss-easy-import
    

    Pour permettre l'imbrication de classes :

    npm install --save postcss-nested
    

    Pour pouvoir utiliser les dernières fonctionnalités CSS mais les rendre compatibles avec les anciens navigateurs :

    npm install --save postcss-preset-env
    

    Pour pouvoir utiliser des variables :

    npm install --save postcss-simple-vars
    

    Configuration de PostCSS

    Vous aurez besoin de renseigner les plugins que vous voulez appliquer ainsi que leur configuration. Pour cela j'utilise un fichier postcss.config.js. Notez que les plugins seront appliqués dans l'ordre dans lequel ils seront renseignés ici.

    module.exports = {
        plugins: {
            'postcss-easy-import': {},
            'postcss-nested': {},
            'postcss-simple-vars': {},
            'autoprefixer': {},
            'postcss-preset-env': {},
        },
    };
    

    J'utilise la configuration par défaut pour chacun. Mais vous pourriez par exemple changer les versions de navigateur supportées par votre site :

    ...
    'postcss-preset-env': { browsers: 'last 2 versions' },
    ...
    

    Règles Webpack

    Pour que PostCSS traite vos fichiers, il faut qu'il sélectionne les fichiers avec l'extension que vous utilisez (e.g. .css), et qu'il applique un ensemble de loaders.

    module: {
        rules: [
            ... d'autres règles ...
            {
                test: /\.css$/,
                use: [{
                    loader: 'style-loader',
                }, {
                    loader: 'css-loader',
                    options: {
                        importLoaders: 1,
                    }
                }, {
                    loader: 'postcss-loader',
                }],
            },
        ]
    }
    

    C'est tout.

    D'autres idées de plugin

    Et rien à voir ou presque :