Використання webpack-dev-server і HMR

Дата оновлення перекладу 2024-05-27

Використання webpack-dev-server і HMR

При розробці, замість використання encore dev --watch, ви можете використовувати webpack-dev-server:

1
$ npm run dev-server

Це створює та обслуговує фронтенд ресурси з нового серверу. Цей сервер за замовчуванням працює на localhost:8080, що означає, що ваші ресурси доступні за адресою localhost:8080/build. Цей сервер насправді не записує файли на диск; замість цього, він обслуговує їх з пам'яті, дозволяючи гаряче перебудування модулів.

Як наслідок, теги link та script мають вказувати на новий сервер. Якщо ви використовуєте скорочення Twig encore_entry_script_tags() та encore_entry_link_tags() (або обробляєте свої ресурси через entrypoints.json якимось іншим чином), ви закінчили: шляхи у ваших шаблонах будуть автоматично вказувати на сервер dev.

Опції dev-server

Команда dev-server підтримує всі опції, визначені webpack-dev-server. Ви можете встановити ці опції через командну строку опцій:

1
$ npm run dev-server -- --port 9000

Ви також можете встановити ці опції використовуючи метод Encore.configureDevServerOptions() у вашому файлі webpack.config.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// webpack.config.js
// ...

Encore
    // ...

    .configureDevServerOptions(options => {
        options.server = {
            type: 'https',
            options: {
                key: '/path/to/server.key',
                cert: '/path/to/server.crt',
            }
        }
    })
;

Ввімкнення HTTPS з використанням веб-серверу Symfony

Якщо ви використовуєте веб-сервер Symfony локально з HTTPS, вам необхідно буде також повідомити dev-серверу використовувати HTTPS. Щоб зробити це, ви можете знов використати сертифікат веб-серверу Symfony:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// webpack.config.js
  // ...
+ const path = require('path');

  Encore
      // ...

+     .configureDevServerOptions(options => {
+         options.server = {
+             type: 'https',
+             options: {
+                 pfx: path.join(process.env.HOME, '.symfony5/certs/default.p12'),
+             }
+         }
+     })

Note

Якщо ви використовуєте Node.js 17 або новішу версію і dev-server запускається з помилкою TLS, файл сертифіката міг бути згенерований старою версією symfony-cli. Оновіть symfony-cli до останньої версії, видаліть старий файл ~/.symfony5/certs/default.p12, і запустіть сервер symfony знову.

Це згенерує новий файл default.p12, придатний для використання з останніми версіями Node.js.

Проблеми CORS

Якщо ви стикаєтеся з проблемами, пов'язаними з CORS (Сумісне використання ресурсів між різними джерелами), встановіть наступну опцію:

1
2
3
4
5
6
7
8
9
10
11
// webpack.config.js
// ...

Encore
    // ...

    .configureDevServerOptions(options => {
        options.allowedHosts = 'all';
        // в більш старих версіях Webpack Dev Server, замість цього використайте цю опцію:
        // options.firewall = false;
    })

Пам'ятайте, що в загальній практиці безпеки це не рекомендується, але тут це обов'язково для вирішення проблеми CORS.

Заміна гарячого модуля HMR

Заміна гарячого модуля - це суперсила dev-server, де стилі і (в деяких випадках) JavaScript можуть автоматично оновлюватися без необхідності перезавантаження сторінки. HMR автоматично працює з CSS (якщо ви використовуєте `dev-server`` та Encore 1.0 або новіше), але при цьому працює лише з деякими JavaScript (на кшталт Vue.js).

Перезавантаження в реальному часі при заміні файлів PHP / Twig

Щоб використовувати суперсилу заміни гарячого модуля разом з перезавантаженням у реальному часі для вашого PHP-коду та шаблоныв, встановіть наступні опції:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// webpack.config.js
// ...

Encore
    // ...

    .configureDevServerOptions(options => {
        options.liveReload = true;
        options.static = {
            watch: false
        };
        options.watchFiles = {
            paths: ['src/**/*.php', 'templates/**/*'],
        };
    })

Опція static.watch обовʼязкова, щоб відключити перезавантаження файлів за замовчуванням зі статичного каталогу, так як ці файли вже були оброблені заміною гарячого модуля.

1.0.0

До Encore 1.0, вам потрібно було передавати прапорець --hot у командному рядку для увімкнення HMR. Вам також потрібно було відключати витяг CSS, щоб увімкнути HMR для CSS. Тепер це не потрібно.