Symfony Encore: CSS Hotreload

von CodeKanal @codekanal

Symfony bietet eine JavaScript Bibliothek an, die eine nahtlose Integration von Webpack in ein Symfony Projekt bietet. Twig Funktionen übernehmen das korrekte einbinden der CSS und JavaScript Dateien; Webpack generiert die JavaScript und CSS Dateien mit allen verfügbaren Plugins und dem gesamten Node Ecosystem. Die Bibliothek heißt Webpack Encore (@symfony/webpack-encore).

Zum optimierten Generieren der Assets gibt es das Script npm run build. Zum Generieren während der Entwicklung gibt es neben dem Script npm run dev noch zwei weitere. 

Leider funktioniert dieses Hot-Reload nicht mit CSS Dateien. Sobald sich eine CSS bzw. SCSS oder SASS Datei geändert, muss die ganze Seite neu geladen werden. Mit dem folgenden Code kann die Konfiguration so geändert werden, dass das Hot-Reload auch mit CSS Dateien funktioniert.

Am Ende der Datei webpack.config.js die folgende Zeit ersetzten: module.exports = Encore.getWebpackConfig() mit:

const webpackConfig = Encore.getWebpackConfig()
if (webpackConfig.devServer) {
    webpackConfig.devServer.quiet = false; // more verbose output

    // remove css extract
    webpackConfig.plugins.shift();

    // find rules that process scss files
    for (rule of webpackConfig.module.rules) {
        if (rule.test.toString().match(/s\[ac\]ss/)) {
            if(rule.oneOf){
                for (let set of rule.oneOf) {
                    // replace mini-css-extract-plugin/dist/loader.js with style-loader
                    set.use[0] = {
                        loader: 'style-loader'
                    };
                }
            } else {
                // older webpack versions
                rule.use[0] = {
                    loader: 'style-loader'
                };
            }
        }
    }
}
module.exports = webpackConfig;

Durch entfernen des CSS Extract Plugins, was den CSS Code auf die Festplatte schreibt und durch hinzufügen des style-loaders, wird auch ein Hot-Reload von CSS erreicht.

Dann mit ./node_modules/.bin/encore dev-server --hot starten.