Сервер разработки Webpack наблюдает за Twig

Я использую Symfony 4 с Symfony Encore для обработки ресурсов и некоторых полезных функций, таких как HMR.

В настоящее время я могу обрабатывать файлы Sass, файлы CSS, JS и т. д., И он отлично работает с HMR.

Теперь я хотел бы иметь возможность заставить сервер разработчика Weback отслеживать файлы * .twig на предмет изменений и запускать перезагрузку в реальном времени (поскольку горячая перезагрузка не подходит для шаблонов, отображаемых на стороне сервера).

Я видел кое-что о вариантах --watchContentBase и contentBase, но в моем случае это ничего не дает:

WDS CLI:

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

webpack.config.js:

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;

Мои файлы / папки проекта соответствуют классической структуре Symfony 4: https://github.com/symfony/demo

Что мне там не хватает?

Просто любопытно, зачем вам webpack для просмотра файлов twig, разве фреймворк не обновляет кеш автоматически в среде разработки?

Arleigh Hix 20.01.2019 22:19

Просто чтобы выполнить живую перезагрузку, когда я изменяю / сохраняю файлы * .twig. Просто чтобы сэкономить время, вручную обновляйте браузеры весь день.

enguerranws 21.01.2019 14:15

Я могу добиться этого с помощью плагина BrowserSync, но я бы не хотел его использовать, если WDS может это делать.

enguerranws 21.01.2019 14:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
7
3
2 446
5

Ответы 5

Загрузчику также необходимо знать расположение файлов .twig, которые в Symfony 4 находятся в каталоге /templates. Учитывая структуру по умолчанию, это должно заставить ее работать на вас:

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

Интересно, что документы Symfony для WebPack Encore использует не __dirname, а синтаксис ./templates. Если вышеперечисленное не сработает, попробуйте и этот.

Siavas 26.01.2019 16:40

Это не работает, я попытался включить templates и ./templates, но когда я вношу изменения в ./templates/base.html.twig, WDS не видит никаких изменений.

enguerranws 30.01.2019 09:44

Значит, вы пробовали и path.resolve(__dirname, "templates"), и path.resolve("./templates")?

Siavas 30.01.2019 14:38

Да, но в обоих случаях WDS не видит изменений в файлах Twig.

enguerranws 05.02.2019 09:29

Похоже, что нет возможности это сделать (прочтите подробнее об этом). Как упоминает спрашивающий, вы можете сделать это с помощью BrowserSync. Я предпочитаю установку Symfony, чтобы работало два терминала:

Предпосылки

Установите BrowserSync:

npm install -g browser-sync

Первый терминал

Запустите сервер Symfony на https://127.0.0.1:8000/ и создайте активы на https: // localhost: 8010 /:

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

Второй терминал

Перезагружайте запрос вашего браузера для https: // localhost: 3000 / каждый раз, когда файл Twig изменяется:

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

Если вам нужна только синхронизация браузера, вы можете создать bs-config.js:

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

а затем запустить

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

не забудьте принять "опасный сайт" при запуске

Сегодня, в 2020 году, у меня есть два решения:

Конфигурационное решение Webpack

Как вы уже сказали: I've seen things about --watchContentBase and contentBase options..., это не имеет ничего общего с выходом на бис. Это конфигурация веб-пакета по умолчанию, и вы можете узнать больше из документ webpack здесь

Согласно Документы Advanced Webpack Config здесь вы можете расширить конфигурации веб-пакетов, вызвав var config = Encore.getWebpackConfig();

Я реализовал, как показано в приведенном ниже коде. В моем случае он работает нормально.

// 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-смотреть-файлы-плагин. Я предпочитаю это, к тому времени, когда вы прочитаете этот ответ, он может быть оставлен, но есть много других с такой же функциональностью. В Документы Symfony здесь вы можете реализовать пользовательские загрузчики и плагины, как показано ниже. Используя вышеупомянутый плагин, мы можем реализовать его следующим образом:

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

Ваше здоровье. Удачного кодирования!

С Symfony 5.4 и Encore 1.0.0 вы можете настроить devServer вручную в webpack.config.js

...
 .configureDevServerOptions((options) => {
        options.liveReload = true;
        options.hot = true;
        options.watchFiles = [
            './templates/**/*',
            './src/**/*'
        ]
    })
...

Это работает, но, к сожалению, портит HMR для записей Encore. Это работает только с параметром liveReload, установленным в true, но затем перезагружает изменения, которые можно обновить с помощью HMR, например css, js и т. д.

Marfee 25.08.2021 15:08

Другие вопросы по теме