6
votes

Le serveur de développement Webpack regarde Twig

J'utilise Symfony 4 avec Symfony Encore pour gérer les ressources et certaines fonctionnalités utiles, telles que HMR.

Actuellement, je peux gérer les fichiers Sass, les fichiers CSS, JS, etc., et cela fonctionne très bien avec HMR.

Maintenant, j'aimerais pouvoir faire en sorte que le serveur de développement Weback surveille les fichiers * .twig pour les changements et déclenche un rechargement en direct (car le rechargement à chaud ne serait pas une option pour les modèles rendus côté serveur).

J'ai vu des choses sur les options --watchContentBase et contentBase , mais cela ne fait rien dans mon cas:

WDS CLI:

const Encore = require('@symfony/webpack-encore');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

Encore
    .setOutputPath('public/build/')
    .setPublicPath('/build')
    .cleanupOutputBeforeBuild()
    .autoProvidejQuery()  
    .addPlugin(new MiniCssExtractPlugin('[name].css'))
    .enableSourceMaps(!Encore.isProduction())
    .addLoader({
        test: /\.(sc|sa|c)ss$/,
        use: ['css-hot-loader'].concat(
            MiniCssExtractPlugin.loader,
            {
                loader: 'css-loader'
            },
            {
                loader: 'postcss-loader'
            },
            // {
            //     loader: 'postcss-loader'
            // },
            {
                loader: 'sass-loader'
            }            
        ),
      },)
      .addLoader({
        test: /\.twig$/,
        loader: 'raw-loader'
      },)
    .enableVersioning(Encore.isProduction())
    .addEntry('autocall-main', './assets/js/index.js')
    // .addStyleEntry('autocall-main', ['./assets/scss/index.scss'])
    .splitEntryChunks()
    .enableSingleRuntimeChunk()
;
const config = Encore.getWebpackConfig();

module.exports = config;

webpack.config.js:

./node_modules/.bin/encore dev-server --hot --disable-host-check --watchContentBase --contentBase ./templates/ --reload

Mes fichiers / dossiers de projet suivent le Symfony 4 classique structure: https://github.com/symfony/demo

Que me manque-t-il?


3 commentaires

Juste curieux de savoir pourquoi avez-vous besoin de webpack pour regarder les fichiers twig, le framework ne met-il pas automatiquement à jour le cache dans l'environnement de développement?


Juste pour effectuer un rechargement en direct lorsque je change / sauvegarde des fichiers * .twig. Juste pour gagner du temps en actualisant manuellement les navigateurs toute la journée.


Je peux y parvenir en utilisant le plugin BrowserSync, mais j'aimerais éviter de l'utiliser, tant que WDS peut le faire.


4 Réponses :


0
votes

Le chargeur doit également connaître l'emplacement des fichiers .twig , qui dans Symfony 4 se trouvent dans le répertoire / templates . Compte tenu de la structure par défaut, cela devrait le faire fonctionner pour vous:

  ...
  .addLoader({
    test: /\.twig$/,
    loader: 'raw-loader',
    include: [
      path.resolve(__dirname, "templates")
    ],
  },)
  ...


4 commentaires

Il est intéressant de noter que la documentation Symfony pour WebPack Encore n'utilise pas __ dirname mais la syntaxe ./templates . Si ce qui précède ne fonctionne pas, essayez celui-ci également.


Cela ne fonctionne pas, j'ai essayé d'inclure des templates et ./templates , mais lorsque j'apporte des modifications sur ./templates/base.html.twig, WDS ne voit pas tout changement.


Vous avez donc essayé à la fois path.resolve (__ dirname, "templates") et path.resolve ("./ templates") ?


Oui, mais dans les deux cas, WDS ne voit aucune modification sur les fichiers Twig.



0
votes

Il semble qu'il n'y ait aucun moyen de faire cela (lisez plus à ce sujet a>). Comme le mentionne l'interlocuteur, vous pouvez le faire avec BrowserSync. Ma configuration Symfony préférée est d'avoir deux terminaux en cours d'exécution:

Prérequis

Installez BrowserSync:

