Webpack开发服务器监视Twig

时间:2019-01-15 09:54:49

标签: symfony webpack webpack-dev-server

我正在使用带有Symfony Encore的Symfony 4来处理资产和一些有用的功能,例如HMR。

当前,我可以处理Sass文件,CSS文件,JS等,并且可以与HMR正常工作。

现在,我希望能够使Weback开发服务器监视* .twig文件中的更改并触发实时重新加载(因为热重新加载对于服务器端呈现的模板而言不是一种选择)。

我已经看到了关于contentBase./node_modules/.bin/encore dev-server --hot --disable-host-check --watchContentBase --contentBase ./templates/ --reload 选项的事情,但是对于我来说,它什么都没做:

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:

{{1}}

我的项目文件/文件夹遵循经典的Symfony 4结构:https://github.com/symfony/demo

我在那里想念什么?

5 个答案:

答案 0 :(得分:1)

今天,到2020年,我有两个解决方案:

Webpack配置解决方案

如您所说:I've seen things about --watchContentBase and contentBase options...,这与再加无关。它是默认的Webpack配置,您可以从webpack doc here

了解更多信息

根据Advanced Webpack Config docs here,您可以通过调用var config = Encore.getWebpackConfig();

来扩展Webpack配置

我已经实现了下面的代码所示。就我而言,它可以正常工作。

// 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;

另一种解决方案

如果需要简单的实现,可以使用:webpack-watch-files-plugin。我更喜欢这样,到您阅读此答案时,它可能已被放弃,但有许多其他功能相同。在Symfony docs here中,您可以执行以下自定义加载器和插件。使用上面提到的插件,我们可以做到如下:

// 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
;

干杯。编码愉快!

答案 1 :(得分:0)

加载程序还需要知道.twig文件的位置,这些文件在Symfony 4中位于/templates目录中。考虑默认结构,这应该使其适合您:

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

答案 2 :(得分:0)

似乎没有办法做到这一点(读more on this)。正如发问者所提到的,您可以使用BrowserSync做到这一点。我首选的Symfony设置是要运行两个终端:

先决条件

安装BrowserSync:

npm install -g browser-sync

第一个航站楼

https://127.0.0.1:8000/上启动Symfony服务器,并在https://localhost:8010/上构建资产:

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

第二终端

每次更改Twig文件时,重新加载浏览器对https://localhost:3000/的请求:

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

答案 3 :(得分:0)

如果仅需要浏览器同步,则可以创建bs-config.js:

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

然后运行

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

记住在启动时接受“危险站点”

答案 4 :(得分:0)

使用 Symfony 5.4 和 Encore 1.0.0,您可以在 webpack.config.js 中手动配置 devServer

>>> l = [1]
>>> cond = True
>>> bool(l * cond)
True
>>> cond = False
>>> bool(l * cond)
False