browser-sync start --proxy "https://127.0.0.1:8000/" --files "templates"

Premier terminal

Démarrer le serveur Symfony sur https://127.0.0.1:8000/ et compiler les actifs sur https: // localhost: 8010 / :

symfony server:start -d ; yarn encore dev-server --https --port 8010

Deuxième terminal h3 >

Rechargez la demande de votre navigateur pour https: // localhost: 3000 / chaque fois qu'un fichier Twig est modifié:

npm install -g browser-sync


0 commentaires

0
votes

Si vous n'avez besoin que de la synchronisation du navigateur, vous pouvez créer bs-config.js:

browser-sync start --config bs-config.js

puis exécuter

module.exports = {
    "files": [
        "templates/**/*.twig",
        "src/**/*.php"
    ],
    "proxy": "https://localhost:8000",
};

n'oubliez pas de accepter le "site dangereux" au démarrage


0 commentaires

1
votes

Aujourd'hui, l'année 2020, j'ai deux solutions:

Solution de configuration Webpack

Comme vous l'aviez dit: J'ai vu des choses sur les options --watchContentBase et contentBase ... , cela n'a rien à voir avec encore. Il s'agit d'une configuration Webpack par défaut et vous pouvez en savoir plus sur document Webpack ici

Selon documentation Advanced Webpack Config ici , vous pouvez étendre les configurations du pack Web en appelant var config = Encore.getWebpackConfig ();

J'ai implémenté comme indiqué dans le code ci-dessous. Pour mon cas, cela fonctionne très bien.

// webpack.config.js
const WatchExternalFilesPlugin = require('webpack-watch-files-plugin').default;

Encore
    // ...your code

     .addPlugin(new WatchExternalFilesPlugin({
            files: [
                '/templates', // watch files in templates folder
                '/src', // watch files in src folder
                '!../var', // don't watch files in var folder (exclude)
            ],
            verbose: true
        }))

    //...your code
;

Une autre solution

Si vous avez besoin d'une implémentation simple, vous pouvez utiliser: webpack-watch-files-plugin . Je préfère cela, au moment où vous lirez cette réponse, elle pourrait être abandonnée mais il y en a beaucoup d'autres avec les mêmes fonctionnalités. Dans documentation Symfony ici , vous pouvez implémenter des chargeurs personnalisés et Plugins comme ci-dessous. En utilisant le plugin mentionné ci-dessus, nous pouvons l'implémenter comme suit:

// webpack.config.js
var Encore = require('@symfony/webpack-encore');
var path = require('path');

// Manually configure the runtime environment if not already configured yet by the "encore" command.
// It's useful when you use tools that rely on webpack.config.js file.
if (!Encore.isRuntimeEnvironmentConfigured()) {
    Encore.configureRuntimeEnvironment(process.env.NODE_ENV || 'dev');
}

Encore
    // directory where compiled assets will be stored
    .setOutputPath('public/build/')
    .setPublicPath('/build')
    .addEntry('global', './assets/app.js')

    // ... Your other encore code


    // EXTEND/OVERRIDE THE WEBPACK CONFIG

    const fullConfig = Encore.getWebpackConfig();
    fullConfig.name = 'full';

    // watch options poll is used to reload the site after specific set time
    // polling is useful when running Encore inside a Virtual Machine
    // more: https://webpack.js.org/configuration/watch/
    fullConfig.watchOptions = {
        poll: true,
        ignored: /node_modules/
    };

    fullConfig.devServer = {
        public: 'http://localhost:3000',
        allowedHosts: ['0.0.0.0'],
        // extend folder to watch in a symfony project
        // use of content base
        // customize the paths below as per your needs, for this simple 
        //example i will leave them as they are for now.
        contentBase: [
            path.join(__dirname, 'templates/'), // watch twig templates folder
            path.join(__dirname, 'src/') // watch the src php folder
        ],
        // enable watching them
        watchContentBase: true,
        compress: true,
        open: true,
        disableHostCheck: true,
        progress: true,
        watchOptions: {
            watch: true,
            poll: true
        }
    };


// export it
module.exports = fullConfig;

Cheers. Bon codage!


0 commentaires